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:
parent
3c4213f188
commit
be890af51f
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user