mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-21 05:32:43 +00:00
[AB-57] [AB-61] reworked commands and services to work with completable futures and moved the database operations to the very last operation so we have transaction safety in more areas
added some cache annotations to the default repository functions reworked how the undo cations are processed within commands, they are executed in a post command listener when the state is error added a counter id to generate ids to be unique within servers, changed a few tables to be unique within a server added future utils class for wrapping a list of futures into one moved abstracto tables to separate schema in the installer refactored experience gain to work with more futures and delayed database access
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
package dev.sheldan.abstracto.moderation.exception;
|
||||
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.templating.Templatable;
|
||||
|
||||
public class NoMuteFoundException extends AbstractoRunTimeException implements Templatable {
|
||||
|
||||
public NoMuteFoundException() {
|
||||
super("No mute found for user.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTemplateName() {
|
||||
return "unMute_has_no_active_mute_exception";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getTemplateModel() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ 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 dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import lombok.*;
|
||||
|
||||
import javax.persistence.*;
|
||||
@@ -24,9 +25,13 @@ public class Mute {
|
||||
/**
|
||||
* The globally unique id of the mute.
|
||||
*/
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
@EmbeddedId
|
||||
private ServerSpecificId muteId;
|
||||
|
||||
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
|
||||
@MapsId("serverId")
|
||||
@JoinColumn(name = "server_id", referencedColumnName = "id", nullable = false)
|
||||
private AServer server;
|
||||
|
||||
/**
|
||||
* The {@link AUserInAServer} which was muted
|
||||
@@ -68,13 +73,6 @@ public class Mute {
|
||||
@Column
|
||||
private Long messageId;
|
||||
|
||||
/**
|
||||
* The {@link AServer} in which this mute was cast
|
||||
*/
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "mutingServer", nullable = false)
|
||||
private AServer mutingServer;
|
||||
|
||||
/**
|
||||
* The channel in which this mute was cast
|
||||
*/
|
||||
@@ -109,7 +107,7 @@ public class Mute {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
Mute mute = (Mute) o;
|
||||
return Objects.equals(id, mute.id) &&
|
||||
return Objects.equals(muteId, mute.muteId) &&
|
||||
Objects.equals(mutedUser, mute.mutedUser) &&
|
||||
Objects.equals(mutingUser, mute.mutingUser) &&
|
||||
Objects.equals(reason, mute.reason) &&
|
||||
@@ -117,13 +115,13 @@ public class Mute {
|
||||
Objects.equals(muteTargetDate, mute.muteTargetDate) &&
|
||||
Objects.equals(muteEnded, mute.muteEnded) &&
|
||||
Objects.equals(messageId, mute.messageId) &&
|
||||
Objects.equals(mutingServer, mute.mutingServer) &&
|
||||
Objects.equals(server, mute.server) &&
|
||||
Objects.equals(mutingChannel, mute.mutingChannel) &&
|
||||
Objects.equals(triggerKey, mute.triggerKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(id, mutedUser, mutingUser, reason, muteDate, muteTargetDate, muteEnded, messageId, mutingServer, mutingChannel, triggerKey);
|
||||
return Objects.hash(muteId, mutedUser, mutingUser, reason, muteDate, muteTargetDate, muteEnded, messageId, server, mutingChannel, triggerKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package dev.sheldan.abstracto.moderation.models.database;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import lombok.*;
|
||||
|
||||
@@ -15,9 +17,13 @@ import java.time.Instant;
|
||||
@Setter
|
||||
public class UserNote {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
@EmbeddedId
|
||||
private ServerSpecificId userNoteId;
|
||||
|
||||
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
|
||||
@MapsId("serverId")
|
||||
@JoinColumn(name = "server_id", referencedColumnName = "id", nullable = false)
|
||||
private AServer server;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "noteUser", nullable = false)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package dev.sheldan.abstracto.moderation.models.database;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.ServerSpecificId;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import lombok.*;
|
||||
|
||||
@@ -20,10 +22,15 @@ public class Warning {
|
||||
/**
|
||||
* The globally unique id of this warning
|
||||
*/
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@EmbeddedId
|
||||
@Getter
|
||||
private Long id;
|
||||
@Setter
|
||||
private ServerSpecificId warnId;
|
||||
|
||||
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
|
||||
@MapsId("serverId")
|
||||
@JoinColumn(name = "server_id", referencedColumnName = "id", nullable = false)
|
||||
private AServer server;
|
||||
|
||||
/**
|
||||
* The {@link AUserInAServer} which was warned
|
||||
@@ -93,7 +100,7 @@ public class Warning {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
Warning warning = (Warning) o;
|
||||
return Objects.equals(id, warning.id) &&
|
||||
return Objects.equals(warnId, warning.warnId) &&
|
||||
Objects.equals(warnedUser, warning.warnedUser) &&
|
||||
Objects.equals(warningUser, warning.warningUser) &&
|
||||
Objects.equals(reason, warning.reason) &&
|
||||
@@ -104,6 +111,6 @@ public class Warning {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(id, warnedUser, warningUser, reason, warnDate, decayed, decayDate);
|
||||
return Objects.hash(warnId, warnedUser, warningUser, reason, warnDate, decayed, decayDate);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.moderation.models.template.commands;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
|
||||
import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
@@ -12,15 +12,11 @@ import net.dv8tion.jda.api.entities.Member;
|
||||
@Getter
|
||||
@SuperBuilder
|
||||
@Setter
|
||||
public class KickLogModel extends UserInitiatedServerContext {
|
||||
public class KickLogModel extends SlimUserInitiatedServerContext {
|
||||
/**
|
||||
* The reason of the kick
|
||||
*/
|
||||
private String reason;
|
||||
/**
|
||||
* The member executing the kick
|
||||
*/
|
||||
private Member kickingUser;
|
||||
/**
|
||||
* The member being kicked
|
||||
*/
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
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 dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
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 net.dv8tion.jda.api.entities.MessageChannel;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
|
||||
|
||||
/**
|
||||
@@ -16,7 +18,7 @@ import java.time.Duration;
|
||||
@Getter
|
||||
@SuperBuilder
|
||||
@Setter
|
||||
public class MuteLog extends UserInitiatedServerContext {
|
||||
public class MuteContext {
|
||||
/**
|
||||
* The {@link Member} being muted
|
||||
*/
|
||||
@@ -28,13 +30,19 @@ public class MuteLog extends UserInitiatedServerContext {
|
||||
/**
|
||||
* The persisted mute object from the database containing the information about the mute
|
||||
*/
|
||||
private Mute mute;
|
||||
private Long muteId;
|
||||
private Instant muteDate;
|
||||
private Instant muteTargetDate;
|
||||
private String reason;
|
||||
private ServerChannelMessage context;
|
||||
private MessageChannel contextChannel;
|
||||
private Message message;
|
||||
|
||||
/**
|
||||
* 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(mute.getMuteDate(), mute.getMuteTargetDate());
|
||||
return Duration.between(muteDate, muteTargetDate);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
package dev.sheldan.abstracto.moderation.models.template.commands;
|
||||
|
||||
import dev.sheldan.abstracto.moderation.models.database.Mute;
|
||||
import lombok.Builder;
|
||||
import lombok.Value;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
/**
|
||||
* Used to render the message notification send to the member informing about the mute. The template is: "mute_notification"
|
||||
*/
|
||||
@@ -11,9 +12,10 @@ import lombok.Value;
|
||||
@Builder
|
||||
public class MuteNotification {
|
||||
/**
|
||||
* The persisted mute object from the database containing the information about the mute
|
||||
* The mute context providing the necessary information about the mute
|
||||
*/
|
||||
private Mute mute;
|
||||
private String reason;
|
||||
private Instant muteTargetDate;
|
||||
/**
|
||||
* The name of the server in which the user was muted.
|
||||
*/
|
||||
|
||||
@@ -62,6 +62,6 @@ public class UnMuteLog extends ServerContext {
|
||||
* @return A string containing an URL leading to the message where the mute was triggered
|
||||
*/
|
||||
public String getMessageUrl() {
|
||||
return MessageUtils.buildMessageUrl(this.mute.getMutingServer().getId() ,this.getMute().getMutingChannel().getId(), this.mute.getMessageId());
|
||||
return MessageUtils.buildMessageUrl(this.mute.getServer().getId() ,this.getMute().getMutingChannel().getId(), this.mute.getMessageId());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.sheldan.abstracto.moderation.models.template.commands;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
|
||||
import dev.sheldan.abstracto.core.models.context.SlimUserInitiatedServerContext;
|
||||
import dev.sheldan.abstracto.moderation.models.database.Warning;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -13,7 +13,7 @@ import net.dv8tion.jda.api.entities.Member;
|
||||
@Getter
|
||||
@SuperBuilder
|
||||
@Setter
|
||||
public class WarnLog extends UserInitiatedServerContext {
|
||||
public class WarnContext extends SlimUserInitiatedServerContext {
|
||||
/**
|
||||
* The reason why the warn was cast
|
||||
*/
|
||||
@@ -21,13 +21,9 @@ public class WarnLog extends UserInitiatedServerContext {
|
||||
/**
|
||||
* The {@link Member} being warned
|
||||
*/
|
||||
private Member warnedUser;
|
||||
/**
|
||||
* The {@link Member} casting the warn
|
||||
*/
|
||||
private Member warningUser;
|
||||
private Member warnedMember;
|
||||
/**
|
||||
* The persisted {@link Warning} object from the database containing the information about the warning
|
||||
*/
|
||||
private Warning warning;
|
||||
private Long warnId;
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package dev.sheldan.abstracto.moderation.models.template.commands;
|
||||
|
||||
import dev.sheldan.abstracto.moderation.models.database.Warning;
|
||||
import lombok.Builder;
|
||||
import lombok.Value;
|
||||
|
||||
@@ -11,9 +10,10 @@ import lombok.Value;
|
||||
@Builder
|
||||
public class WarnNotification {
|
||||
/**
|
||||
* The persisted mute object from the database containing the information about the warning
|
||||
* The reason of the warning
|
||||
*/
|
||||
private Warning warning;
|
||||
private String reason;
|
||||
private Long warnId;
|
||||
/**
|
||||
* The name of the server on which the warn was cast
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,9 @@ package dev.sheldan.abstracto.moderation.service;
|
||||
import dev.sheldan.abstracto.core.models.context.ServerContext;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public interface BanService {
|
||||
void banMember(Member member, String reason, ServerContext banLog);
|
||||
void banMember(Long guildId, Long userId, String reason, ServerContext banIdLog);
|
||||
CompletableFuture<Void> banMember(Member member, String reason, ServerContext banLog);
|
||||
CompletableFuture<Void> banMember(Long guildId, Long userId, String reason, ServerContext banIdLog);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package dev.sheldan.abstracto.moderation.service;
|
||||
import dev.sheldan.abstracto.moderation.models.template.commands.KickLogModel;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public interface KickService {
|
||||
void kickMember(Member member, String reason, KickLogModel kickLogModel);
|
||||
CompletableFuture<Void> kickMember(Member member, String reason, KickLogModel kickLogModel);
|
||||
}
|
||||
|
||||
@@ -1,24 +1,26 @@
|
||||
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.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.moderation.models.database.Mute;
|
||||
import dev.sheldan.abstracto.moderation.models.template.commands.MuteLog;
|
||||
import dev.sheldan.abstracto.moderation.models.template.commands.MuteContext;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public interface MuteService {
|
||||
Mute muteMember(Member memberToMute, Member userMuting, String reason, Instant unMuteDate, Message message);
|
||||
Mute muteAUserInAServer(AUserInAServer member, AUserInAServer userMuting, String reason, Instant unMuteDate, Message message);
|
||||
Mute muteUser(FullUserInServer userToMute, FullUserInServer userMuting, String reason, Instant unMuteDate, Message message);
|
||||
void applyMuteRole(AUserInAServer aUserInAServer);
|
||||
void muteMemberWithLog(Member memberToMute, Member memberMuting, String reason, Instant unMuteDate, MuteLog log, Message message);
|
||||
String startUnMuteJobFor(Instant unMuteDate, Mute mute);
|
||||
CompletableFuture<Void> muteMember(Member memberToMute, Member userMuting, String reason, Instant unMuteDate, ServerChannelMessage message);
|
||||
CompletableFuture<Void> muteAUserInAServer(AUserInAServer member, AUserInAServer userMuting, String reason, Instant unMuteDate, ServerChannelMessage message);
|
||||
CompletableFuture<Void> muteUserInServer(FullUserInServer userToMute, FullUserInServer userMuting, String reason, Instant unMuteDate, ServerChannelMessage message);
|
||||
CompletableFuture<Void> applyMuteRole(AUserInAServer aUserInAServer);
|
||||
CompletableFuture<Void> muteMemberWithLog(MuteContext context);
|
||||
String startUnMuteJobFor(Instant unMuteDate, Long muteId, Long serverId);
|
||||
void cancelUnMuteJob(Mute mute);
|
||||
void unMuteUser(Mute mute);
|
||||
void endMute(Long muteId);
|
||||
CompletableFuture<Void> unMuteUser(AUserInAServer aUserInAServer);
|
||||
CompletableFuture<Void> endMute(Mute mute);
|
||||
CompletableFuture<Void> endMute(Long muteId, Long serverId);
|
||||
void completelyUnMuteUser(AUserInAServer aUserInAServer);
|
||||
void completelyUnMuteMember(Member member);
|
||||
}
|
||||
|
||||
@@ -4,9 +4,10 @@ import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public interface SlowModeService {
|
||||
void setSlowMode(TextChannel channel, Duration duration);
|
||||
void disableSlowMode(TextChannel channel);
|
||||
void setSlowMode(AChannel channel, Duration duration);
|
||||
CompletableFuture<Void> setSlowMode(TextChannel channel, Duration duration);
|
||||
CompletableFuture<Void> disableSlowMode(TextChannel channel);
|
||||
CompletableFuture<Void> setSlowMode(AChannel channel, Duration duration);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,17 @@
|
||||
package dev.sheldan.abstracto.moderation.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.models.FullUserInServer;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
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.MessageChannel;
|
||||
import dev.sheldan.abstracto.moderation.models.template.commands.WarnContext;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
|
||||
public interface WarnService {
|
||||
Warning warnUser(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, MessageChannel feedbackChannel);
|
||||
Warning warnMember(Member warnedMember, Member warningMember, String reason, MessageChannel feedbackChannel);
|
||||
Warning warnFullUser(FullUserInServer warnedUser, FullUserInServer warningUser, String reason, MessageChannel feedbackChannel);
|
||||
Warning warnUserWithLog(Member warnedMember, Member warningMember, String reason, WarnLog warnLog, MessageChannel feedbackChannel);
|
||||
CompletableFuture<Void> notifyAndLogFullUserWarning(WarnContext context);
|
||||
CompletableFuture<Void> warnUserWithLog(WarnContext context);
|
||||
void decayWarning(Warning warning, Instant decayDate);
|
||||
void decayWarningsForServer(AServer server);
|
||||
void decayAllWarningsForServer(AServer server, boolean logWarnings);
|
||||
CompletableFuture<Void> decayWarningsForServer(AServer server);
|
||||
CompletableFuture<Void> decayAllWarningsForServer(AServer server, boolean logWarnings);
|
||||
}
|
||||
|
||||
@@ -20,16 +20,18 @@ public interface MuteManagementService {
|
||||
* @param reason The reason why this user is getting muted
|
||||
* @param unMuteDate The date at which the mute should end
|
||||
* @param muteMessage The message containing the command which caused the mute
|
||||
* @param triggerKey The key of the trigger in quartz, if any
|
||||
* @param muteId The id of the mute to create
|
||||
* @return The created mute object containing the mute ID
|
||||
*/
|
||||
Mute createMute(AUserInAServer mutedUser, AUserInAServer mutingUser, String reason, Instant unMuteDate, AServerAChannelMessage muteMessage);
|
||||
Mute createMute(AUserInAServer mutedUser, AUserInAServer mutingUser, String reason, Instant unMuteDate, AServerAChannelMessage muteMessage, String triggerKey, Long muteId);
|
||||
|
||||
/**
|
||||
* Finds the mute from the database by the given ID.
|
||||
* @param muteId The id of the mute to search for
|
||||
* @return An optional containing a {@link Mute} if the ID exists, and null otherwise
|
||||
*/
|
||||
Optional<Mute> findMute(Long muteId);
|
||||
Optional<Mute> findMute(Long muteId, Long serverId);
|
||||
|
||||
/**
|
||||
* Saves the given mute to the database.
|
||||
|
||||
@@ -9,12 +9,12 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public interface WarnManagementService {
|
||||
Warning createWarning(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason);
|
||||
Warning createWarning(AUserInAServer warnedAUser, AUserInAServer warningAUser, String reason, Long warnId);
|
||||
List<Warning> getActiveWarningsInServerOlderThan(AServer server, Instant date);
|
||||
Long getTotalWarnsForUser(AUserInAServer aUserInAServer);
|
||||
List<Warning> getAllWarnsForUser(AUserInAServer aUserInAServer);
|
||||
List<Warning> getAllWarningsOfServer(AServer server);
|
||||
Long getActiveWarnsForUser(AUserInAServer aUserInAServer);
|
||||
Optional<Warning> findById(Long id);
|
||||
Optional<Warning> findById(Long id, Long serverId);
|
||||
void deleteWarning(Warning warn);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user