Work on RequestManager, a new way to create and manage requests.

This commit is contained in:
Len 2022-09-10 00:19:38 +02:00
parent 8d883b1e88
commit 9ab689c0b8
6 changed files with 307 additions and 1 deletions

View File

@ -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
}

View File

@ -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);
}
}
}

View File

@ -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<EmbedBuilder, ActionRow> 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<EmbedBuilder, ActionRow> 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);
}
}

View File

@ -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<Request> 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));
}
});
}
}

View File

@ -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<EmbedBuilder, SelectMenu.Builder> 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<EmbedBuilder, SelectMenu.Builder> 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<EmbedBuilder, SelectMenu.Builder> 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?
}
}
}
}

View File

@ -0,0 +1,21 @@
package com.alttd.util;
public class Pair<X, Y> {
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;
}
}