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;
|
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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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.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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user