From 3bb4fa8b0f787b5440a7fb9a6fee67d4b7fe66bc Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Fri, 9 Sep 2022 15:21:09 +0200 Subject: [PATCH 1/7] Update build.gradle.kts --- build.gradle.kts | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 078cd2a..bc91869 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,22 +38,18 @@ tasks { } } -// create("relocateJars") { -// target = shadowJar.get() -// prefix = "${project.name}.lib" -// } -// -// shadowJar { -// dependsOn(getByName("relocateJars") as ConfigureShadowRelocation) -// archiveFileName.set("${project.name}-${project.version}.jar") -// minimize() -// configurations = listOf(project.configurations.shadow.get()) -// } -// + shadowJar { + archiveFileName.set(rootProject.name + ".jar") + } + build { dependsOn(shadowJar) } + jar { + enabled = false + } + } dependencies { From d371b44a66dfffecae8415510d75da1c39ad4328 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Fri, 9 Sep 2022 15:31:14 +0200 Subject: [PATCH 2/7] Update JDA --- build.gradle.kts | 2 +- .../commandManager/commands/AddCommand/CommandManage.java | 4 ++-- .../commands/AddCommand/SubCommandGroupSet.java | 2 +- .../commands/AddCommand/SubCommandGroupUnset.java | 2 +- .../java/com/alttd/commandManager/commands/CommandHelp.java | 4 ++-- .../commandManager/commands/PollCommand/CommandPoll.java | 4 ++-- src/main/java/com/alttd/util/OptionMappingParsing.java | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index bc91869..8c0033e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,7 +54,7 @@ tasks { dependencies { // JDA - implementation("net.dv8tion:JDA:5.0.0-alpha.10") { + implementation("net.dv8tion:JDA:5.0.0-alpha.18") { exclude("opus-java") // exclude audio } // MySQL diff --git a/src/main/java/com/alttd/commandManager/commands/AddCommand/CommandManage.java b/src/main/java/com/alttd/commandManager/commands/AddCommand/CommandManage.java index 0a8a304..28b9bab 100644 --- a/src/main/java/com/alttd/commandManager/commands/AddCommand/CommandManage.java +++ b/src/main/java/com/alttd/commandManager/commands/AddCommand/CommandManage.java @@ -52,7 +52,7 @@ public class CommandManage extends DiscordCommand { .addOption(OptionType.CHANNEL, "channel", "Channel to disable this command in", true) .addOption(OptionType.STRING, "command", "Name of the command to disable", true, true) ); - slashCommandData.setDefaultEnabled(true); +// slashCommandData.setDefaultEnabled(true); Util.registerSubOptions(subOptionsMap, new SubCommandDisable(commandManager, null, this), new SubCommandEnable(commandManager, null, this)); @@ -70,7 +70,7 @@ public class CommandManage extends DiscordCommand { event.replyEmbeds(Util.guildOnlyCommand(getName())).setEphemeral(true).queue(); return; } - if (PermissionManager.getInstance().hasPermission(event.getTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { + if (PermissionManager.getInstance().hasPermission(event.getChannel().asTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { event.replyEmbeds(Util.noPermission(getName())).setEphemeral(true).queue(); return; } diff --git a/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupSet.java b/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupSet.java index f672bdf..9055897 100644 --- a/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupSet.java +++ b/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupSet.java @@ -28,7 +28,7 @@ public class SubCommandGroupSet extends SubCommandGroup { @Override public void execute(SlashCommandInteractionEvent event) { - if (PermissionManager.getInstance().hasPermission(event.getTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { + if (PermissionManager.getInstance().hasPermission(event.getChannel().asTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { event.replyEmbeds(Util.noPermission(getName())).setEphemeral(true).queue(); return; } diff --git a/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupUnset.java b/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupUnset.java index 26fc722..6e9e845 100644 --- a/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupUnset.java +++ b/src/main/java/com/alttd/commandManager/commands/AddCommand/SubCommandGroupUnset.java @@ -28,7 +28,7 @@ public class SubCommandGroupUnset extends SubCommandGroup { @Override public void execute(SlashCommandInteractionEvent event) { - if (PermissionManager.getInstance().hasPermission(event.getTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { + if (PermissionManager.getInstance().hasPermission(event.getChannel().asTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { event.replyEmbeds(Util.noPermission(getName())).setEphemeral(true).queue(); return; } diff --git a/src/main/java/com/alttd/commandManager/commands/CommandHelp.java b/src/main/java/com/alttd/commandManager/commands/CommandHelp.java index a256070..19efa52 100644 --- a/src/main/java/com/alttd/commandManager/commands/CommandHelp.java +++ b/src/main/java/com/alttd/commandManager/commands/CommandHelp.java @@ -45,14 +45,14 @@ public class CommandHelp extends DiscordCommand { public void execute(SlashCommandInteractionEvent event) { PermissionManager permissionManager = PermissionManager.getInstance(); - if (permissionManager.hasPermission(event.getTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { + if (permissionManager.hasPermission(event.getChannel().asTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { event.replyEmbeds(Util.noPermission(getName())).setEphemeral(true).queue(); return; } StringBuilder helpMessage = new StringBuilder(); List options = event.getOptions(); - TextChannel textChannel = event.getTextChannel(); + TextChannel textChannel = event.getChannel().asTextChannel(); if (options.size() == 0) { commandManager.getCommands(textChannel).stream() .filter(command -> permissionManager.hasPermission( diff --git a/src/main/java/com/alttd/commandManager/commands/PollCommand/CommandPoll.java b/src/main/java/com/alttd/commandManager/commands/PollCommand/CommandPoll.java index dbd0dc5..dc83025 100644 --- a/src/main/java/com/alttd/commandManager/commands/PollCommand/CommandPoll.java +++ b/src/main/java/com/alttd/commandManager/commands/PollCommand/CommandPoll.java @@ -53,7 +53,7 @@ public class CommandPoll extends DiscordCommand { new SubcommandData("results", "Get the results for a poll") .addOption(OptionType.CHANNEL, "channel", "Channel this poll is in", true) .addOption(OptionType.INTEGER, "message_id", "Id of the poll you want the results for", true)); - slashCommandData.setDefaultEnabled(true); +// slashCommandData.setDefaultEnabled(true); Util.registerSubOptions(subOptionsMap, new SubCommandAdd(null,this), new SubCommandAddButton(null, this), @@ -77,7 +77,7 @@ public class CommandPoll extends DiscordCommand { event.replyEmbeds(Util.guildOnlyCommand(getName())).setEphemeral(true).queue(); return; } - if (PermissionManager.getInstance().hasPermission(event.getTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { + if (PermissionManager.getInstance().hasPermission(event.getChannel().asTextChannel(), event.getIdLong(), Util.getGroupIds(event.getMember()), getPermission())) { event.replyEmbeds(Util.noPermission(getName())).setEphemeral(true).queue(); return; } diff --git a/src/main/java/com/alttd/util/OptionMappingParsing.java b/src/main/java/com/alttd/util/OptionMappingParsing.java index b3f7c93..086c237 100644 --- a/src/main/java/com/alttd/util/OptionMappingParsing.java +++ b/src/main/java/com/alttd/util/OptionMappingParsing.java @@ -16,7 +16,7 @@ public class OptionMappingParsing { public static GuildMessageChannel getGuildChannel(String optionName, SlashCommandInteractionEvent event, String commandName) { OptionMapping optionMappingChannel = event.getInteraction().getOption(optionName); - GuildMessageChannel messageChannel = optionMappingChannel == null ? null : optionMappingChannel.getAsMessageChannel(); + GuildMessageChannel messageChannel = optionMappingChannel == null ? null : optionMappingChannel.getAsChannel().asGuildMessageChannel(); if (messageChannel == null) event.replyEmbeds(Util.invalidCommand(commandName, "Not a valid text channel or didn't give input for " + optionName, event.getInteraction())).setEphemeral(true).queue(); return messageChannel; From 1157b90d51af2a5b88fffa8a420fe3460242447c Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Fri, 9 Sep 2022 16:15:13 +0200 Subject: [PATCH 3/7] Add lombok --- build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 8c0033e..15783af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -63,4 +63,7 @@ dependencies { // Configurate implementation("org.spongepowered:configurate-yaml:4.1.2") + + compileOnly("org.projectlombok:lombok:1.18.24") + annotationProcessor("org.projectlombok:lombok:1.18.24") } \ No newline at end of file From 8d883b1e88896a95dee4b14812b484f13482c3e9 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Fri, 9 Sep 2022 17:32:40 +0200 Subject: [PATCH 4/7] Changes to AbstractConfig.java --- .../java/com/alttd/config/AbstractConfig.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alttd/config/AbstractConfig.java b/src/main/java/com/alttd/config/AbstractConfig.java index feb1fcd..3289e8f 100644 --- a/src/main/java/com/alttd/config/AbstractConfig.java +++ b/src/main/java/com/alttd/config/AbstractConfig.java @@ -22,14 +22,14 @@ import java.util.Map; import java.util.regex.Pattern; @SuppressWarnings({"unused", "SameParameterValue"}) -abstract class AbstractConfig { +public abstract class AbstractConfig { private static final Pattern PATH_PATTERN = Pattern.compile("\\."); private static final String HEADER = ""; private YamlConfigurationLoader configLoader; private ConfigurationNode config; - AbstractConfig(String filename) { + protected AbstractConfig(String filename) { init(new File(new File(AltitudeBot.getInstance().getDataFolder()).getParentFile(), filename), filename); } @@ -60,7 +60,7 @@ abstract class AbstractConfig { } } - void readConfig(Class clazz, Object instance) { + protected void readConfig(Class clazz, Object instance) { for (Method method : clazz.getDeclaredMethods()) { if (Modifier.isPrivate(method.getModifiers())) { if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) { @@ -80,7 +80,7 @@ abstract class AbstractConfig { save(); } - private void save() { + protected void save() { try { configLoader.save(config); } catch (IOException ex) { @@ -101,6 +101,17 @@ abstract class AbstractConfig { } } + protected void update(String path, Object def) { + if(config.node(splitPath(path)).virtual()) { + set(path, def); + return; + } + try { + config.node(splitPath(path)).set(def); + } catch (SerializationException e) { + } + } + protected void setString(String path, String def) { try { if(config.node(splitPath(path)).virtual()) From 9ab689c0b8a7200fa6e22faa1d51b2bba82c3931 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Sat, 10 Sep 2022 00:19:38 +0200 Subject: [PATCH 5/7] Work on RequestManager, a new way to create and manage requests. --- src/main/java/com/alttd/AltitudeBot.java | 6 +- .../commandManager/listeners/JDAListener.java | 29 +++++ src/main/java/com/alttd/request/Request.java | 84 +++++++++++++ .../java/com/alttd/request/RequestConfig.java | 58 +++++++++ .../com/alttd/request/RequestManager.java | 110 ++++++++++++++++++ src/main/java/com/alttd/util/Pair.java | 21 ++++ 6 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alttd/request/Request.java create mode 100644 src/main/java/com/alttd/request/RequestConfig.java create mode 100644 src/main/java/com/alttd/request/RequestManager.java create mode 100644 src/main/java/com/alttd/util/Pair.java diff --git a/src/main/java/com/alttd/AltitudeBot.java b/src/main/java/com/alttd/AltitudeBot.java index c865c87..78a89ab 100644 --- a/src/main/java/com/alttd/AltitudeBot.java +++ b/src/main/java/com/alttd/AltitudeBot.java @@ -8,6 +8,7 @@ import com.alttd.console.ConsoleCommandManager; import com.alttd.database.Database; import com.alttd.database.DatabaseTables; import com.alttd.permissions.PermissionManager; +import com.alttd.request.RequestManager; import com.alttd.util.Logger; import com.mysql.cj.log.Log; import net.dv8tion.jda.api.JDA; @@ -40,11 +41,13 @@ public class AltitudeBot { Logger.info("Starting bot..."); initConfigs(); try { - jda = JDABuilder.createDefault(SettingsConfig.TOKEN).build(); + jda = JDABuilder.createDefault(SettingsConfig.TOKEN).build().awaitReady(); } catch (LoginException e) { Logger.info("Unable to log in, shutting down (check token in settings.yml)."); exit(1); Logger.exception(e); + } catch (InterruptedException e) { + throw new RuntimeException(e); } DatabaseTables.createTables(Database.getDatabase().getConnection()); ConsoleCommandManager.startConsoleCommands(jda); @@ -55,6 +58,7 @@ public class AltitudeBot { } catch (IllegalArgumentException e) { Logger.exception(e); } + RequestManager.init(); initListeners(); //TODO init permissionManager } diff --git a/src/main/java/com/alttd/commandManager/listeners/JDAListener.java b/src/main/java/com/alttd/commandManager/listeners/JDAListener.java index 9438808..b4a7814 100644 --- a/src/main/java/com/alttd/commandManager/listeners/JDAListener.java +++ b/src/main/java/com/alttd/commandManager/listeners/JDAListener.java @@ -1,9 +1,14 @@ package com.alttd.commandManager.listeners; import com.alttd.commandManager.CommandManager; +import com.alttd.request.RequestManager; import com.alttd.util.Logger; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.events.ReadyEvent; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; @@ -21,4 +26,28 @@ public class JDAListener extends ListenerAdapter { jda.addEventListener(new CommandManager(jda)); } + @Override + public void onSelectMenuInteraction(@NotNull SelectMenuInteractionEvent event) { + String s = event.getComponentId(); + if (s.startsWith("request:")) { + RequestManager.onSelectMenuInteraction(event); + } + } + + @Override + public void onModalInteraction(@NotNull ModalInteractionEvent event) { + String s = event.getModalId(); + if (s.startsWith("request:")) { + RequestManager.onModalInteractionEvent(event); + } + } + + @Override + public void onButtonInteraction(ButtonInteractionEvent event) { + String s = event.getComponentId(); + if (s.startsWith("request:")) { + RequestManager.onButtonInteractionEvent(event); + } + } + } diff --git a/src/main/java/com/alttd/request/Request.java b/src/main/java/com/alttd/request/Request.java new file mode 100644 index 0000000..b20bf62 --- /dev/null +++ b/src/main/java/com/alttd/request/Request.java @@ -0,0 +1,84 @@ +package com.alttd.request; + +import com.alttd.AltitudeBot; +import com.alttd.util.Pair; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.ThreadChannel; +import net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.Modal; +import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.interactions.components.text.TextInput; +import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; +import net.dv8tion.jda.api.requests.restaction.ThreadChannelAction; + +import java.awt.*; + +@AllArgsConstructor +public class Request { + + @Getter + private String id, category, channel, name, title, description, message; + + public Modal modal(Member member) { + TextInput requestTitle = TextInput + .create("title", title, TextInputStyle.PARAGRAPH) + .build(); + + TextInput requestMessage = TextInput + .create("request", message.replaceAll("%member%", member.getEffectiveName()).subSequence(0, 45).toString(), TextInputStyle.PARAGRAPH) + .build(); + + return Modal.create("request:" + id, name) + .addActionRow(requestTitle) + .addActionRow(requestMessage) + .build(); + } + + public void createThread(Member member, String title, String request) { + TextChannel channel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getTextChannelById(getChannel()); + ThreadChannelAction threadChannelAction = channel.createThreadChannel(title); + threadChannelAction.queue(threadChannel -> { + threadChannel.addThreadMember(member).queue(); + sendEmbed(threadChannel, title, request); + channel.deleteMessageById(threadChannel.getId()).queue(); + // TODO store the request somewhere so it can be grabbed later + }); + } + + public void sendEmbed(ThreadChannel channel, String title, String request) { +// Pair pair = getRequestEmbed(channel.getId(), title, request); + // pairs are not really possible here :( + EmbedBuilder embedBuilder = new EmbedBuilder(); + embedBuilder.setTitle("title") + .addField(getName(), request, false) + .setColor(new Color(41, 43, 47)); + channel.sendMessageEmbeds(embedBuilder.build()).queue(message1 -> + channel.editMessageEmbedsById(message1.getId(), embedBuilder.build()) + .setActionRow( + Button.primary("request:" + getId() + ":" + channel.getId() + ":" + message1.getId() + ":progress", "in progress"), + Button.success("request:" + getId() + ":" + channel.getId() + ":" + message1.getId() + ":complete", "complete"), + Button.danger("request:" + getId() + ":" + channel.getId() + ":" + message1.getId() + ":denied", "denied") + ).queue() + ); + } + + public Pair getRequestEmbed(String channellId, String title, String request) { + EmbedBuilder embedBuilder = new EmbedBuilder(); + embedBuilder.setTitle("title") + .addField(getName(), request, false) + .setColor(new Color(41, 43, 47)); + + ActionRow actionRow = ActionRow.of( + Button.primary("request:" + getId() + ":" + channellId + ":progress", "in progress"), + Button.success("request:" + getId() + ":" + channellId + ":complete", "complete"), + Button.danger("request:" + getId() + ":" + channellId + ":denied", "denied") + ); + + return new Pair<>(embedBuilder, actionRow); + } + +} diff --git a/src/main/java/com/alttd/request/RequestConfig.java b/src/main/java/com/alttd/request/RequestConfig.java new file mode 100644 index 0000000..ce450aa --- /dev/null +++ b/src/main/java/com/alttd/request/RequestConfig.java @@ -0,0 +1,58 @@ +package com.alttd.request; + +import com.alttd.config.AbstractConfig; +import com.alttd.util.Logger; + +import java.util.ArrayList; +import java.util.List; + +public class RequestConfig extends AbstractConfig { + + static RequestConfig requestConfig; + + public RequestConfig() { + super("requests.yml"); + } + + public static void reload() { + requestConfig = new RequestConfig(); + requestConfig.readConfig(RequestConfig.class, requestConfig); + } + + public static String REQUEST_GUILD_ID = "776590138296893480"; + public static String REQUEST_CATEGORY = "776590138296893481"; + public static String REQUEST_CHANNEL = "1017787342561476709"; + public static String REQUEST_MESSAGE = ""; + private void settings() { + REQUEST_GUILD_ID = requestConfig.getString("request.guild", REQUEST_GUILD_ID); + REQUEST_CATEGORY = requestConfig.getString("request.category", REQUEST_CATEGORY); + REQUEST_CHANNEL = requestConfig.getString("request.channel", REQUEST_CHANNEL); + REQUEST_MESSAGE = requestConfig.getString("request.message", REQUEST_MESSAGE); + } + + public static void setRequestMessage(String messageId) { + REQUEST_MESSAGE = messageId; + requestConfig.update("request.message", REQUEST_MESSAGE); + requestConfig.save(); + } + + public static final List requests = new ArrayList<>(); + private void loadRequests() { + requests.clear(); + requestConfig.getNode("types").childrenMap().forEach((key, value) -> { + String id = key.toString(); + String category = value.node("category").getString(); + String channel = value.node("channel").getString(); + String name = value.node("name").getString(); + String title = value.node("title").getString(); + String description = value.node("description").getString(); + String message = value.node("message").getString(); + if (id == null || category == null || channel == null || name == null || description == null || message == null) { + Logger.warning("Requests are set up incorrectly!"); + } else { + requests.add(new Request(id, category, channel, name, title, description, message)); + } + }); + } + +} diff --git a/src/main/java/com/alttd/request/RequestManager.java b/src/main/java/com/alttd/request/RequestManager.java new file mode 100644 index 0000000..a6f9c9e --- /dev/null +++ b/src/main/java/com/alttd/request/RequestManager.java @@ -0,0 +1,110 @@ +package com.alttd.request; + +import com.alttd.AltitudeBot; +import com.alttd.util.Pair; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.entities.ThreadChannel; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; +import net.dv8tion.jda.api.interactions.components.selections.SelectMenu; + +import java.awt.*; + +public class RequestManager { + + public static void init() { + RequestConfig.reload(); + if (RequestConfig.REQUEST_MESSAGE == null || RequestConfig.REQUEST_MESSAGE.isEmpty()) + sendRequestMessage(); + } + + public static Pair getRequestEmbed() { + EmbedBuilder embedBuilder = new EmbedBuilder(); + SelectMenu.Builder selectMenuBuilder = SelectMenu.create("request:create"); + embedBuilder.setDescription("Select an option below to open a request!\n") + .setTitle("Create a new request.") + .setColor(new Color(41, 43, 47)); + + for (Request request : RequestConfig.requests) { + embedBuilder.addField(request.getName(), request.getDescription(), false); + selectMenuBuilder.addOption(request.getName(), "request:open:" + request.getId(), request.getDescription(), null); + } + + return new Pair<>(embedBuilder, selectMenuBuilder); + } + + public static void sendRequestMessage() { + TextChannel channel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getTextChannelById(RequestConfig.REQUEST_CHANNEL); + Pair pair = getRequestEmbed(); + channel.sendMessageEmbeds(pair.getValue0().build()).setActionRow( + pair.getValue1().build() + ).queue(m -> RequestConfig.setRequestMessage(m.getId())); + } + + public static void updateRequestMessage() { + TextChannel channel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getTextChannelById(RequestConfig.REQUEST_CHANNEL); + Pair pair = getRequestEmbed(); + channel.editMessageEmbedsById(RequestConfig.REQUEST_MESSAGE, pair.getValue0().build()) + .setActionRow( + pair.getValue1().build() + ).queue(m -> RequestConfig.setRequestMessage(m.getId())); + } + + public static Request getRequestById(String id) { + return RequestConfig.requests.stream().filter(request -> request.getId().equalsIgnoreCase(id)).findFirst().orElse(null); + } + + public static void onSelectMenuInteraction(SelectMenuInteractionEvent event) { + String[] actions = event.getComponentId().split(":"); + if (actions[1].equals("create")) { + String[] selection = event.getSelectedOptions().get(0).getValue().split(":"); + if (selection[0].equals("request") && selection[1].equals("open")) { + String id = selection[2]; + event.replyModal(getRequestById(id).modal(event.getMember())).queue(); + updateRequestMessage(); // You can't use a select menu option twice in a row, updating it fixes that. + } + } + } + + public static void onModalInteractionEvent(ModalInteractionEvent event) { + String s = event.getModalId(); + String[] strings = s.split(":", 2); + getRequestById(strings[1]).createThread(event.getMember(), event.getValue("title").getAsString(), event.getValue("request").getAsString()); + event.reply("Thanks for your request!").setEphemeral(true).queue(); + } + + public static void onButtonInteractionEvent(ButtonInteractionEvent event) { + String s = event.getComponentId(); + String[] strings = s.split(":", 5); + String requestId = strings[1]; + String threadId = strings[2]; + String messageId = strings[3]; + String type = strings[4]; // progress, complete, denied + + // TODO update the stored request in the database + switch (type) { + case "denied" -> { + // TODO open a new modal to input a reason? + // could also do this by command? + event.reply("This request has been denied by " + event.getMember().getAsMention()).queue(); + ThreadChannel threadChannel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getThreadChannelById(threadId); + threadChannel.getManager().setArchived(true).setLocked(true).queue(); + } + case "complete" -> { + // TODO open a new modal to input a reason? + // could also do this by command? + event.reply("This request has been completed by " + event.getMember().getAsMention()).queue(); + ThreadChannel threadChannel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getThreadChannelById(threadId); + threadChannel.getManager().setArchived(true).setLocked(true).queue(); + } + case "progress" -> { + // TODO open a new modal to input a reason? + // edit the message to show who is working on it? + } + } + + } + +} diff --git a/src/main/java/com/alttd/util/Pair.java b/src/main/java/com/alttd/util/Pair.java new file mode 100644 index 0000000..987cfc7 --- /dev/null +++ b/src/main/java/com/alttd/util/Pair.java @@ -0,0 +1,21 @@ +package com.alttd.util; + +public class Pair { + + private final X x; + private final Y y; + + public Pair(X x, Y y) { + this.x = x; + this.y = y; + } + + public X getValue0() { + return x; + } + + public Y getValue1() { + return y; + } +} + From 26dfc0013c874aee4411893c22e8bad4f1b7cdd3 Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Sat, 10 Sep 2022 00:34:53 +0200 Subject: [PATCH 6/7] Add an example config. --- example.requests.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 example.requests.yml diff --git a/example.requests.yml b/example.requests.yml new file mode 100644 index 0000000..322beab --- /dev/null +++ b/example.requests.yml @@ -0,0 +1,34 @@ +request: + guild: '776590138296893480' + category: '776590138296893481' + channel: '1017787342561476709' + message: '1017839462111256667' +types: + bug-report: + category: '776590138296893481' + channel: '820222354180800525' + name: Bug report + title: What should the title be? + description: Report a new bug. + message: Describe the bug. + act-request: + category: '776590138296893481' + channel: '820222354180800525' + name: Act request + title: What should the title be? + description: Make a new act request. + message: Describe the act request. + admin-act-request: + category: '776590138296893481' + channel: '820222354180800525' + name: Admin act request + title: What should the title be? + description: Make a new admin act request. + message: Describe the admin act request. + feature-request: + category: '776590138296893481' + channel: '820222354180800525' + name: Feature request + title: What should the title be? + description: Make a new feature request. + message: Describe the feature request. From ddcd1643c2d4cfaa6dd9abd4c1346b2dff05a99a Mon Sep 17 00:00:00 2001 From: Len <40720638+destro174@users.noreply.github.com> Date: Sat, 10 Sep 2022 10:40:32 +0200 Subject: [PATCH 7/7] Update Request.java --- src/main/java/com/alttd/request/Request.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alttd/request/Request.java b/src/main/java/com/alttd/request/Request.java index b20bf62..f7716cf 100644 --- a/src/main/java/com/alttd/request/Request.java +++ b/src/main/java/com/alttd/request/Request.java @@ -19,17 +19,19 @@ import java.awt.*; @AllArgsConstructor public class Request { - + // TODO check if all labels on the modal are max 45 in length @Getter private String id, category, channel, name, title, description, message; public Modal modal(Member member) { TextInput requestTitle = TextInput - .create("title", title, TextInputStyle.PARAGRAPH) + .create("title", title, TextInputStyle.SHORT) + .setPlaceholder(id) + .setRequired(false) .build(); TextInput requestMessage = TextInput - .create("request", message.replaceAll("%member%", member.getEffectiveName()).subSequence(0, 45).toString(), TextInputStyle.PARAGRAPH) + .create("request", message, TextInputStyle.PARAGRAPH) .build(); return Modal.create("request:" + id, name) @@ -40,10 +42,12 @@ public class Request { public void createThread(Member member, String title, String request) { TextChannel channel = AltitudeBot.getInstance().getJDA().getGuildById(RequestConfig.REQUEST_GUILD_ID).getTextChannelById(getChannel()); - ThreadChannelAction threadChannelAction = channel.createThreadChannel(title); + if (title == null || title.isEmpty()) title = id; + String finalTitle = title; + ThreadChannelAction threadChannelAction = channel.createThreadChannel(finalTitle); threadChannelAction.queue(threadChannel -> { threadChannel.addThreadMember(member).queue(); - sendEmbed(threadChannel, title, request); + sendEmbed(threadChannel, finalTitle, request); channel.deleteMessageById(threadChannel.getId()).queue(); // TODO store the request somewhere so it can be grabbed later }); @@ -53,7 +57,7 @@ public class Request { // Pair pair = getRequestEmbed(channel.getId(), title, request); // pairs are not really possible here :( EmbedBuilder embedBuilder = new EmbedBuilder(); - embedBuilder.setTitle("title") + embedBuilder.setTitle(title) .addField(getName(), request, false) .setColor(new Color(41, 43, 47)); channel.sendMessageEmbeds(embedBuilder.build()).queue(message1 ->