diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/AnonReply.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/AnonReply.java index 74236b6a5..f0c711f1f 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/AnonReply.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/AnonReply.java @@ -8,12 +8,12 @@ import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureDefinition; -import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.service.MemberService; -import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailThreadService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import org.springframework.beans.factory.annotation.Autowired; @@ -42,18 +42,17 @@ public class AnonReply extends AbstractConditionableCommand { @Autowired private MemberService memberService; - @Autowired - private ChannelManagementService channelManagementService; - @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); // text is optional, for example if only an attachment is sent String text = parameters.size() == 1 ? (String) parameters.get(0) : ""; - AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); - ModMailThread thread = modMailThreadManagementService.getByChannel(channel); - Long threadId = thread.getId(); - return memberService.getMemberInServerAsync(thread.getUser()).thenCompose(member -> + ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } + Long threadId = modMailThread.getId(); + return memberService.getMemberInServerAsync(modMailThread.getUser()).thenCompose(member -> modMailThreadService.loadExecutingMemberAndRelay(threadId, text, commandContext.getMessage(), true, member) ).thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Close.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Close.java index afd4967e6..a67b52ab2 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Close.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Close.java @@ -11,13 +11,13 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.interaction.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; -import dev.sheldan.abstracto.core.models.database.AChannel; -import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; import dev.sheldan.abstracto.modmail.config.ModMailSlashCommandNames; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.ClosingContext; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailThreadService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import dev.sheldan.abstracto.core.templating.service.TemplateService; @@ -59,9 +59,6 @@ public class Close extends AbstractConditionableCommand { @Autowired private TemplateService templateService; - @Autowired - private ChannelManagementService channelManagementService; - @Autowired private InteractionService interactionService; @@ -76,8 +73,10 @@ public class Close extends AbstractConditionableCommand { List parameters = commandContext.getParameters().getParameters(); // the default value of the note is configurable via template String note = parameters.size() == 1 ? (String) parameters.get(0) : templateService.renderTemplate(MODMAIL_CLOSE_DEFAULT_NOTE_TEMPLATE_KEY, new Object()); - AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); - ModMailThread thread = modMailThreadManagementService.getByChannel(channel); + ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } ClosingContext context = ClosingContext .builder() .closingMember(commandContext.getAuthor()) @@ -86,7 +85,7 @@ public class Close extends AbstractConditionableCommand { .log(true) .note(note) .build(); - return modMailThreadService.closeModMailThread(thread, context, commandContext.getUndoActions()) + return modMailThreadService.closeModMailThread(modMailThread, context, commandContext.getUndoActions()) .thenApply(aVoid -> CommandResult.fromIgnored()); } @@ -125,9 +124,11 @@ public class Close extends AbstractConditionableCommand { @Transactional public CompletableFuture closeThread(ClosingContext closingContext) { - AChannel channel = channelManagementService.loadChannel(closingContext.getChannel()); - ModMailThread thread = modMailThreadManagementService.getByChannel(channel); - return modMailThreadService.closeModMailThread(thread, closingContext, new ArrayList<>()); + ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(closingContext.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } + return modMailThreadService.closeModMailThread(modMailThread, closingContext, new ArrayList<>()); } @Override diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/CloseSilently.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/CloseSilently.java index a42b0409c..3b260da2f 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/CloseSilently.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/CloseSilently.java @@ -8,12 +8,12 @@ import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureDefinition; -import dev.sheldan.abstracto.core.models.database.AChannel; -import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.ClosingContext; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailThreadService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import dev.sheldan.abstracto.core.templating.service.TemplateService; @@ -43,16 +43,15 @@ public class CloseSilently extends AbstractConditionableCommand { @Autowired private TemplateService templateService; - @Autowired - private ChannelManagementService channelManagementService; - @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); // default note text is configurable via template, because the note is optional String note = parameters.size() == 1 ? (String) parameters.get(0) : templateService.renderTemplate("modmail_close_default_note", new Object()); - AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); - ModMailThread thread = modMailThreadManagementService.getByChannel(channel); + ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } ClosingContext context = ClosingContext .builder() .closingMember(commandContext.getAuthor()) @@ -60,7 +59,7 @@ public class CloseSilently extends AbstractConditionableCommand { .log(true) .note(note) .build(); - return modMailThreadService.closeModMailThread(thread, context, commandContext.getUndoActions()) + return modMailThreadService.closeModMailThread(modMailThread, context, commandContext.getUndoActions()) .thenApply(aVoid -> CommandResult.fromIgnored()); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Reply.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Reply.java index 680e6986e..c536b070b 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Reply.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Reply.java @@ -8,12 +8,12 @@ import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureDefinition; -import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.service.MemberService; -import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailThreadService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import org.springframework.beans.factory.annotation.Autowired; @@ -41,17 +41,16 @@ public class Reply extends AbstractConditionableCommand { @Autowired private MemberService memberService; - @Autowired - private ChannelManagementService channelManagementService; - @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); String text = parameters.size() == 1 ? (String) parameters.get(0) : ""; - AChannel channel = channelManagementService.loadChannel(commandContext.getChannel()); - ModMailThread thread = modMailThreadManagementService.getByChannel(channel); - Long threadId = thread.getId(); - return memberService.getMemberInServerAsync(thread.getUser()).thenCompose(member -> + ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } + Long threadId = modMailThread.getId(); + return memberService.getMemberInServerAsync(modMailThread.getUser()).thenCompose(member -> modMailThreadService.loadExecutingMemberAndRelay(threadId, text, commandContext.getMessage(), false, member) ).thenApply(aVoid -> CommandResult.fromSuccess()); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Subscribe.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Subscribe.java index 51d285816..b03a74e37 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Subscribe.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/Subscribe.java @@ -5,7 +5,6 @@ import dev.sheldan.abstracto.core.command.condition.CommandCondition; import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig; -import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; @@ -13,7 +12,9 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; import dev.sheldan.abstracto.modmail.config.ModMailSlashCommandNames; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailSubscriptionService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; @@ -49,16 +50,12 @@ public class Subscribe extends AbstractConditionableCommand { @Autowired private InteractionService interactionService; - @Override - public CommandResult execute(CommandContext commandContext) { - ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); - modMailSubscriptionService.subscribeToThread(userInServerManagementService.loadOrCreateUser(commandContext.getAuthor()), modMailThread); - return CommandResult.fromSuccess(); - } - @Override public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(event.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } modMailSubscriptionService.subscribeToThread(userInServerManagementService.loadOrCreateUser(event.getMember()), modMailThread); return interactionService.replyEmbed(SUBSCRIBE_RESPONSE, event) .thenApply(interactionHook -> CommandResult.fromSuccess()); @@ -83,6 +80,7 @@ public class Subscribe extends AbstractConditionableCommand { .slashCommandConfig(slashCommandConfig) .module(ModMailModuleDefinition.MODMAIL) .help(helpInfo) + .slashCommandOnly(true) .supportsEmbedException(true) .templated(true) .causesReaction(true) diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/UnSubscribe.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/UnSubscribe.java index c8e12843d..8312b2c11 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/UnSubscribe.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/command/UnSubscribe.java @@ -5,7 +5,6 @@ import dev.sheldan.abstracto.core.command.condition.CommandCondition; import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.interaction.slash.SlashCommandConfig; -import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.config.FeatureDefinition; import dev.sheldan.abstracto.core.interaction.InteractionService; @@ -14,7 +13,9 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi import dev.sheldan.abstracto.modmail.condition.ModMailContextCondition; import dev.sheldan.abstracto.modmail.config.ModMailFeatureDefinition; import dev.sheldan.abstracto.modmail.config.ModMailSlashCommandNames; +import dev.sheldan.abstracto.modmail.exception.ModMailThreadClosedException; import dev.sheldan.abstracto.modmail.model.database.ModMailThread; +import dev.sheldan.abstracto.modmail.model.database.ModMailThreadState; import dev.sheldan.abstracto.modmail.service.ModMailSubscriptionService; import dev.sheldan.abstracto.modmail.service.management.ModMailThreadManagementService; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; @@ -50,17 +51,12 @@ public class UnSubscribe extends AbstractConditionableCommand { @Autowired private InteractionService interactionService; - @Override - public CommandResult execute(CommandContext commandContext) { - ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(commandContext.getChannel().getIdLong()); - AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(commandContext.getAuthor()); - modMailSubscriptionService.unsubscribeFromThread(aUserInAServer, modMailThread); - return CommandResult.fromSuccess(); - } - @Override public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { ModMailThread modMailThread = modMailThreadManagementService.getByChannelId(event.getChannel().getIdLong()); + if(ModMailThreadState.CLOSED.equals(modMailThread.getState()) || ModMailThreadState.CLOSING.equals(modMailThread.getState())) { + throw new ModMailThreadClosedException(); + } AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(event.getMember()); modMailSubscriptionService.unsubscribeFromThread(aUserInAServer, modMailThread); return interactionService.replyEmbed(UN_SUBSCRIBE_RESPONSE, event) @@ -86,6 +82,7 @@ public class UnSubscribe extends AbstractConditionableCommand { .slashCommandConfig(slashCommandConfig) .module(ModMailModuleDefinition.MODMAIL) .help(helpInfo) + .slashCommandOnly(true) .supportsEmbedException(true) .templated(true) .causesReaction(true) diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/exception/ModMailThreadClosedException.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/exception/ModMailThreadClosedException.java new file mode 100644 index 000000000..db152c07b --- /dev/null +++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/exception/ModMailThreadClosedException.java @@ -0,0 +1,22 @@ + +package dev.sheldan.abstracto.modmail.exception; + +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; +import dev.sheldan.abstracto.core.templating.Templatable; + +public class ModMailThreadClosedException extends AbstractoRunTimeException implements Templatable { + + public ModMailThreadClosedException() { + super("Mod mail thread closed"); + } + + @Override + public String getTemplateName() { + return "modmail_thread_closed_exception"; + } + + @Override + public Object getTemplateModel() { + return new Object(); + } +}