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; package com.alttd.buttonManager.buttons.remindMeConfirm;
import com.alttd.buttonManager.DiscordButton; import com.alttd.buttonManager.DiscordButton;
import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.util.Util; import com.alttd.util.Util;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
import net.dv8tion.jda.api.interactions.components.buttons.Button; 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 { public class ButtonRemindMeCancel extends DiscordButton {
@Override @Override
public String getButtonId() { public String getButtonId() {
@ -13,9 +18,15 @@ public class ButtonRemindMeCancel extends DiscordButton {
@Override @Override
public void execute(ButtonInteractionEvent event) { 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!")) event.replyEmbeds(Util.genericSuccessEmbed("Success", "Cancelled your reminder!"))
.setEphemeral(true).queue(); .setEphemeral(true).queue();
hookAndReminder.interactionHook().editOriginalComponents(List.of()).queue();
} }
@Override @Override

View File

@ -6,20 +6,22 @@ import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.reminders.ReminderScheduler; import com.alttd.reminders.ReminderScheduler;
import com.alttd.util.Util; import com.alttd.util.Util;
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; 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 net.dv8tion.jda.api.interactions.components.buttons.Button;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
public class ButtonRemindMeConfirm extends DiscordButton { 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) { public static synchronized void putReminder(long id, InteractionHook defer, Reminder reminder) {
unconfirmedReminders.put(id, reminder); unconfirmedReminders.put(id, new HookAndReminder(reminder, defer));
} }
public static synchronized Reminder removeReminder(long id) { public static synchronized HookAndReminder removeReminder(long id) {
return unconfirmedReminders.get(id); return unconfirmedReminders.remove(id);
} }
@Override @Override
@ -29,12 +31,13 @@ public class ButtonRemindMeConfirm extends DiscordButton {
@Override @Override
public void execute(ButtonInteractionEvent event) { 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!")) event.replyEmbeds(Util.genericSuccessEmbed("Success", "Your reminder was successfully created!"))
.setEphemeral(true).queue(); .setEphemeral(true).queue();
} }
hookAndReminder.interactionHook().editOriginalComponents(List.of()).queue();
} }
private boolean storeReminder(Reminder reminder, ButtonInteractionEvent event) { 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.entities.channel.unions.GuildChannelUnion;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; 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.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType; 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 net.dv8tion.jda.api.interactions.components.Modal;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class CommandRemindMe extends DiscordCommand { public class CommandRemindMe extends DiscordCommand {
@ -60,7 +63,7 @@ public class CommandRemindMe extends DiscordCommand {
return; return;
} }
ModalRemindMe.putData(event.getIdLong(), channel, fromNow); ModalRemindMe.putData(event.getUser().getIdLong(), channel, fromNow);
event.replyModal(modal).queue(); event.replyModal(modal).queue();
} }
@ -92,7 +95,7 @@ public class CommandRemindMe extends DiscordCommand {
return null; return null;
} }
if (!fromNow.matches("[1-9][0-9]*[dmy]")) { if (!fromNow.matches("[1-9][0-9]*[hdmy]")) {
return fromNowTimestamp(fromNow, event); return fromNowTimestamp(fromNow, event);
} }
@ -106,6 +109,9 @@ public class CommandRemindMe extends DiscordCommand {
} }
switch (fromNow.substring(fromNow.length() - 1)) { switch (fromNow.substring(fromNow.length() - 1)) {
case "h" -> {
return TimeUnit.HOURS.toMillis(i) + new Date().getTime();
}
case "d" -> { case "d" -> {
return TimeUnit.DAYS.toMillis(i) + new Date().getTime(); return TimeUnit.DAYS.toMillis(i) + new Date().getTime();
} }
@ -148,7 +154,24 @@ public class CommandRemindMe extends DiscordCommand {
@Override @Override
public void suggest(CommandAutoCompleteInteractionEvent event) { 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 @Override

View File

@ -20,6 +20,7 @@ import net.dv8tion.jda.api.utils.TimeUtil;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.TimeUnit;
public class ModalRemindMe extends DiscordModal { public class ModalRemindMe extends DiscordModal {
@ -46,13 +47,13 @@ public class ModalRemindMe extends DiscordModal {
@Override @Override
public void execute(ModalInteractionEvent event) { public void execute(ModalInteractionEvent event) {
String title = getValidString(event.getValue("title"), event); String title = getValidString(event.getValue("title"), event, true);
if (title == null) if (title == null)
return; return;
String desc = getValidString(event.getValue("description"), event); String desc = getValidString(event.getValue("description"), event, false);
if (desc == null) if (desc == null)
return; desc = "";
long userId = event.getUser().getIdLong(); long userId = event.getUser().getIdLong();
RemindMeData remindMeData = pullData(userId); RemindMeData remindMeData = pullData(userId);
@ -82,19 +83,20 @@ public class ModalRemindMe extends DiscordModal {
return; return;
} }
long discordTimestamp = TimeUtil.getDiscordTimestamp(reminder.creationDate());
MessageEmbed messageEmbed = new EmbedBuilder() MessageEmbed messageEmbed = new EmbedBuilder()
.setTitle(reminder.title()) .setTitle(reminder.title())
.setDescription(reminder.description()) .setDescription(reminder.description())
.setFooter("Requested <t:" + discordTimestamp + ":R>") .appendDescription("\n\nWill remind <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.remindDate()) + ":R>")
.build(); .build();
ButtonRemindMeConfirm.putReminder(userId, reminder); event.deferReply().setEphemeral(true).queue(defer -> {
event.replyEmbeds(messageEmbed).queue(message -> ButtonRemindMeConfirm.putReminder(userId, defer, reminder);
message.editOriginalComponents().setActionRow(remindMeConfirm, remindMeCancel) defer.editOriginalEmbeds(messageEmbed).queue(message ->
.queue(RestAction.getDefaultSuccess(), Util::handleFailure)); 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) { if (modalMapping == null) {
event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find modal")) event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find modal"))
.setEphemeral(true).queue(); .setEphemeral(true).queue();
@ -103,8 +105,9 @@ public class ModalRemindMe extends DiscordModal {
String string = modalMapping.getAsString(); String string = modalMapping.getAsString();
if (string.isEmpty()) { if (string.isEmpty()) {
event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find contents of modal")) if (required)
.setEphemeral(true).queue(); event.replyEmbeds(Util.genericErrorEmbed("Error", "Couldn't find contents of modal"))
.setEphemeral(true).queue();
return null; return null;
} }
@ -114,14 +117,14 @@ public class ModalRemindMe extends DiscordModal {
@Override @Override
public Modal getModal() { public Modal getModal() {
TextInput title = TextInput.create("title", "Title", TextInputStyle.SHORT) TextInput title = TextInput.create("title", "Title", TextInputStyle.SHORT)
.setPlaceholder("reminder title:") .setPlaceholder("reminder title")
.setRequiredRange(1, 256) .setRequiredRange(1, 256)
.setRequired(true) .setRequired(true)
.build(); .build();
TextInput desc = TextInput.create("description", "Description", TextInputStyle.PARAGRAPH) TextInput desc = TextInput.create("description", "Description", TextInputStyle.PARAGRAPH)
.setPlaceholder("optional reminder description:") .setPlaceholder("optional reminder description")
.setRequiredRange(1, 4096) .setRequiredRange(1, 4000)
.setRequired(false) .setRequired(false)
.build(); .build();

View File

@ -41,7 +41,7 @@ public class ReminderScheduler {
else else
nextReminder = reminders.get(0); nextReminder = reminders.get(0);
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); 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) { private void sendEmbed(Reminder reminder, TextChannel channel) {
long discordTimestamp = TimeUtil.getDiscordTimestamp(reminder.creationDate());
EmbedBuilder embedBuilder = new EmbedBuilder() EmbedBuilder embedBuilder = new EmbedBuilder()
.setTitle(reminder.title()) .setTitle(reminder.title())
.setDescription(reminder.description()) .setDescription(reminder.description())
.setFooter("Requested <t:" + discordTimestamp + ":R>"); .appendDescription("\n\nRequested <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.creationDate()) + ":R>");
Guild guild = reminder.getGuild(jda); Guild guild = reminder.getGuild(jda);
if (guild == null) { if (guild == null) {
sendEmbed(reminder, channel, embedBuilder); sendEmbed(reminder, channel, embedBuilder);