added Arole to command received handler in order to handle it

restructured channel service calls a little bit
moved dm sending to message service
fixed log level configuration
added full user dto, to be used as a combination of a AUserInServer and Member, for operations which need both, to avoid converting and reloading the user
added mute command and mute role command
added mute table
added mute role table
added job to automatically unmute people at the given time period
restructured warn service
removed simple message log for warnings
added method to templating to support formatting instants
This commit is contained in:
Sheldan
2020-04-24 18:02:05 +02:00
parent cf37d4adef
commit b41a596acd
44 changed files with 1032 additions and 69 deletions

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.moderation.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
public class MuteException extends AbstractoRunTimeException {
public MuteException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,50 @@
package dev.sheldan.abstracto.moderation.models.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name="mute")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Mute {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "mutedUser", nullable = false)
private AUserInAServer mutedUser;
@ManyToOne
@JoinColumn(name = "mutingUser", nullable = false)
private AUserInAServer mutingUser;
private String reason;
private Instant muteDate;
private Instant muteTargetDate;
@Column
private Long messageId;
@ManyToOne
@JoinColumn(name = "mutingServer", nullable = false)
private AServer mutingServer;
@ManyToOne
@JoinColumn(name = "mutingChannel")
private AChannel mutingChannel;
}

View File

@@ -0,0 +1,43 @@
package dev.sheldan.abstracto.moderation.models.database;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import javax.persistence.*;
/**
* Represents a role to be used for muting users on a certain server
*/
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "mute_role")
@Getter
@Setter
public class MuteRole {
/**
* The abstracto unique id of this mute role.
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* Reference to the {@link AServer} at which this role is used as an mute role.
*/
@ManyToOne(fetch = FetchType.LAZY)
@Getter
@Setter
@JoinColumn(name = "server_id", nullable = false)
private AServer roleServer;
/**
* Reference to the actual {@link ARole} being used to mute.
*/
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", nullable = false)
private ARole role;
}

View File

@@ -6,7 +6,9 @@ import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
@Getter @SuperBuilder @Setter
@Getter
@SuperBuilder
@Setter
public class BanIdLog extends UserInitiatedServerContext {
private String reason;
private Member banningUser;

View File

@@ -6,7 +6,9 @@ import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
@Getter @SuperBuilder @Setter
@Getter
@SuperBuilder
@Setter
public class BanLog extends UserInitiatedServerContext {
private String reason;

View File

@@ -6,7 +6,9 @@ import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
@Getter @SuperBuilder @Setter
@Getter
@SuperBuilder
@Setter
public class KickLogModel extends UserInitiatedServerContext {
private String reason;
private Member kickingUser;

View File

@@ -0,0 +1,27 @@
package dev.sheldan.abstracto.moderation.models.template.commands;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import dev.sheldan.abstracto.moderation.models.database.Mute;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import java.time.Duration;
@Getter
@SuperBuilder
@Setter
public class MuteLog extends UserInitiatedServerContext {
private Member mutedUser;
private Member mutingUser;
private Message message;
private Mute mute;
public Duration getMuteDuration() {
return Duration.between(mute.getMuteDate(), mute.getMuteTargetDate());
}
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.models.template.commands;
import dev.sheldan.abstracto.moderation.models.database.Mute;
import lombok.Builder;
import lombok.Value;
@Value
@Builder
public class MuteNotification {
private Mute mute;
private String serverName;
}

View File

@@ -0,0 +1,31 @@
package dev.sheldan.abstracto.moderation.models.template.commands;
import dev.sheldan.abstracto.core.models.context.ServerContext;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import dev.sheldan.abstracto.moderation.models.database.Mute;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import java.time.Duration;
@Getter
@SuperBuilder
@Setter
@NoArgsConstructor
public class UnMuteLog extends ServerContext {
private Member unMutedUser;
private Member mutingUser;
private Mute mute;
public Duration getMuteDuration() {
return Duration.between(mute.getMuteDate(), mute.getMuteTargetDate());
}
public String getMessageUrl() {
return MessageUtils.buildMessageUrl(this.mute.getMutingServer().getId() ,this.getMute().getMutingChannel().getId(), this.mute.getMessageId());
}
}

View File

@@ -8,8 +8,9 @@ import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
@Getter @SuperBuilder @Setter
@Getter
@SuperBuilder
@Setter
public class WarnLog extends UserInitiatedServerContext {
private String reason;

View File

@@ -4,7 +4,8 @@ import dev.sheldan.abstracto.moderation.models.database.Warning;
import lombok.Builder;
import lombok.Value;
@Value @Builder
@Value
@Builder
public class WarnNotification {
private Warning warning;
private String serverName;

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.models.database.Mute;
import dev.sheldan.abstracto.moderation.models.template.commands.MuteLog;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import java.time.Instant;
public interface MuteService {
Mute muteMember(Member memberToMute, Member userMuting, String reason, Instant unmuteDate, Message message);
Mute muteMember(AUserInAServer member, AUserInAServer userMuting, String reason, Instant unmuteDate, Message message);
Mute muteUser(FullUser userToMute, FullUser userMuting, String reason, Instant unmuteDate, Message message);
void muteMemberWithLog(Member memberToMute, Member memberMuting, String reason, Instant unmuteDate, MuteLog log, Message message);
void startUnmuteJobFor(Instant unmuteDate, Mute mute);
void unmuteUser(Mute mute);
void endMute(Long muteId);
}

View File

@@ -1,11 +1,16 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.FullUser;
import dev.sheldan.abstracto.moderation.models.database.Warning;
import dev.sheldan.abstracto.moderation.models.template.commands.WarnLog;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
public interface WarnService {
void warnUser(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, WarnLog warnLog);
void warnUser(Member warnedUser, Member warningUser, String reason, WarnLog warnLog);
Warning warnUser(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, TextChannel feedbackChannel);
Warning warnUser(Member warnedMember, Member warningMember, String reason, TextChannel feedbackChannel);
Warning warnUser(FullUser warnedUser, FullUser warningUser, String reason, TextChannel feedbackChannel);
void warnUserWithLog(Member warnedMember, Member warningMember, String reason, WarnLog warnLog, TextChannel feedbackChannel);
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.AServerAChannelMessage;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.models.database.Mute;
import java.time.Instant;
public interface MuteManagementService {
Mute createMute(AUserInAServer aUserInAServer, AUserInAServer mutingUser, String reason, Instant unmuteDate, AServerAChannelMessage creation);
Mute findMute(Long muteId);
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.moderation.models.database.MuteRole;
import java.util.List;
public interface MuteRoleManagementService {
MuteRole retrieveMuteRoleForServer(AServer server);
MuteRole createMuteRoleForServer(AServer server, ARole role);
List<MuteRole> retrieveMuteRolesForServer(AServer server);
MuteRole setMuteRoleForServer(AServer server, ARole role);
boolean muteRoleForServerExists(AServer server);
}