[AB-111] adding ability to perform moderation actions on various logging/report messages

This commit is contained in:
Sheldan
2024-03-17 12:37:30 +01:00
parent f45721ba42
commit dbf5d99622
76 changed files with 1663 additions and 648 deletions

View File

@@ -38,6 +38,6 @@ public class ReportReactionFeatureConfig implements FeatureConfig {
@Override
public List<FeatureMode> getAvailableModes() {
return Arrays.asList(ReportReactionMode.SINGULAR_MESSAGE, ReportReactionMode.ANONYMOUS);
return Arrays.asList(ReportReactionMode.values());
}
}

View File

@@ -42,6 +42,6 @@ public class WarningDecayFeatureConfig implements FeatureConfig {
@Override
public List<FeatureMode> getAvailableModes() {
return Arrays.asList(WarnDecayMode.AUTOMATIC_WARN_DECAY_LOG);
return Arrays.asList(WarnDecayMode.values());
}
}

View File

@@ -37,7 +37,7 @@ public class WarningFeatureConfig implements FeatureConfig {
@Override
public List<FeatureMode> getAvailableModes() {
return Arrays.asList(WarningMode.WARN_DECAY_LOG);
return Arrays.asList(WarningMode.values());
}
@Override

View File

@@ -5,7 +5,7 @@ import lombok.Getter;
@Getter
public enum ReportReactionMode implements FeatureMode {
SINGULAR_MESSAGE("singularReportReactions"), ANONYMOUS("anonymousReportReactions");
SINGULAR_MESSAGE("singularReportReactions"), ANONYMOUS("anonymousReportReactions"), REPORT_ACTIONS("reactionReportActions");
private final String key;

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.moderation.model;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModerationActionButton {
private String componentId;
private String action;
}

View File

@@ -0,0 +1,6 @@
package dev.sheldan.abstracto.moderation.model;
public enum MuteResult {
NOTIFICATION_FAILED, SUCCESSFUL
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.model.interaction;
import dev.sheldan.abstracto.core.interaction.modal.ModalPayload;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModerationActionBanPayload implements ModalPayload {
private String modalId;
private String reasonInputId;
private String durationInputId;
private Long serverId;
private Long bannedUserId;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.moderation.model.interaction;
import dev.sheldan.abstracto.core.interaction.modal.ModalPayload;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModerationActionKickPayload implements ModalPayload {
private String modalId;
private String reasonInputId;
private Long serverId;
private Long kickedUserId;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.moderation.model.interaction;
import dev.sheldan.abstracto.core.interaction.modal.ModalPayload;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModerationActionMutePayload implements ModalPayload {
private String modalId;
private String reasonInputId;
private String durationInputId;
private Long serverId;
private Long mutedUserId;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.moderation.model.interaction;
import dev.sheldan.abstracto.core.interaction.modal.ModalPayload;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class ModerationActionWarnPayload implements ModalPayload {
private String modalId;
private String reasonInputId;
private Long serverId;
private Long warnedUserId;
}

View File

@@ -1,11 +1,10 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
import java.time.Duration;
@@ -24,11 +23,10 @@ public class BanLog {
/**
* The member executing the ban
*/
private Member banningMember;
private MemberDisplay banningMember;
/**
* The user being banned
*/
private User bannedUser;
private Message commandMessage;
private UserDisplay bannedUser;
private Duration deletionDuration;
}

View File

@@ -1,11 +1,9 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
/**
* Used when rendering the notification when a member was kicked. The template is: "kick_log_embed"
@@ -14,15 +12,7 @@ import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
@Builder
@Setter
public class KickLogModel {
/**
* The reason of the kick
*/
private String reason;
/**
* The member being kicked
*/
private Member kickedUser;
private Member member;
private Guild guild;
private GuildMessageChannel channel;
private MemberDisplay kickedMember;
private MemberDisplay kickingMember;
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
@@ -13,27 +14,19 @@ public class MuteListenerModel {
/**
* The {@link Member} being muted
*/
private Member mutedUser;
private MemberDisplay mutedUser;
/**
* The {@link Member} executing the mute
*/
private Member mutingUser;
private MemberDisplay mutingUser;
/**
* The persisted mute object from the database containing the information about the mute
*/
private Long muteId;
private Instant muteTargetDate;
private Instant oldMuteTargetDate;
private Duration duration;
private String reason;
private Long channelId;
/**
* The {@link Duration} of the mute between the mute was cast and and the date it should end
* @return The {@link Duration} between start and target date
*/
public Duration getMuteDuration() {
return Duration.between(Instant.now(), muteTargetDate);
}
public boolean getMuteEnded() {
return oldMuteTargetDate != null && muteTargetDate == null || oldMuteTargetDate == null && muteTargetDate == null;

View File

@@ -1,12 +1,10 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.models.template.display.UserDisplay;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
/**
* Used when rendering the notification when a member was banned. The template is: "ban_log_embed"
@@ -18,10 +16,9 @@ public class UnBanLog {
/**
* The member executing the unban
*/
private Member unBanningMember;
private MemberDisplay unBanningMember;
/**
* The user being unbanned
*/
private User bannedUser;
private Message commandMessage;
private UserDisplay bannedUser;
}

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.context.ServerContext;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import dev.sheldan.abstracto.core.utils.MessageUtils;
import dev.sheldan.abstracto.moderation.model.database.Mute;
import lombok.AllArgsConstructor;
@@ -8,7 +8,6 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Member;
import java.time.Duration;
import java.time.Instant;
@@ -21,15 +20,15 @@ import java.time.Instant;
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UnMuteLog extends ServerContext {
public class UnMuteLog {
/**
* The un-muted Member, is null if the member left the server
*/
private Member unMutedUser;
private MemberDisplay unMutedUser;
/**
* The user casting the mute, is null if the member left the server
*/
private Member mutingUser;
private MemberDisplay mutingUser;
/**
* The persisted mute object from the database containing the information about the mute
*/

View File

@@ -1,36 +0,0 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.moderation.model.database.Warning;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
/**
* Used when rendering the notification when a member was warned. The template is: "warn_log_embed"
*/
@Getter
@Builder
@Setter
public class WarnContext {
/**
* The reason why the warn was cast
*/
private String reason;
/**
* The {@link Member} being warned
*/
private Member warnedMember;
/**
* The persisted {@link Warning} object from the database containing the information about the warning
*/
private Long warnId;
private Long infractionId;
private Member member;
private Guild guild;
private Message message;
private GuildMessageChannel channel;
}

View File

@@ -0,0 +1,29 @@
package dev.sheldan.abstracto.moderation.model.template.command;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
/**
* Used when rendering the notification when a member was warned. The template is: "warn_log_embed"
*/
@Getter
@Builder
@Setter
public class WarnLogModel {
/**
* The reason why warn was cast
*/
private String reason;
/**
* The {@link Member} being warned
*/
private MemberDisplay warnedMember;
private Long warnId;
private Long infractionId;
private MemberDisplay warningMember;
private ServerChannelMessage channelMessage;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class ModerationActionBanModalModel {
private String modalId;
private String reasonComponentId;
private String durationComponentId;
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class ModerationActionKickModalModel {
private String modalId;
private String reasonComponentId;
}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class ModerationActionMuteModalModel {
private String modalId;
private String reasonComponentId;
private String durationComponentId;
}

View File

@@ -0,0 +1,23 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import dev.sheldan.abstracto.core.interaction.button.ButtonPayload;
import dev.sheldan.abstracto.core.models.ServerUser;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class ModerationActionPayloadModel implements ButtonPayload {
private String action;
private ServerUser user;
public static ModerationActionPayloadModel forAction(String action, ServerUser user) {
return ModerationActionPayloadModel
.builder()
.user(user)
.action(action)
.build();
}
}

View File

@@ -0,0 +1,11 @@
package dev.sheldan.abstracto.moderation.model.template.listener;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class ModerationActionWarnModalModel {
private String modalId;
private String reasonComponentId;
}

View File

@@ -2,10 +2,13 @@ package dev.sheldan.abstracto.moderation.model.template.listener;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
import dev.sheldan.abstracto.moderation.model.ModerationActionButton;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
@@ -15,4 +18,5 @@ public class ReportReactionNotificationModel {
private Integer reportCount;
private String context;
private Boolean singularMessage;
private List<ModerationActionButton> moderationActionComponents;
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.moderation.model.BanResult;
import net.dv8tion.jda.api.entities.*;
@@ -10,9 +11,9 @@ public interface BanService {
String BAN_EFFECT_KEY = "ban";
String BAN_INFRACTION_TYPE = "ban";
String INFRACTION_PARAMETER_DELETION_DURATION_KEY = "DELETION_DURATION";
CompletableFuture<BanResult> banUserWithNotification(User user, String reason, Member banningMember, Duration deletionDuration);
CompletableFuture<Void> unBanUserWithNotification(User user, Member unBanningUser);
CompletableFuture<Void> banUser(Guild guild, User user, Duration deletionDuration, String reason);
CompletableFuture<Void> unbanUser(Guild guild, User user);
CompletableFuture<Void> softBanUser(Guild guild, User user, Duration delDays);
CompletableFuture<BanResult> banUserWithNotification(ServerUser userToBeBanned, String reason, ServerUser banningUser, Guild guild, Duration deletionDuration);
CompletableFuture<Void> unBanUserWithNotification(Long userId, ServerUser unBanningMember, Guild guild);
CompletableFuture<Void> banUser(Guild guild, ServerUser userToBeBanned, Duration deletionDuration, String reason);
CompletableFuture<Void> unbanUser(Guild guild, Long userId);
CompletableFuture<Void> softBanUser(Guild guild, ServerUser user, Duration delDays);
}

View File

@@ -1,6 +1,7 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.moderation.model.template.command.KickLogModel;
import dev.sheldan.abstracto.core.models.ServerUser;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import java.util.concurrent.CompletableFuture;
@@ -8,5 +9,6 @@ import java.util.concurrent.CompletableFuture;
public interface KickService {
String KICK_EFFECT_KEY = "kick";
String KICK_INFRACTION_TYPE = "kick";
CompletableFuture<Void> kickMember(Member member, String reason, KickLogModel kickLogModel);
CompletableFuture<Void> kickMember(Member kickedMember, Member kickingMember, String reason);
CompletableFuture<Void> kickMember(Guild guild, ServerUser kickedUser, String reason, ServerUser kickingUser);
}

View File

@@ -0,0 +1,10 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.moderation.model.ModerationActionButton;
import java.util.List;
public interface ModerationActionService {
List<ModerationActionButton> getModerationActionButtons(ServerUser serverUser);
}

View File

@@ -1,11 +1,13 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.FullUserInServer;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.moderation.model.MuteResult;
import dev.sheldan.abstracto.moderation.model.database.Mute;
import dev.sheldan.abstracto.moderation.model.template.command.MuteContext;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Guild;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
@@ -13,14 +15,13 @@ public interface MuteService {
String MUTE_EFFECT_KEY = "mute";
String MUTE_INFRACTION_TYPE = "mute";
String INFRACTION_PARAMETER_DURATION_KEY = "DURATION";
CompletableFuture<Void> muteMember(Member memberToMute, String reason, Instant unMuteDate, Long channelId);
CompletableFuture<Void> muteUserInServer(FullUserInServer userToMute, String reason, Instant unMuteDate, Long channelId);
CompletableFuture<Void> muteMemberWithLog(MuteContext context);
CompletableFuture<MuteResult> muteUserInServer(Guild guild, ServerUser userBeingMuted, String reason, Duration duration);
CompletableFuture<MuteResult> muteMemberWithLog(ServerUser userToMute, ServerUser mutingUser, String reason, Duration duration, Guild guild, ServerChannelMessage origin);
String startUnMuteJobFor(Instant unMuteDate, Long muteId, Long serverId);
void cancelUnMuteJob(Mute mute);
CompletableFuture<Void> unMuteUser(AUserInAServer userToUnmute, Member memberUnMuting);
CompletableFuture<Void> endMute(Mute mute);
CompletableFuture<Void> unMuteUser(ServerUser userToUnMute, ServerUser memberUnMuting, Guild guild);
CompletableFuture<Void> endMute(Mute mute, Guild guild);
CompletableFuture<Void> endMute(Long muteId, Long serverId);
void completelyUnMuteUser(AUserInAServer aUserInAServer);
void completelyUnMuteMember(Member member);
void completelyUnMuteMember(ServerUser serverUser);
}

View File

@@ -1,8 +1,10 @@
package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.moderation.model.database.Warning;
import dev.sheldan.abstracto.moderation.model.template.command.WarnContext;
import net.dv8tion.jda.api.entities.Guild;
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
@@ -11,8 +13,7 @@ import java.util.concurrent.CompletableFuture;
public interface WarnService {
String WARN_EFFECT_KEY = "warn";
String WARN_INFRACTION_TYPE = "warn";
CompletableFuture<Void> notifyAndLogFullUserWarning(WarnContext context);
CompletableFuture<Void> warnUserWithLog(WarnContext context);
CompletableFuture<Void> warnUserWithLog(Guild guild, ServerUser warnedUser, ServerUser warningUser, String reason, ServerChannelMessage serverChannelMessage);
void decayWarning(Warning warning, Instant decayDate);
CompletableFuture<Void> decayWarningsForServer(AServer server);
CompletableFuture<Void> decayAllWarningsForServer(AServer server);