added jda utilities dependency

added modmail with some simple features (chat between user and moderator), and initial server selection (currently allows all servers, and does not consider the modmail feature)
added the initial commands, not all of them hold logic currently
added some checks to not crash when a command has null configuration
changed systemconfig to also have a long value, because double is not fit for all cases
added locking mechanism, to effectively lock the whole table without using the ... proper locking mechanism (needs to be reviewed)
changed interface in channel service to be a message channel instead of a textChannel
changed starboard post to be a user in a server instead of only user
This commit is contained in:
Sheldan
2020-05-06 14:17:44 +02:00
parent cf713cc561
commit a06006d763
99 changed files with 1506 additions and 48 deletions

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>dev.sheldan.abstracto.modules</groupId>
<artifactId>utility</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>modmail-int</artifactId>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.templating</groupId>
<artifactId>templating-interface</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,32 @@
package dev.sheldan.abstracto.modmail.models.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_messages")
@Cacheable
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ModMailMessage {
@Id
private Long messageId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_message_author", nullable = false)
private AUserInAServer author;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "threadReference", nullable = false)
private ModMailThread threadReference;
private Boolean anonymous;
}

View File

@@ -0,0 +1,62 @@
package dev.sheldan.abstracto.modmail.models.database;
import dev.sheldan.abstracto.core.models.database.*;
import lombok.*;
import net.dv8tion.jda.api.entities.ChannelType;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "modmail_threads")
@Cacheable
@Getter
@Setter
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ModMailThread {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_user", nullable = false)
private AUserInAServer user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_thread_channel", nullable = false)
private AChannel channel;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "modmail_thread_server", nullable = false)
private AServer server;
@Column
private Instant created;
@Column
private Instant updated;
@Column
private Instant closed;
@OneToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
orphanRemoval = true)
@JoinColumn(name = "threadReference")
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<ModMailMessage> messages = new ArrayList<>();
@Enumerated(EnumType.STRING)
@Column
private ModMailThreadState state;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.modmail.models.database;
public enum ModMailThreadState {
INITIAL, USER_REPLIED, MOD_REPLIED, CLOSED, CLOSING;
public static ModMailThreadState getState(ModMailThreadState type) {
switch (type) {
case INITIAL: return ModMailThreadState.INITIAL;
case USER_REPLIED: return ModMailThreadState.USER_REPLIED;
case CLOSED: return ModMailThreadState.CLOSED;
case CLOSING: return ModMailThreadState.CLOSING;
default:
case MOD_REPLIED: return ModMailThreadState.MOD_REPLIED;
}
}
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.modmail.models.dto;
import dev.sheldan.abstracto.core.models.FullGuild;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class ServerChoice {
private FullGuild guild;
private String reactionEmote;
}

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.modmail.models.template;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Message;
@Getter
@Setter
@Builder
public class ModMailModeratorReplyModel {
private FullUser threadUser;
private FullUser moderator;
private Message postedMessage;
private ModMailThread modMailThread;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.modmail.models.template;
import dev.sheldan.abstracto.modmail.models.dto.ServerChoice;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class ModMailServerChooserModel {
private List<ServerChoice> commonGuilds;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.modmail.models.template;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Message;
@Getter
@Setter
@Builder
public class ModMailUserReplyModel {
private FullUser threadUser;
private Message postedMessage;
private ModMailThread modMailThread;
}

View File

@@ -0,0 +1,22 @@
package dev.sheldan.abstracto.modmail.service;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.TextChannel;
public interface ModMailThreadService {
void createModMailThreadForUser(FullUser userInAServer);
boolean hasOpenThread(AUserInAServer aUserInAServer);
boolean hasOpenThread(AUser user);
void setModMailCategoryTo(AServer server, Long categoryId);
void createModMailPrompt(AUser user, MessageChannel messageChannel);
void sendWelcomeMessage(TextChannel channel, FullUser aUserInAServer);
void relayMessageToModMailThread(ModMailThread modMailThread, Message message);
void relayMessageToDm(ModMailThread modMailThread, Message message);
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.modmail.service.management;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.modmail.models.database.ModMailMessage;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import net.dv8tion.jda.api.entities.Message;
public interface ModMailMessageManagementService {
ModMailMessage addMessageToThread(ModMailThread modMailThread, Message message, AUserInAServer author, Boolean anonymous);
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.abstracto.modmail.service.management;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.modmail.models.database.ModMailThread;
import dev.sheldan.abstracto.modmail.models.database.ModMailThreadState;
import net.dv8tion.jda.api.entities.TextChannel;
import java.util.List;
public interface ModMailThreadManagementService {
ModMailThread getByChannelId(Long channelId);
ModMailThread getByChannel(AChannel channel);
List<ModMailThread> getThreadByUserAndState(AUserInAServer userInAServer, ModMailThreadState state);
ModMailThread getOpenModmailThreadForUser(AUserInAServer userInAServer);
ModMailThread getOpenModmailThreadForUser(AUser user);
List<ModMailThread> getModMailThreadForUser(AUserInAServer aUserInAServer);
void createModMailThread(AUserInAServer userInAServer, AChannel channel);
}