From 5fbc012afaa07f62719b0ec6a34bbfcbdec5e1a6 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Thu, 16 Jun 2022 19:30:54 +0200 Subject: [PATCH] [RAB-2] adding slash commands to quote comands --- .../module/quotes/command/QuoteCommand.java | 72 ++++++++++++++++--- .../module/quotes/command/QuoteDelete.java | 48 ++++++++++++- .../sissi/module/quotes/command/QuoteGet.java | 68 ++++++++++++++---- .../module/quotes/command/QuoteSearch.java | 67 ++++++++++++++--- .../module/quotes/command/QuoteStats.java | 41 +++++++++-- .../quotes/config/QuoteSlashCommandNames.java | 6 ++ .../quoteDelete_response_embed_en_US.ftl | 6 ++ .../quoteDelete_response_text_en_US.ftl | 1 + 8 files changed, 268 insertions(+), 41 deletions(-) create mode 100644 application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/config/QuoteSlashCommandNames.java create mode 100644 templates/sissi-templates/module-templates/quotes-templates/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_embed_en_US.ftl create mode 100644 templates/sissi-translations/module-translations/quote-translations/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_text_en_US.ftl diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteCommand.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteCommand.java index 7d387386..a0ccfee3 100644 --- a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteCommand.java +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteCommand.java @@ -4,9 +4,12 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.config.SlashCommandConfig; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.service.ChannelService; @@ -14,6 +17,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.sissi.module.quotes.config.QuoteSlashCommandNames; import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition; import dev.sheldan.sissi.module.quotes.config.QuotesModuleDefinition; import dev.sheldan.sissi.module.quotes.exception.QuoteNotFoundException; @@ -21,6 +25,8 @@ import dev.sheldan.sissi.module.quotes.model.database.Quote; import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.MessageChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.InteractionHook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -33,6 +39,9 @@ import java.util.concurrent.CompletableFuture; @Component public class QuoteCommand extends AbstractConditionableCommand { + private static final String QUOTE_COMMAND = "quote"; + private static final String MEMBER_PARAMETER = "member"; + @Autowired private QuoteServiceBean quoteServiceBean; @@ -48,6 +57,11 @@ public class QuoteCommand extends AbstractConditionableCommand { @Autowired private QuoteCommand self; + @Autowired + private SlashCommandParameterService slashCommandParameterService; + + @Autowired + private InteractionService interactionService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { @@ -61,14 +75,10 @@ public class QuoteCommand extends AbstractConditionableCommand { AUserInAServer user = userInServerManagementService.loadOrCreateUser(targetMember); foundQuote = quoteServiceBean.getRandomQuoteForMember(user); } - if(foundQuote.isPresent()) { - Quote quoteToDisplay = foundQuote.get(); - return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) - .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) - .thenApply(unused -> CommandResult.fromSuccess()); - } else { - throw new QuoteNotFoundException(); - } + Quote quoteToDisplay = foundQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) + .thenApply(unused -> CommandResult.fromSuccess()); } @Transactional @@ -76,15 +86,55 @@ public class QuoteCommand extends AbstractConditionableCommand { return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, messageChannel)); } + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + Optional foundQuote; + if(slashCommandParameterService.hasCommandOption(MEMBER_PARAMETER, event)) { + Member targetMember = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER, event, Member.class); + AUserInAServer user = userInServerManagementService.loadOrCreateUser(targetMember); + foundQuote = quoteServiceBean.getRandomQuoteForMember(user); + } else { + AServer server = serverManagementService.loadServer(event.getGuild().getIdLong()); + foundQuote = quoteServiceBean.getRandomQuote(server); + } + Quote quoteToDisplay = foundQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.replyMessage(event, messageToSend)) + .thenApply(unused -> CommandResult.fromSuccess()); + } + + @Transactional + public CompletableFuture replyMessage(SlashCommandInteractionEvent event, MessageToSend messageToSend) { + return interactionService.replyMessageToSend(messageToSend, event); + } + @Override public CommandConfiguration getConfiguration() { - Parameter memberParameter = Parameter.builder().templated(true).name("member").type(Member.class).optional(true).build(); + Parameter memberParameter = Parameter + .builder() + .templated(true) + .name(MEMBER_PARAMETER) + .type(Member.class) + .optional(true) + .build(); + + SlashCommandConfig slashCommandConfig = SlashCommandConfig + .builder() + .enabled(true) + .rootCommandName(QuoteSlashCommandNames.QUOTE) + .commandName("random") + .build(); + List parameters = Collections.singletonList(memberParameter); - HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); return CommandConfiguration.builder() - .name("quote") + .name(QUOTE_COMMAND) .module(QuotesModuleDefinition.QUOTES) .templated(true) + .slashCommandConfig(slashCommandConfig) .async(true) .supportsEmbedException(true) .causesReaction(false) diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteDelete.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteDelete.java index a580200e..3f485816 100644 --- a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteDelete.java +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteDelete.java @@ -4,29 +4,45 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.config.SlashCommandConfig; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import dev.sheldan.sissi.module.quotes.config.QuoteSlashCommandNames; import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition; import dev.sheldan.sissi.module.quotes.config.QuotesModuleDefinition; import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Collections; import java.util.List; +import java.util.concurrent.CompletableFuture; @Component public class QuoteDelete extends AbstractConditionableCommand { + private static final String QUOTE_DELETE_COMMAND = "quoteDelete"; + private static final String QUOTE_ID_PARAMETER = "quoteId"; + private static final String QUOTE_DELETE_RESPONSE = "quoteDelete_response"; + @Autowired private ServerManagementService serverManagementService; @Autowired private QuoteServiceBean quoteServiceBean; + @Autowired + private InteractionService interactionService; + + @Autowired + private SlashCommandParameterService slashCommandParameterService; + @Override public CommandResult execute(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -36,15 +52,41 @@ public class QuoteDelete extends AbstractConditionableCommand { return CommandResult.fromSuccess(); } + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + Long quoteId = slashCommandParameterService.getCommandOption(QUOTE_ID_PARAMETER, event, Integer.class).longValue(); + AServer server = serverManagementService.loadServer(event.getGuild().getIdLong()); + quoteServiceBean.deleteQuote(quoteId, server); + return interactionService.replyEmbed(QUOTE_DELETE_RESPONSE, event) + .thenApply(interactionHook -> CommandResult.fromSuccess()); + } + @Override public CommandConfiguration getConfiguration() { - Parameter quoteIdParameter = Parameter.builder().templated(true).name("quoteId").type(Long.class).build(); + Parameter quoteIdParameter = Parameter + .builder() + .templated(true) + .name(QUOTE_ID_PARAMETER) + .type(Long.class) + .build(); List parameters = Collections.singletonList(quoteIdParameter); - HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); + + SlashCommandConfig slashCommandConfig = SlashCommandConfig + .builder() + .enabled(true) + .rootCommandName(QuoteSlashCommandNames.QUOTE_INTERNAL) + .commandName("delete") + .build(); + return CommandConfiguration.builder() - .name("quoteDelete") + .name(QUOTE_DELETE_COMMAND) .module(QuotesModuleDefinition.QUOTES) .templated(true) + .slashCommandConfig(slashCommandConfig) .async(false) .requiresConfirmation(true) .supportsEmbedException(true) diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteGet.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteGet.java index 586f0d0a..2bcc05e6 100644 --- a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteGet.java +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteGet.java @@ -4,20 +4,26 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.config.SlashCommandConfig; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.sissi.module.quotes.config.QuoteSlashCommandNames; import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition; import dev.sheldan.sissi.module.quotes.config.QuotesModuleDefinition; import dev.sheldan.sissi.module.quotes.exception.QuoteNotFoundException; import dev.sheldan.sissi.module.quotes.model.database.Quote; import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean; import net.dv8tion.jda.api.entities.MessageChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.InteractionHook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -30,19 +36,27 @@ import java.util.concurrent.CompletableFuture; @Component public class QuoteGet extends AbstractConditionableCommand { + private static final String QUOTE_GET_COMMAND = "quoteGet"; + private static final String QUOTE_ID_PARAMETER = "quoteId"; + @Autowired private QuoteServiceBean quoteServiceBean; @Autowired private ServerManagementService serverManagementService; - @Autowired private ChannelService channelService; @Autowired private QuoteGet self; + @Autowired + private InteractionService interactionService; + + @Autowired + private SlashCommandParameterService slashCommandParameterService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -50,14 +64,10 @@ public class QuoteGet extends AbstractConditionableCommand { AServer server = serverManagementService.loadServer(commandContext.getGuild().getIdLong()); Optional possibleQuote = quoteServiceBean.getQuote(quoteId, server); - if(possibleQuote.isPresent()) { - Quote quoteToDisplay = possibleQuote.get(); - return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) - .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) - .thenApply(unused -> CommandResult.fromSuccess()); - } else { - throw new QuoteNotFoundException(); - } + Quote quoteToDisplay = possibleQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) + .thenApply(unused -> CommandResult.fromSuccess()); } @Transactional @@ -65,15 +75,49 @@ public class QuoteGet extends AbstractConditionableCommand { return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, messageChannel)); } + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + Long quoteId = slashCommandParameterService.getCommandOption(QUOTE_ID_PARAMETER, event, Integer.class).longValue(); + AServer server = serverManagementService.loadServer(event.getGuild().getIdLong()); + + Optional possibleQuote = quoteServiceBean.getQuote(quoteId, server); + Quote quoteToDisplay = possibleQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.replySlashCommand(event, messageToSend)) + .thenApply(unused -> CommandResult.fromSuccess()); + } + + @Transactional + public CompletableFuture replySlashCommand(SlashCommandInteractionEvent event, MessageToSend messageToSend) { + return interactionService.replyMessageToSend(messageToSend, event); + } + @Override public CommandConfiguration getConfiguration() { - Parameter quoteIdParameter = Parameter.builder().templated(true).name("quoteId").type(Long.class).build(); + Parameter quoteIdParameter = Parameter + .builder() + .templated(true) + .name(QUOTE_ID_PARAMETER) + .type(Long.class) + .build(); List parameters = Collections.singletonList(quoteIdParameter); - HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); + + SlashCommandConfig slashCommandConfig = SlashCommandConfig + .builder() + .enabled(true) + .rootCommandName(QuoteSlashCommandNames.QUOTE) + .commandName("get") + .build(); + return CommandConfiguration.builder() - .name("quoteGet") + .name(QUOTE_GET_COMMAND) .module(QuotesModuleDefinition.QUOTES) .templated(true) + .slashCommandConfig(slashCommandConfig) .async(true) .supportsEmbedException(true) .causesReaction(false) diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteSearch.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteSearch.java index 10504094..9ed46b30 100644 --- a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteSearch.java +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteSearch.java @@ -4,20 +4,26 @@ import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand import dev.sheldan.abstracto.core.command.config.CommandConfiguration; import dev.sheldan.abstracto.core.command.config.HelpInfo; import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.config.SlashCommandConfig; import dev.sheldan.abstracto.core.command.execution.CommandContext; import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.command.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.models.database.AServer; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.utils.FutureUtils; +import dev.sheldan.sissi.module.quotes.config.QuoteSlashCommandNames; import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition; import dev.sheldan.sissi.module.quotes.config.QuotesModuleDefinition; import dev.sheldan.sissi.module.quotes.exception.QuoteNotFoundException; import dev.sheldan.sissi.module.quotes.model.database.Quote; import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean; import net.dv8tion.jda.api.entities.MessageChannel; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.InteractionHook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +36,9 @@ import java.util.concurrent.CompletableFuture; @Component public class QuoteSearch extends AbstractConditionableCommand { + private static final String QUOTE_SEARCH_COMMAND = "quoteSearch"; + private static final String QUERY_PARAMETER = "query"; + @Autowired private QuoteServiceBean quoteServiceBean; @@ -42,6 +51,12 @@ public class QuoteSearch extends AbstractConditionableCommand { @Autowired private QuoteSearch self; + @Autowired + private SlashCommandParameterService slashCommandParameterService; + + @Autowired + private InteractionService interactionService; + @Override public CompletableFuture executeAsync(CommandContext commandContext) { List parameters = commandContext.getParameters().getParameters(); @@ -49,14 +64,10 @@ public class QuoteSearch extends AbstractConditionableCommand { AServer server = serverManagementService.loadServer(commandContext.getGuild().getIdLong()); Optional possibleQuote = quoteServiceBean.searchQuote(query, server); - if(possibleQuote.isPresent()) { - Quote quoteToDisplay = possibleQuote.get(); - return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) - .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) - .thenApply(unused -> CommandResult.fromSuccess()); - } else { - throw new QuoteNotFoundException(); - } + Quote quoteToDisplay = possibleQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.sendMessageToChannel(messageToSend, commandContext.getChannel())) + .thenApply(unused -> CommandResult.fromSuccess()); } @Transactional @@ -64,15 +75,49 @@ public class QuoteSearch extends AbstractConditionableCommand { return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, messageChannel)); } + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + String query = slashCommandParameterService.getCommandOption(QUERY_PARAMETER, event, String.class); + AServer server = serverManagementService.loadServer(event.getGuild().getIdLong()); + + Optional possibleQuote = quoteServiceBean.searchQuote(query, server); + Quote quoteToDisplay = possibleQuote.orElseThrow(QuoteNotFoundException::new); + return quoteServiceBean.renderQuoteToMessageToSend(quoteToDisplay) + .thenCompose(messageToSend -> self.replyMessage(event, messageToSend)) + .thenApply(unused -> CommandResult.fromSuccess()); + } + + @Transactional + public CompletableFuture replyMessage(SlashCommandInteractionEvent event, MessageToSend messageToSend) { + return interactionService.replyMessageToSend(messageToSend, event); + } + @Override public CommandConfiguration getConfiguration() { - Parameter searchParameter = Parameter.builder().templated(true).name("query").type(String.class).build(); + Parameter searchParameter = Parameter + .builder() + .templated(true) + .name(QUERY_PARAMETER) + .type(String.class) + .build(); List parameters = Collections.singletonList(searchParameter); - HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); + + SlashCommandConfig slashCommandConfig = SlashCommandConfig + .builder() + .enabled(true) + .rootCommandName(QuoteSlashCommandNames.QUOTE) + .commandName("search") + .build(); + return CommandConfiguration.builder() - .name("quoteSearch") + .name(QUOTE_SEARCH_COMMAND) .module(QuotesModuleDefinition.QUOTES) .templated(true) + .slashCommandConfig(slashCommandConfig) .async(true) .supportsEmbedException(true) .causesReaction(false) diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteStats.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteStats.java index 51979d29..677d75dc 100644 --- a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteStats.java +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/command/QuoteStats.java @@ -6,7 +6,9 @@ import dev.sheldan.abstracto.core.command.config.HelpInfo; 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.command.slash.parameter.SlashCommandParameterService; import dev.sheldan.abstracto.core.config.FeatureDefinition; +import dev.sheldan.abstracto.core.interaction.InteractionService; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.sissi.module.quotes.config.QuotesFeatureDefinition; @@ -14,6 +16,7 @@ import dev.sheldan.sissi.module.quotes.config.QuotesModuleDefinition; import dev.sheldan.sissi.module.quotes.model.command.QuoteStatsModel; import dev.sheldan.sissi.module.quotes.service.QuoteServiceBean; import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,13 +27,21 @@ import java.util.concurrent.CompletableFuture; @Component public class QuoteStats extends AbstractConditionableCommand { + private static final String QUOTE_STATS_COMMAND = "quoteStats"; + private static final String MEMBER_PARAMETER = "member"; + private static final String QUOTE_STATS_RESPONSE_TEMPLATE_KEY = "quoteStats_response"; + @Autowired private QuoteServiceBean quoteServiceBean; @Autowired private ChannelService channelService; - private static final String QUOTE_STATS_RESPONSE_TEMPLATE_KEY = "quoteStats_response"; + @Autowired + private SlashCommandParameterService slashCommandParameterService; + + @Autowired + private InteractionService interactionService; @Override public CompletableFuture executeAsync(CommandContext commandContext) { @@ -46,13 +57,35 @@ public class QuoteStats extends AbstractConditionableCommand { .thenApply(unused -> CommandResult.fromSuccess()); } + @Override + public CompletableFuture executeSlash(SlashCommandInteractionEvent event) { + Member target; + if(slashCommandParameterService.hasCommandOption(MEMBER_PARAMETER, event)) { + target = slashCommandParameterService.getCommandOption(MEMBER_PARAMETER, event, Member.class); + } else { + target = event.getMember(); + } + QuoteStatsModel model = quoteServiceBean.getQuoteStats(target); + return interactionService.replyEmbed(QUOTE_STATS_RESPONSE_TEMPLATE_KEY, model, event) + .thenApply(interactionHook -> CommandResult.fromSuccess()); + } + @Override public CommandConfiguration getConfiguration() { - Parameter searchParameter = Parameter.builder().templated(true).name("member").type(Member.class).optional(true).build(); + Parameter searchParameter = Parameter + .builder() + .templated(true) + .name(MEMBER_PARAMETER) + .type(Member.class) + .optional(true) + .build(); List parameters = Collections.singletonList(searchParameter); - HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + HelpInfo helpInfo = HelpInfo + .builder() + .templated(true) + .build(); return CommandConfiguration.builder() - .name("quoteStats") + .name(QUOTE_STATS_COMMAND) .module(QuotesModuleDefinition.QUOTES) .templated(true) .async(true) diff --git a/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/config/QuoteSlashCommandNames.java b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/config/QuoteSlashCommandNames.java new file mode 100644 index 00000000..b73dd16f --- /dev/null +++ b/application/sissi-modules/quotes/src/main/java/dev/sheldan/sissi/module/quotes/config/QuoteSlashCommandNames.java @@ -0,0 +1,6 @@ +package dev.sheldan.sissi.module.quotes.config; + +public class QuoteSlashCommandNames { + public static final String QUOTE = "quote"; + public static final String QUOTE_INTERNAL = "quoteInternal"; +} diff --git a/templates/sissi-templates/module-templates/quotes-templates/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_embed_en_US.ftl b/templates/sissi-templates/module-templates/quotes-templates/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_embed_en_US.ftl new file mode 100644 index 00000000..5bf1fa48 --- /dev/null +++ b/templates/sissi-templates/module-templates/quotes-templates/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_embed_en_US.ftl @@ -0,0 +1,6 @@ +{ + "additionalMessage": "<@safe_include "quoteDelete_response_text"/>", + "messageConfig": { + "ephemeral": true + } +} \ No newline at end of file diff --git a/templates/sissi-translations/module-translations/quote-translations/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_text_en_US.ftl b/templates/sissi-translations/module-translations/quote-translations/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_text_en_US.ftl new file mode 100644 index 00000000..5c91c2d7 --- /dev/null +++ b/templates/sissi-translations/module-translations/quote-translations/src/main/resources/en_US/commands/quoteDelete/quoteDelete_response_text_en_US.ftl @@ -0,0 +1 @@ +Quote has been deleted. \ No newline at end of file