From d17d5bf55fcb04c0e05ed8525e870d063c43992f Mon Sep 17 00:00:00 2001 From: YouHaveTrouble Date: Fri, 9 Aug 2024 23:13:40 +0200 Subject: [PATCH] deleting notes --- .../java/me/youhavetrouble/noted/Main.java | 8 +++ .../java/me/youhavetrouble/noted/Storage.java | 28 ++++++--- .../noted/listener/SlashCommandListener.java | 57 +++++++++++++++++-- 3 files changed, 82 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/youhavetrouble/noted/Main.java b/src/main/java/me/youhavetrouble/noted/Main.java index 5e412ef..f64cfbf 100644 --- a/src/main/java/me/youhavetrouble/noted/Main.java +++ b/src/main/java/me/youhavetrouble/noted/Main.java @@ -176,6 +176,14 @@ public class Main { ) .setContexts(InteractionContextType.BOT_DM) ).queue(); + + jda.upsertCommand(Commands.slash("delete-note", "Delete a note") + .setIntegrationTypes(IntegrationType.USER_INSTALL) + .addOptions( + new OptionData(OptionType.STRING, "alias", "The ID of the note", true, true) + ) + .setContexts(InteractionContextType.BOT_DM) + ).queue(); } private static void loadProperties() { diff --git a/src/main/java/me/youhavetrouble/noted/Storage.java b/src/main/java/me/youhavetrouble/noted/Storage.java index 3adcc2a..280c92c 100644 --- a/src/main/java/me/youhavetrouble/noted/Storage.java +++ b/src/main/java/me/youhavetrouble/noted/Storage.java @@ -13,9 +13,7 @@ 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.*; import java.util.logging.Logger; public class Storage { @@ -150,6 +148,20 @@ public class Storage { } } + public Status deleteNote(@NotNull UUID noteId) { + try (Connection connection = dataSource.getConnection()) { + PreparedStatement statement = connection.prepareStatement("DELETE FROM notes WHERE id = ?"); + statement.setString(1, noteId.toString()); + statement.executeUpdate(); + statement = connection.prepareStatement("DELETE FROM aliases WHERE note_id = ?"); + statement.setString(1, noteId.toString()); + statement.executeUpdate(); + return Status.SUCCESS; + } catch (SQLException e) { + return Status.ERROR; + } + } + public Status addAlias(@NotNull String alias, @NotNull UUID noteId) throws RuntimeException { try (Connection connection = dataSource.getConnection()) { PreparedStatement statement = connection.prepareStatement(""" @@ -167,18 +179,18 @@ public class Storage { } } - public List getAliases() { + public Set getAliases() { try (Connection connection = dataSource.getConnection()) { PreparedStatement statement = connection.prepareStatement("SELECT alias FROM aliases"); ResultSet resultSet = statement.executeQuery(); - List aliases = new ArrayList<>(); + Set aliases = new HashSet<>(); while (resultSet.next()) { aliases.add(resultSet.getString("alias")); } return aliases; } catch (SQLException e) { logger.warning("Failed to get aliases"); - return new ArrayList<>(); + return new HashSet<>(); } } @@ -194,6 +206,9 @@ public class Storage { """); statement.setString(1, alias); ResultSet resultSet = statement.executeQuery(); + if (!resultSet.next()) { + return null; + } Color color = null; try { @@ -201,7 +216,6 @@ public class Storage { } catch (SQLException ignored) { } - return new Note( UUID.fromString(resultSet.getString("id")), resultSet.getString("title"), diff --git a/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java b/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java index 69ded2e..38a1434 100644 --- a/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java +++ b/src/main/java/me/youhavetrouble/noted/listener/SlashCommandListener.java @@ -11,6 +11,7 @@ import net.dv8tion.jda.api.interactions.commands.OptionMapping; import java.awt.Color; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; public class SlashCommandListener extends ListenerAdapter { @@ -28,11 +29,16 @@ public class SlashCommandListener extends ListenerAdapter { "footer-url" ); + private final Set aliases; + + public SlashCommandListener() { + aliases = Main.getStorage().getAliases(); + } + @Override public void onCommandAutoCompleteInteraction(CommandAutoCompleteInteractionEvent event) { - if (!event.getName().equals("note") || event.getName().equals("edit-note")) return; if (!event.getFocusedOption().getName().equals("alias")) return; - List options = Main.getStorage().aliases.stream() + List options = aliases.stream() .filter(word -> word.startsWith(event.getFocusedOption().getValue())) .map(word -> new Command.Choice(word, word)) .limit(25) @@ -86,6 +92,16 @@ public class SlashCommandListener extends ListenerAdapter { } editNote(event); } + case "delete-note" -> { + Long adminId = Main.getAdminId(); + if (adminId == null || !adminId.equals(event.getUser().getIdLong())) { + event.reply("You do not have permission to use this command.") + .setEphemeral(true) + .queue(); + return; + } + deleteNote(event); + } default -> event.reply("Unknown command.") .setEphemeral(true) @@ -96,7 +112,7 @@ public class SlashCommandListener extends ListenerAdapter { private void getNote(SlashCommandInteractionEvent event, String noteAlias, boolean ephemeral) { Note note = Main.getStorage().getNote(noteAlias); if (note == null) { - event.reply("Note with ID %s not found.".formatted(noteAlias)) + event.reply("Note with alias %s not found.".formatted(noteAlias)) .setEphemeral(true) .queue(); return; @@ -168,9 +184,11 @@ public class SlashCommandListener extends ListenerAdapter { note = note.withFooterUrl(footerUrlOption.getAsString()); } - Storage.Status status = Main.getStorage().addNote(note, aliasOption.getAsString()); + String alias = aliasOption.getAsString(); + Storage.Status status = Main.getStorage().addNote(note, alias); if (status == Storage.Status.SUCCESS) { + aliases.add(alias); event.reply("Note added.") .setEphemeral(true) .queue(); @@ -292,4 +310,35 @@ public class SlashCommandListener extends ListenerAdapter { } + private void deleteNote(SlashCommandInteractionEvent event) { + OptionMapping noteAliasMapping = event.getOption("alias"); + if (noteAliasMapping == null) { + event.reply("Please provide a note alias.") + .setEphemeral(true) + .queue(); + return; + } + String noteAlias = noteAliasMapping.getAsString(); + + Note note = Main.getStorage().getNote(noteAlias); + if (note == null) { + event.reply("Note with alias %s not found.".formatted(noteAlias)) + .setEphemeral(true) + .queue(); + return; + } + + Storage.Status status = Main.getStorage().deleteNote(note.id); + if (status == Storage.Status.SUCCESS) { + aliases.remove(noteAlias); + event.reply("Note deleted.") + .setEphemeral(true) + .queue(); + } else { + event.reply("Failed to delete note.") + .setEphemeral(true) + .queue(); + } + } + }