Fixed buttons not removing after clicking them

Added hour option
Fixed reminder not working without description
Fixed using snowflake instead of timestamp for relative time
This commit is contained in:
Teriuihi 2022-09-21 23:43:24 +02:00
parent 3c4213f188
commit be890af51f
6 changed files with 76 additions and 29 deletions

View File

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

View File

@ -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<Long, Reminder> unconfirmedReminders = new HashMap<>();
private static final HashMap<Long, HookAndReminder> 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) {

View File

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

View File

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

View File

@ -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 <t:" + discordTimestamp + ":R>")
.appendDescription("\n\nWill remind <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.remindDate()) + ":R>")
.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();

View File

@ -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 <t:" + discordTimestamp + ":R>");
.appendDescription("\n\nRequested <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.creationDate()) + ":R>");
Guild guild = reminder.getGuild(jda);
if (guild == null) {
sendEmbed(reminder, channel, embedBuilder);