From a8a38b2c047ff0e664ee3cf5bad188568b3aa6a6 Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Wed, 7 Aug 2024 22:20:30 +0200 Subject: [PATCH] add completions for note aliases --- .../java/me/youhavetrouble/noted/Main.java | 4 +-- .../java/me/youhavetrouble/noted/Storage.java | 25 +++++++++++++++++-- .../noted/listener/SlashCommandListener.java | 17 +++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/youhavetrouble/noted/Main.java b/src/main/java/me/youhavetrouble/noted/Main.java index 111c2ae..92c63e5 100644 --- a/src/main/java/me/youhavetrouble/noted/Main.java +++ b/src/main/java/me/youhavetrouble/noted/Main.java @@ -59,8 +59,8 @@ public class Main { jda.upsertCommand(Commands.slash("note", "Get a note") .setIntegrationTypes(IntegrationType.GUILD_INSTALL, IntegrationType.USER_INSTALL) .addOptions( - new OptionData(OptionType.STRING, "note-id", "The ID of the note").setRequired(true), - new OptionData(OptionType.BOOLEAN, "ephermeal", "Whether the note should be ephermal").setRequired(false) + new OptionData(OptionType.STRING, "note-id", "The ID of the note", true, true), + new OptionData(OptionType.BOOLEAN, "ephermeal", "Whether the note should be ephermal", true) ) .setContexts(InteractionContextType.BOT_DM, InteractionContextType.GUILD, InteractionContextType.PRIVATE_CHANNEL) ).queue(); diff --git a/src/main/java/me/youhavetrouble/noted/Storage.java b/src/main/java/me/youhavetrouble/noted/Storage.java index d757dc8..11235a1 100644 --- a/src/main/java/me/youhavetrouble/noted/Storage.java +++ b/src/main/java/me/youhavetrouble/noted/Storage.java @@ -7,12 +7,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.sql.DataSource; -import java.awt.*; +import java.awt.Color; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import java.util.logging.Logger; @@ -20,6 +22,8 @@ import java.util.logging.Logger; public class Storage { + public final List aliases = new ArrayList<>(); + private final Logger logger = Logger.getLogger("Storage"); private final DataSource dataSource; @@ -47,7 +51,7 @@ public class Storage { } createTables(); - + aliases.addAll(getAliases()); } protected void shutdown() { @@ -113,6 +117,7 @@ public class Storage { statement.setString(2, note.id.toString()); statement.executeUpdate(); + aliases.add(alias); connection.commit(); return Status.SUCCESS; } catch (SQLException e) { @@ -132,6 +137,7 @@ public class Storage { statement.setString(1, alias); statement.setString(2, noteId.toString()); statement.executeUpdate(); + aliases.add(alias); return Status.SUCCESS; } catch (SQLException e) { logger.warning("Failed to add alias"); @@ -139,6 +145,21 @@ public class Storage { } } + public List getAliases() { + try (Connection connection = dataSource.getConnection()) { + PreparedStatement statement = connection.prepareStatement("SELECT alias FROM aliases"); + ResultSet resultSet = statement.executeQuery(); + List aliases = new ArrayList<>(); + while (resultSet.next()) { + aliases.add(resultSet.getString("alias")); + } + return aliases; + } catch (SQLException e) { + logger.warning("Failed to get aliases"); + return new ArrayList<>(); + } + } + @Nullable public Note getNote(@NotNull String alias) { try (Connection connection = dataSource.getConnection()) { diff --git a/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java b/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java index fec6518..63f2951 100644 --- a/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java +++ b/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java @@ -3,12 +3,29 @@ package me.youhavetrouble.noted.listener; import me.youhavetrouble.noted.Main; import me.youhavetrouble.noted.Storage; import me.youhavetrouble.noted.note.Note; +import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.interactions.commands.Command; import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import java.util.List; +import java.util.stream.Collectors; + public class SlashCommandListener extends ListenerAdapter { + @Override + public void onCommandAutoCompleteInteraction(CommandAutoCompleteInteractionEvent event) { + if (event.getName().equals("note") && event.getFocusedOption().getName().equals("note-id")) { + List options = Main.getStorage().aliases.stream() + .filter(word -> word.startsWith(event.getFocusedOption().getValue())) + .map(word -> new Command.Choice(word, word)) + .limit(25) + .collect(Collectors.toList()); + event.replyChoices(options).queue(); + } + } + @Override public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { switch (event.getName()) {