diff --git a/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeCancel.java b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeCancel.java index cce9259..65351e2 100644 --- a/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeCancel.java +++ b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeCancel.java @@ -1,10 +1,15 @@ package com.alttd.buttonManager.buttons.remindMeConfirm; import com.alttd.buttonManager.DiscordButton; +import com.alttd.database.queries.QueriesReminders.Reminder; import com.alttd.util.Util; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.interactions.components.buttons.Button; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class ButtonRemindMeCancel extends DiscordButton { @Override public String getButtonId() { @@ -13,9 +18,15 @@ public class ButtonRemindMeCancel extends DiscordButton { @Override public void execute(ButtonInteractionEvent event) { - ButtonRemindMeConfirm.removeReminder(event.getUser().getIdLong()); + HookAndReminder hookAndReminder = ButtonRemindMeConfirm.removeReminder(event.getUser().getIdLong()); + if (hookAndReminder == null) { + event.replyEmbeds(Util.genericErrorEmbed("Error", "Your reminder was already cancelled!")) + .setEphemeral(true).queue(); + return; + } event.replyEmbeds(Util.genericSuccessEmbed("Success", "Cancelled your reminder!")) .setEphemeral(true).queue(); + hookAndReminder.interactionHook().editOriginalComponents(List.of()).queue(); } @Override diff --git a/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeConfirm.java b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeConfirm.java index 0b0ea5b..7076c00 100644 --- a/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeConfirm.java +++ b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/ButtonRemindMeConfirm.java @@ -6,20 +6,22 @@ import com.alttd.database.queries.QueriesReminders.Reminder; import com.alttd.reminders.ReminderScheduler; import com.alttd.util.Util; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.interactions.InteractionHook; import net.dv8tion.jda.api.interactions.components.buttons.Button; import java.util.HashMap; +import java.util.List; public class ButtonRemindMeConfirm extends DiscordButton { - private static final HashMap unconfirmedReminders = new HashMap<>(); + private static final HashMap unconfirmedReminders = new HashMap<>(); - public static synchronized void putReminder(long id, Reminder reminder) { - unconfirmedReminders.put(id, reminder); + public static synchronized void putReminder(long id, InteractionHook defer, Reminder reminder) { + unconfirmedReminders.put(id, new HookAndReminder(reminder, defer)); } - public static synchronized Reminder removeReminder(long id) { - return unconfirmedReminders.get(id); + public static synchronized HookAndReminder removeReminder(long id) { + return unconfirmedReminders.remove(id); } @Override @@ -29,12 +31,13 @@ public class ButtonRemindMeConfirm extends DiscordButton { @Override public void execute(ButtonInteractionEvent event) { - Reminder reminder = removeReminder(event.getUser().getIdLong()); + HookAndReminder hookAndReminder = removeReminder(event.getUser().getIdLong()); - if (storeReminder(reminder, event)) { + if (storeReminder(hookAndReminder.reminder(), event)) { event.replyEmbeds(Util.genericSuccessEmbed("Success", "Your reminder was successfully created!")) .setEphemeral(true).queue(); } + hookAndReminder.interactionHook().editOriginalComponents(List.of()).queue(); } private boolean storeReminder(Reminder reminder, ButtonInteractionEvent event) { diff --git a/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/HookAndReminder.java b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/HookAndReminder.java new file mode 100644 index 0000000..bc8945f --- /dev/null +++ b/src/main/java/com/alttd/buttonManager/buttons/remindMeConfirm/HookAndReminder.java @@ -0,0 +1,8 @@ +package com.alttd.buttonManager.buttons.remindMeConfirm; + +import com.alttd.database.queries.QueriesReminders.Reminder; +import net.dv8tion.jda.api.interactions.InteractionHook; + +record HookAndReminder(Reminder reminder, InteractionHook interactionHook) { + +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java b/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java index 3ffafad..1debb02 100644 --- a/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java +++ b/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java @@ -10,6 +10,7 @@ import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.entities.channel.unions.GuildChannelUnion; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.AutoCompleteQuery; import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; @@ -18,7 +19,9 @@ import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.interactions.components.Modal; import java.util.Calendar; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.concurrent.TimeUnit; public class CommandRemindMe extends DiscordCommand { @@ -60,7 +63,7 @@ public class CommandRemindMe extends DiscordCommand { return; } - ModalRemindMe.putData(event.getIdLong(), channel, fromNow); + ModalRemindMe.putData(event.getUser().getIdLong(), channel, fromNow); event.replyModal(modal).queue(); } @@ -92,7 +95,7 @@ public class CommandRemindMe extends DiscordCommand { return null; } - if (!fromNow.matches("[1-9][0-9]*[dmy]")) { + if (!fromNow.matches("[1-9][0-9]*[hdmy]")) { return fromNowTimestamp(fromNow, event); } @@ -106,6 +109,9 @@ public class CommandRemindMe extends DiscordCommand { } switch (fromNow.substring(fromNow.length() - 1)) { + case "h" -> { + return TimeUnit.HOURS.toMillis(i) + new Date().getTime(); + } case "d" -> { return TimeUnit.DAYS.toMillis(i) + new Date().getTime(); } @@ -148,7 +154,24 @@ public class CommandRemindMe extends DiscordCommand { @Override public void suggest(CommandAutoCompleteInteractionEvent event) { - //TODO implement suggest + AutoCompleteQuery focusedOption = event.getFocusedOption(); + if (!focusedOption.getName().equals("fromnow")) { + event.replyChoices(Collections.emptyList()).queue(); + return; + } + + String value = focusedOption.getValue(); + if (value.isBlank()) { + event.replyChoiceStrings(List.of("1h", "1d", "1w", "1y", "t:" + new Date().getTime())).queue(); + return; + } + + if (value.matches("[0-9]+")) + event.replyChoiceStrings(List.of(value + "h", value + "d", value + "w", value + "y")).queue(); + else if (value.startsWith("t:")) + event.replyChoiceStrings(List.of(value)).queue(); + else + event.replyChoices(Collections.emptyList()).queue(); } @Override diff --git a/src/main/java/com/alttd/modalManager/modals/ModalRemindMe.java b/src/main/java/com/alttd/modalManager/modals/ModalRemindMe.java index 4286cae..01d8186 100644 --- a/src/main/java/com/alttd/modalManager/modals/ModalRemindMe.java +++ b/src/main/java/com/alttd/modalManager/modals/ModalRemindMe.java @@ -20,6 +20,7 @@ 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 { @@ -46,13 +47,13 @@ public class ModalRemindMe extends DiscordModal { @Override public void execute(ModalInteractionEvent event) { - String title = getValidString(event.getValue("title"), event); + String title = getValidString(event.getValue("title"), event, true); if (title == null) return; - String desc = getValidString(event.getValue("description"), event); + String desc = getValidString(event.getValue("description"), event, false); if (desc == null) - return; + desc = ""; long userId = event.getUser().getIdLong(); RemindMeData remindMeData = pullData(userId); @@ -82,19 +83,20 @@ public class ModalRemindMe extends DiscordModal { return; } - long discordTimestamp = TimeUtil.getDiscordTimestamp(reminder.creationDate()); MessageEmbed messageEmbed = new EmbedBuilder() .setTitle(reminder.title()) .setDescription(reminder.description()) - .setFooter("Requested ") + .appendDescription("\n\nWill remind ") .build(); - ButtonRemindMeConfirm.putReminder(userId, reminder); - event.replyEmbeds(messageEmbed).queue(message -> - message.editOriginalComponents().setActionRow(remindMeConfirm, remindMeCancel) - .queue(RestAction.getDefaultSuccess(), Util::handleFailure)); + 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) { + public String getValidString(ModalMapping modalMapping, ModalInteractionEvent event, boolean required) { if (modalMapping == null) { event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find modal")) .setEphemeral(true).queue(); @@ -103,8 +105,9 @@ public class ModalRemindMe extends DiscordModal { String string = modalMapping.getAsString(); if (string.isEmpty()) { - event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find contents of modal")) - .setEphemeral(true).queue(); + if (required) + event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find contents of modal")) + .setEphemeral(true).queue(); return null; } @@ -114,14 +117,14 @@ public class ModalRemindMe extends DiscordModal { @Override public Modal getModal() { TextInput title = TextInput.create("title", "Title", TextInputStyle.SHORT) - .setPlaceholder("reminder title:") + .setPlaceholder("reminder title") .setRequiredRange(1, 256) .setRequired(true) .build(); TextInput desc = TextInput.create("description", "Description", TextInputStyle.PARAGRAPH) - .setPlaceholder("optional reminder description:") - .setRequiredRange(1, 4096) + .setPlaceholder("optional reminder description") + .setRequiredRange(1, 4000) .setRequired(false) .build(); diff --git a/src/main/java/com/alttd/reminders/ReminderScheduler.java b/src/main/java/com/alttd/reminders/ReminderScheduler.java index 79cb195..89113b2 100644 --- a/src/main/java/com/alttd/reminders/ReminderScheduler.java +++ b/src/main/java/com/alttd/reminders/ReminderScheduler.java @@ -41,7 +41,7 @@ public class ReminderScheduler { else nextReminder = reminders.get(0); ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); - scheduledExecutorService.schedule(new ReminderRun(), 1, TimeUnit.MINUTES); + scheduledExecutorService.scheduleWithFixedDelay(new ReminderRun(), 0, 1, TimeUnit.MINUTES); } @@ -86,11 +86,10 @@ public class ReminderScheduler { } private void sendEmbed(Reminder reminder, TextChannel channel) { - long discordTimestamp = TimeUtil.getDiscordTimestamp(reminder.creationDate()); EmbedBuilder embedBuilder = new EmbedBuilder() .setTitle(reminder.title()) .setDescription(reminder.description()) - .setFooter("Requested "); + .appendDescription("\n\nRequested "); Guild guild = reminder.getGuild(jda); if (guild == null) { sendEmbed(reminder, channel, embedBuilder);