Skip to content

Commit 6ddf8ea

Browse files
authored
Added cancel feature to reminder command (#737)
* added cancel feature to reminders * removed cancel all command * code fixes
1 parent bf190c6 commit 6ddf8ea

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

application/src/main/java/org/togetherjava/tjbot/commands/reminder/ReminderCommand.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import net.dv8tion.jda.api.entities.User;
88
import net.dv8tion.jda.api.entities.emoji.Emoji;
99
import net.dv8tion.jda.api.entities.emoji.EmojiUnion;
10+
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
1011
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
1112
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
13+
import net.dv8tion.jda.api.interactions.AutoCompleteQuery;
1214
import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback;
15+
import net.dv8tion.jda.api.interactions.commands.Command;
1316
import net.dv8tion.jda.api.interactions.commands.OptionType;
1417
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
1518
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
@@ -24,6 +27,7 @@
2427
import org.togetherjava.tjbot.commands.SlashCommandAdapter;
2528
import org.togetherjava.tjbot.commands.utils.MessageUtils;
2629
import org.togetherjava.tjbot.commands.utils.Pagination;
30+
import org.togetherjava.tjbot.commands.utils.StringDistances;
2731
import org.togetherjava.tjbot.db.Database;
2832
import org.togetherjava.tjbot.db.generated.tables.records.PendingRemindersRecord;
2933

@@ -54,6 +58,8 @@
5458
public final class ReminderCommand extends SlashCommandAdapter {
5559
private static final String COMMAND_NAME = "reminder";
5660
private static final String LIST_SUBCOMMAND = "list";
61+
private static final String CANCEL_COMMAND = "cancel";
62+
private static final String CANCEL_REMINDER_OPTION = "reminder";
5763
static final String CREATE_SUBCOMMAND = "create";
5864
static final String TIME_AMOUNT_OPTION = "time-amount";
5965
static final String TIME_UNIT_OPTION = "time-unit";
@@ -94,6 +100,9 @@ public ReminderCommand(Database database) {
94100
getData().addSubcommands(
95101
new SubcommandData(CREATE_SUBCOMMAND, "creates a reminder").addOptions(timeAmount,
96102
timeUnit, content),
103+
new SubcommandData(CANCEL_COMMAND, "cancels a pending reminder").addOption(
104+
OptionType.STRING, CANCEL_REMINDER_OPTION, "reminder to cancel", true,
105+
true),
97106
new SubcommandData(LIST_SUBCOMMAND, "shows all your currently pending reminders"));
98107

99108
this.database = database;
@@ -103,6 +112,7 @@ public ReminderCommand(Database database) {
103112
public void onSlashCommand(SlashCommandInteractionEvent event) {
104113
switch (event.getSubcommandName()) {
105114
case CREATE_SUBCOMMAND -> handleCreateCommand(event);
115+
case CANCEL_COMMAND -> handleCancelCommand(event);
106116
case LIST_SUBCOMMAND -> handleListCommand(event);
107117
default -> throw new AssertionError(
108118
"Unexpected Subcommand: " + event.getSubcommandName());
@@ -127,6 +137,25 @@ public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
127137
event.editMessage(MessageEditData.fromCreateData(message)).queue();
128138
}
129139

140+
@Override
141+
public void onAutoComplete(CommandAutoCompleteInteractionEvent event) {
142+
AutoCompleteQuery focusedOption = event.getFocusedOption();
143+
144+
if (!focusedOption.getName().equals(CANCEL_REMINDER_OPTION)) {
145+
throw new AssertionError("Unexpected option, was : " + focusedOption.getName());
146+
}
147+
148+
List<String> pendingReminders = getPendingReminders(event.getGuild(), event.getUser())
149+
.map(PendingRemindersRecord::getContent);
150+
List<Command.Choice> choices = StringDistances
151+
.closeMatches(focusedOption.getValue(), pendingReminders, REMINDERS_PER_PAGE)
152+
.stream()
153+
.map(content -> new Command.Choice(content, content))
154+
.toList();
155+
156+
event.replyChoices(choices).queue();
157+
}
158+
130159
private void handleCreateCommand(SlashCommandInteractionEvent event) {
131160
int timeAmount = Math.toIntExact(event.getOption(TIME_AMOUNT_OPTION).getAsLong());
132161
String timeUnit = event.getOption(TIME_UNIT_OPTION).getAsString();
@@ -157,6 +186,17 @@ private void handleCreateCommand(SlashCommandInteractionEvent event) {
157186
.insert());
158187
}
159188

189+
private void handleCancelCommand(SlashCommandInteractionEvent event) {
190+
String content = event.getOption(CANCEL_REMINDER_OPTION).getAsString();
191+
192+
database.write(context -> context.delete(PENDING_REMINDERS)
193+
.where(PENDING_REMINDERS.CONTENT.eq(content)
194+
.and(PENDING_REMINDERS.AUTHOR_ID.eq(event.getUser().getIdLong())))
195+
.execute());
196+
197+
event.reply("Your reminder is canceled").setEphemeral(true).queue();
198+
}
199+
160200
private void handleListCommand(SlashCommandInteractionEvent event) {
161201
Result<PendingRemindersRecord> pendingReminders =
162202
getPendingReminders(event.getGuild(), event.getUser());

0 commit comments

Comments
 (0)