diff --git a/src/main/java/com/alttd/commandManager/CommandManager.java b/src/main/java/com/alttd/commandManager/CommandManager.java index 0b90e5c..7eea1dc 100644 --- a/src/main/java/com/alttd/commandManager/CommandManager.java +++ b/src/main/java/com/alttd/commandManager/CommandManager.java @@ -2,13 +2,14 @@ package com.alttd.commandManager; import com.alttd.commandManager.commands.AddCommand.CommandManage; import com.alttd.commandManager.commands.CommandHelp; +import com.alttd.commandManager.commands.CommandSuggestion; import com.alttd.commandManager.commands.PollCommand.CommandPoll; import com.alttd.database.Database; +import com.alttd.modalManager.ModalManager; import com.alttd.util.Logger; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; @@ -27,14 +28,15 @@ public class CommandManager extends ListenerAdapter { private final List commands; private final HashMap> commandList = new HashMap<>(); - public CommandManager(JDA jda) { + public CommandManager(JDA jda, ModalManager modalManager) { commandList.put("manage", new ArrayList<>(List.of(new ScopeInfo(CommandScope.GLOBAL, 0)))); loadCommands(); Logger.info("Loading commands..."); commands = List.of( new CommandManage(jda, this), new CommandHelp(jda, this), - new CommandPoll(jda, this)); + new CommandPoll(jda, this), + new CommandSuggestion(jda, modalManager, this)); } @Override diff --git a/src/main/java/com/alttd/commandManager/commands/CommandSuggestion.java b/src/main/java/com/alttd/commandManager/commands/CommandSuggestion.java new file mode 100644 index 0000000..3dcbd26 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandSuggestion.java @@ -0,0 +1,61 @@ +package com.alttd.commandManager.commands; + +import com.alttd.commandManager.CommandManager; +import com.alttd.commandManager.DiscordCommand; +import com.alttd.config.MessagesConfig; +import com.alttd.modalManager.ModalManager; +import com.alttd.util.Util; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.components.Modal; + +import java.util.Collections; + +public class CommandSuggestion extends DiscordCommand { + + private final CommandManager commandManager; + private final CommandData commandData; + private final ModalManager modalManager; + + public CommandSuggestion(JDA jda, ModalManager modalManager, CommandManager commandManager) { + this.commandManager = commandManager; + this.modalManager = modalManager; + + commandData = Commands.slash(getName(), "Open suggestion form."); + Util.registerCommand(commandManager, jda, commandData, getName()); + } + + @Override + public String getName() { + return "suggestion"; + } + + @Override + public void execute(SlashCommandInteractionEvent event) { + Modal modal = modalManager.getModalFor("suggestion"); + if (modal == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", + "Unable to find suggestion modal, please report this issue to Teri")).queue(); + return; + } + event.replyModal(modal).queue(); + } + + @Override + public void suggest(CommandAutoCompleteInteractionEvent event) { + event.replyChoices(Collections.emptyList()).queue(); + } + + @Override + public String getHelpMessage() { + return MessagesConfig.HELP_SUGGESTION; + } + + @Override + public CommandData getCommandData() { + return commandData; + } +} diff --git a/src/main/java/com/alttd/config/MessagesConfig.java b/src/main/java/com/alttd/config/MessagesConfig.java index 6925f4b..4706cac 100644 --- a/src/main/java/com/alttd/config/MessagesConfig.java +++ b/src/main/java/com/alttd/config/MessagesConfig.java @@ -15,9 +15,11 @@ public class MessagesConfig extends AbstractConfig { public static String HELP_HELP = "`/help`: Shows help menu"; + public static String HELP_SUGGESTION = "`/suggestion`: Opens suggestion form"; public static String HELP_MESSAGE_TEMPLATE = ""; private static void loadHelp() { HELP_HELP = messagesConfig.getString("help.help", HELP_HELP); + HELP_SUGGESTION = messagesConfig.getString("help.suggestion", HELP_SUGGESTION); HELP_MESSAGE_TEMPLATE = messagesConfig.getString("help.message-template", HELP_MESSAGE_TEMPLATE); } private static void loadPollHelp() { diff --git a/src/main/java/com/alttd/commandManager/listeners/JDAListener.java b/src/main/java/com/alttd/listeners/JDAListener.java similarity index 78% rename from src/main/java/com/alttd/commandManager/listeners/JDAListener.java rename to src/main/java/com/alttd/listeners/JDAListener.java index a3012fe..130539c 100644 --- a/src/main/java/com/alttd/commandManager/listeners/JDAListener.java +++ b/src/main/java/com/alttd/listeners/JDAListener.java @@ -1,6 +1,7 @@ -package com.alttd.commandManager.listeners; +package com.alttd.listeners; import com.alttd.commandManager.CommandManager; +import com.alttd.modalManager.ModalManager; import com.alttd.util.Logger; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.events.ReadyEvent; @@ -18,7 +19,7 @@ public class JDAListener extends ListenerAdapter { @Override public void onReady(@NotNull ReadyEvent event) { Logger.info("JDA ready to register commands."); - jda.addEventListener(new CommandManager(jda)); + jda.addEventListener(new CommandManager(jda, new ModalManager())); } } diff --git a/src/main/java/com/alttd/modalManager/DiscordModal.java b/src/main/java/com/alttd/modalManager/DiscordModal.java new file mode 100644 index 0000000..e8c87ff --- /dev/null +++ b/src/main/java/com/alttd/modalManager/DiscordModal.java @@ -0,0 +1,14 @@ +package com.alttd.modalManager; + +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.interactions.components.Modal; + +public abstract class DiscordModal { + + public abstract String getModalId(); + + public abstract void execute(ModalInteractionEvent event); + + public abstract Modal getModal(); + +} diff --git a/src/main/java/com/alttd/modalManager/ModalManager.java b/src/main/java/com/alttd/modalManager/ModalManager.java new file mode 100644 index 0000000..5989370 --- /dev/null +++ b/src/main/java/com/alttd/modalManager/ModalManager.java @@ -0,0 +1,51 @@ +package com.alttd.modalManager; + +import com.alttd.modalManager.modals.ModalSuggestion; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.interactions.components.Modal; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.awt.*; +import java.util.List; +import java.util.Optional; + +public class ModalManager extends ListenerAdapter { + + private final List modals; + + public ModalManager() { + modals = List.of( + new ModalSuggestion()); + } + + @Override + public void onModalInteraction(@NotNull ModalInteractionEvent event) { + String modalId = event.getModalId(); + Optional first = modals.stream() + .filter(discordModal -> discordModal.getModalId().equalsIgnoreCase(modalId)) + .findFirst(); + if (first.isEmpty()) { + event.replyEmbeds(new EmbedBuilder() + .setTitle("Invalid command") + .setDescription("Unable to process modal with id: [" + modalId + "], please report this issue to a Teri") + .setColor(Color.RED) + .build()) + .setEphemeral(true) + .queue(); + return; + } + first.get().execute(event); + } + + public @Nullable Modal getModalFor(String modalId) { + Optional first = modals.stream() + .filter(discordModal -> discordModal.getModalId().equalsIgnoreCase(modalId)) + .findFirst(); + if (first.isEmpty()) + return null; + return first.get().getModal(); + } +} diff --git a/src/main/java/com/alttd/modalManager/modals/ModalSuggestion.java b/src/main/java/com/alttd/modalManager/modals/ModalSuggestion.java new file mode 100644 index 0000000..7627da7 --- /dev/null +++ b/src/main/java/com/alttd/modalManager/modals/ModalSuggestion.java @@ -0,0 +1,39 @@ +package com.alttd.modalManager.modals; + +import com.alttd.modalManager.DiscordModal; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.Modal; +import net.dv8tion.jda.api.interactions.components.text.TextInput; +import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; + +public class ModalSuggestion extends DiscordModal { + @Override + public String getModalId() { + return "suggestion"; + } + + @Override + public void execute(ModalInteractionEvent event) { + + } + + @Override + public Modal getModal() { + TextInput title = TextInput.create("title", "Title", TextInputStyle.SHORT) + .setPlaceholder("You suggestion in one sentence") + .setRequiredRange(10, 100) + .setRequired(true) + .build(); + + TextInput body = TextInput.create("body", "Body", TextInputStyle.PARAGRAPH) + .setPlaceholder("Your concerns go here") + .setRequiredRange(30, 1024) + .setRequired(true) + .build(); + + return Modal.create(getModalId(), "Suggestion Form") + .addActionRows(ActionRow.of(title), ActionRow.of(body)) + .build(); + } +}