AltitudeBot/src/main/java/com/alttd/modalManager/modals/ModalRemindMe.java
Teriuihi 994cd7a85f Updated JDA and gradle + Refactor modal methods to match the JDA update
Refactor modals to use `addActionRow` instead of `addActionRows`. Updated JDA dependency to version 5.0.2 and upgraded Gradle to version 8.5.
2024-08-07 00:17:58 +02:00

142 lines
5.4 KiB
Java

package com.alttd.modalManager.modals;
import com.alttd.buttonManager.ButtonManager;
import com.alttd.buttonManager.buttons.remindMeConfirm.ButtonRemindMeConfirm;
import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.database.queries.QueriesReminders.ReminderType;
import com.alttd.modalManager.DiscordModal;
import com.alttd.util.Util;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent;
import net.dv8tion.jda.api.interactions.components.ActionRow;
import net.dv8tion.jda.api.interactions.modals.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.interactions.modals.ModalMapping;
import net.dv8tion.jda.api.requests.RestAction;
import net.dv8tion.jda.api.utils.TimeUtil;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
public class ModalRemindMe extends DiscordModal {
private static final HashMap<Long, RemindMeData> userToRemindMeMap = new HashMap<>();
public static synchronized void putData(long userId, TextChannel channel, long timestamp) {
userToRemindMeMap.put(userId, new RemindMeData(channel, timestamp));
}
private static synchronized RemindMeData pullData(long userId) {
return userToRemindMeMap.remove(userId);
}
private final ButtonManager buttonManager;
public ModalRemindMe(ButtonManager buttonManager) {
this.buttonManager = buttonManager;
}
@Override
public String getModalId() {
return "remindme";
}
@Override
public void execute(ModalInteractionEvent event) {
String title = getValidString(event.getValue("title"), event, true);
if (title == null)
return;
String desc = getValidString(event.getValue("description"), event, false);
if (desc == null)
desc = "";
long userId = event.getUser().getIdLong();
RemindMeData remindMeData = pullData(userId);
if (remindMeData == null) {
event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find the data from the command that triggered this modal"))
.setEphemeral(true).queue();
return;
}
Reminder reminder = new Reminder(
-1,
title,
desc,
userId,
remindMeData.textChannel.getGuild().getIdLong(),
remindMeData.textChannel.getIdLong(),
0,
false,
new Date().getTime(),
remindMeData.timestamp,
ReminderType.MANUAL,
null);
Button remindMeConfirm = buttonManager.getButtonFor("remind_me_confirm");
Button remindMeCancel = buttonManager.getButtonFor("remind_me_cancel");
if (remindMeConfirm == null || remindMeCancel == null) {
event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to retrieve continue/cancel buttons"))
.setEphemeral(true).queue();
return;
}
MessageEmbed messageEmbed = new EmbedBuilder()
.setTitle(reminder.title())
.setDescription(reminder.description())
.appendDescription("\n\nWill remind <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.remindDate()) + ":R>")
.build();
event.deferReply().setEphemeral(true).queue(defer -> {
ButtonRemindMeConfirm.putReminder(userId, defer, reminder);
defer.editOriginalEmbeds(messageEmbed).queue(message ->
defer.editOriginalComponents().setActionRow(remindMeConfirm, remindMeCancel)
.queue(RestAction.getDefaultSuccess(), Util::handleFailure));
});
}
public String getValidString(ModalMapping modalMapping, ModalInteractionEvent event, boolean required) {
if (modalMapping == null) {
event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find modal"))
.setEphemeral(true).queue();
return null;
}
String string = modalMapping.getAsString();
if (string.isEmpty()) {
if (required)
event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find contents of modal"))
.setEphemeral(true).queue();
return null;
}
return string;
}
@Override
public Modal getModal() {
TextInput title = TextInput.create("title", "Title", TextInputStyle.SHORT)
.setPlaceholder("reminder title")
.setRequiredRange(1, 256)
.setRequired(true)
.build();
TextInput desc = TextInput.create("description", "Description", TextInputStyle.PARAGRAPH)
.setPlaceholder("optional reminder description")
.setRequiredRange(1, 4000)
.setRequired(false)
.build();
return Modal.create(getModalId(), "Remind Me")
.addActionRow(title)
.addActionRow(desc)
.build();
}
private record RemindMeData(TextChannel textChannel, long timestamp) {}
}