From 53383d033be307154bcf37923fb0d1a7d04bcd52 Mon Sep 17 00:00:00 2001 From: nltbee Date: Thu, 17 Mar 2022 13:03:32 +0100 Subject: [PATCH 1/3] Upgrade JDA to alpha 3 --- application/build.gradle | 6 +---- .../tjbot/commands/MessageReceiver.java | 8 +++--- .../commands/MessageReceiverAdapter.java | 12 ++++----- .../commands/basic/VcActivityCommand.java | 5 ++-- .../tjbot/commands/free/ChannelMonitor.java | 2 +- .../tjbot/commands/free/FreeCommand.java | 26 +++++++++++-------- .../tjbot/commands/system/BotCore.java | 26 +++++++++++-------- .../tophelper/TopHelpersMessageListener.java | 6 ++--- 8 files changed, 47 insertions(+), 44 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index 3ed6987a3f..1f4f66bc41 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -13,10 +13,6 @@ plugins { repositories { mavenCentral() - maven { - name 'm2-dv8tion' - url 'https://m2.dv8tion.net/releases' - } } var outputImage = 'togetherjava.duckdns.org:5001/togetherjava/tjbot:' + System.getenv('BRANCH_NAME') ?: 'latest' @@ -45,7 +41,7 @@ shadowJar { dependencies { implementation project(':database') - implementation 'net.dv8tion:JDA:4.4.0_352' + implementation 'net.dv8tion:JDA:5.0.0-alpha.3' implementation 'org.apache.logging.log4j:log4j-core:2.16.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.16.0' diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiver.java b/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiver.java index e43284ee31..ee679a47f0 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiver.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiver.java @@ -1,7 +1,7 @@ package org.togetherjava.tjbot.commands; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; -import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import org.jetbrains.annotations.NotNull; import java.util.regex.Pattern; @@ -38,7 +38,7 @@ public interface MessageReceiver extends Feature { * @param event the event that triggered this, containing information about the corresponding * message that was sent and received */ - void onMessageReceived(@NotNull GuildMessageReceivedEvent event); + void onMessageReceived(@NotNull MessageReceivedEvent event); /** * Triggered by the core system whenever an existing message was edited in a text channel of a @@ -47,5 +47,5 @@ public interface MessageReceiver extends Feature { * @param event the event that triggered this, containing information about the corresponding * message that was edited */ - void onMessageUpdated(@NotNull GuildMessageUpdateEvent event); + void onMessageUpdated(@NotNull MessageUpdateEvent event); } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiverAdapter.java b/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiverAdapter.java index 506d2aa6e7..3d13b3b3e9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiverAdapter.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/MessageReceiverAdapter.java @@ -1,7 +1,7 @@ package org.togetherjava.tjbot.commands; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; -import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import org.jetbrains.annotations.NotNull; import java.util.regex.Pattern; @@ -10,8 +10,8 @@ * Adapter implementation of a {@link MessageReceiver}. A new receiver can then be registered by * adding it to {@link Features}. *

- * {@link #onMessageReceived(GuildMessageReceivedEvent)} and - * {@link #onMessageUpdated(GuildMessageUpdateEvent)} can be overridden if desired. The default + * {@link #onMessageReceived(MessageReceivedEvent)} and + * {@link #onMessageUpdated(MessageUpdateEvent)} can be overridden if desired. The default * implementation is empty, the adapter will not react to such events. */ public abstract class MessageReceiverAdapter implements MessageReceiver { @@ -35,13 +35,13 @@ protected MessageReceiverAdapter(@NotNull Pattern channelNamePattern) { @SuppressWarnings("NoopMethodInAbstractClass") @Override - public void onMessageReceived(@NotNull GuildMessageReceivedEvent event) { + public void onMessageReceived(@NotNull MessageReceivedEvent event) { // Adapter does not react by default, subclasses may change this behavior } @SuppressWarnings("NoopMethodInAbstractClass") @Override - public void onMessageUpdated(@NotNull GuildMessageUpdateEvent event) { + public void onMessageUpdated(@NotNull MessageUpdateEvent event) { // Adapter does not react by default, subclasses may change this behavior } } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java index 6c575e43af..3338a892c6 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java @@ -122,7 +122,8 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { GuildVoiceState voiceState = Objects.requireNonNull(member.getVoiceState(), "Voicestates aren't being cached, check the JDABuilder"); - if (!voiceState.inVoiceChannel()) { + if (!voiceState.inAudioChannel() + || !(voiceState.getChannel() instanceof VoiceChannel voiceChannel)) { event.reply("You need to be in a voicechannel to run this command!") .setEphemeral(true) .queue(); @@ -130,8 +131,6 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { return; } - VoiceChannel voiceChannel = Objects.requireNonNull(voiceState.getChannel()); - Member selfMember = Objects.requireNonNull(event.getGuild()).getSelfMember(); if (!selfMember.hasPermission(Permission.CREATE_INSTANT_INVITE)) { event.reply("The bot needs the create instant invite permission!") diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/free/ChannelMonitor.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/ChannelMonitor.java index af2619dfc9..7eec12bb24 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/free/ChannelMonitor.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/free/ChannelMonitor.java @@ -215,7 +215,7 @@ public String statusMessage(@NotNull final Guild guild) { // pointless ... added to remove warnings continue; } - Category category = channel.getParent(); + Category category = channel.getParentCategory(); if (category != null && !category.getName().equals(categoryName)) { categoryName = category.getName(); // append the category name on a new line with markup for underlining diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java index ee289c0402..b4da6a8fdf 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java @@ -9,7 +9,7 @@ import net.dv8tion.jda.api.events.GenericEvent; import net.dv8tion.jda.api.events.ReadyEvent; import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -289,26 +289,30 @@ private void checkBusyStatusAllChannels(@NotNull JDA jda) { public void onEvent(@NotNull GenericEvent event) { if (event instanceof ReadyEvent readyEvent) { onReady(readyEvent); - } else if (event instanceof GuildMessageReceivedEvent guildEvent) { - if (guildEvent.isWebhookMessage() || guildEvent.getAuthor().isBot()) { + } else if (event instanceof MessageReceivedEvent messageEvent) { + if (messageEvent.isFromGuild()) { return; } - if (!channelMonitor.isMonitoringChannel(guildEvent.getChannel().getIdLong())) { + + if (messageEvent.isWebhookMessage() || messageEvent.getAuthor().isBot()) { + return; + } + if (!channelMonitor.isMonitoringChannel(messageEvent.getChannel().getIdLong())) { logger.debug( "Channel is not being monitored, ignoring message received in {} from {}", - guildEvent.getChannel().getName(), guildEvent.getAuthor()); + messageEvent.getChannel().getName(), messageEvent.getAuthor()); return; } - if (channelMonitor.isChannelBusy(guildEvent.getChannel().getIdLong())) { + if (channelMonitor.isChannelBusy(messageEvent.getChannel().getIdLong())) { logger.debug( "Channel status is currently busy, ignoring message received in {} from {}", - guildEvent.getChannel().getName(), guildEvent.getAuthor()); + messageEvent.getChannel().getName(), messageEvent.getAuthor()); return; } - channelMonitor.setChannelBusy(guildEvent.getChannel().getIdLong(), - guildEvent.getAuthor().getIdLong()); - displayStatus(channelMonitor.getStatusChannelFor(guildEvent.getGuild())); - guildEvent.getMessage().reply(UserStrings.NEW_QUESTION.message()).queue(); + channelMonitor.setChannelBusy(messageEvent.getChannel().getIdLong(), + messageEvent.getAuthor().getIdLong()); + displayStatus(channelMonitor.getStatusChannelFor(messageEvent.getGuild())); + messageEvent.getMessage().reply(UserStrings.NEW_QUESTION.message()).queue(); } } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java b/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java index ce68ecde5f..913a571ec1 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java @@ -2,15 +2,15 @@ import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.entities.AbstractChannel; +import net.dv8tion.jda.api.entities.Channel; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.events.ReadyEvent; import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; -import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import net.dv8tion.jda.api.exceptions.ErrorHandler; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.interactions.commands.Command; @@ -152,19 +152,23 @@ public void onReady(@NotNull ReadyEvent event) { } @Override - public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) { - getMessageReceiversSubscribedTo(event.getChannel()) - .forEach(messageReceiver -> messageReceiver.onMessageReceived(event)); + public void onMessageReceived(@NotNull final MessageReceivedEvent event) { + if (event.isFromGuild()) { + getMessageReceiversSubscribedTo(event.getChannel()) + .forEach(messageReceiver -> messageReceiver.onMessageReceived(event)); + } } @Override - public void onGuildMessageUpdate(@NotNull GuildMessageUpdateEvent event) { - getMessageReceiversSubscribedTo(event.getChannel()) - .forEach(messageReceiver -> messageReceiver.onMessageUpdated(event)); + public void onMessageUpdate(@NotNull final MessageUpdateEvent event) { + if (event.isFromGuild()) { + getMessageReceiversSubscribedTo(event.getChannel()) + .forEach(messageReceiver -> messageReceiver.onMessageUpdated(event)); + } } private @NotNull Stream getMessageReceiversSubscribedTo( - @NotNull AbstractChannel channel) { + @NotNull Channel channel) { String channelName = channel.getName(); return channelNameToMessageReceiver.entrySet() .stream() @@ -279,7 +283,7 @@ private static void handleRegisterErrors(Throwable ex, Guild guild) { Optional channelToReportTo = guild.getTextChannelCache() .stream() .filter(channel -> guild.getPublicRole() - .hasPermission(channel, Permission.MESSAGE_WRITE)) + .hasPermission(channel, Permission.MESSAGE_SEND)) .findAny(); // Report the problem to the guild diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersMessageListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersMessageListener.java index fadb5b50ff..ff7ce406e8 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersMessageListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersMessageListener.java @@ -1,6 +1,6 @@ package org.togetherjava.tjbot.commands.tophelper; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; import org.togetherjava.tjbot.config.Config; @@ -28,7 +28,7 @@ public TopHelpersMessageListener(@NotNull Database database) { } @Override - public void onMessageReceived(@NotNull GuildMessageReceivedEvent event) { + public void onMessageReceived(@NotNull MessageReceivedEvent event) { if (event.getAuthor().isBot() || event.isWebhookMessage()) { return; } @@ -36,7 +36,7 @@ public void onMessageReceived(@NotNull GuildMessageReceivedEvent event) { addMessageRecord(event); } - private void addMessageRecord(@NotNull GuildMessageReceivedEvent event) { + private void addMessageRecord(@NotNull MessageReceivedEvent event) { database.write(context -> context.newRecord(HELP_CHANNEL_MESSAGES) .setMessageId(event.getMessage().getIdLong()) .setGuildId(event.getGuild().getIdLong()) From 7eb71988fc9f12da0941055bb04292cd199be480 Mon Sep 17 00:00:00 2001 From: nltbee Date: Thu, 17 Mar 2022 13:41:12 +0100 Subject: [PATCH 2/3] Upgrade JDA to alpha 5 --- application/build.gradle | 2 +- .../org/togetherjava/tjbot/Application.java | 2 +- .../tjbot/commands/SlashCommand.java | 41 +++++++++-------- .../tjbot/commands/SlashCommandAdapter.java | 32 +++++++------- .../tjbot/commands/basic/PingCommand.java | 4 +- .../commands/basic/RoleSelectCommand.java | 33 +++++++------- .../commands/basic/VcActivityCommand.java | 15 ++++--- .../commands/componentids/ComponentId.java | 3 +- .../componentids/ComponentIdGenerator.java | 5 +-- .../componentids/ComponentIdParser.java | 4 +- .../componentids/ComponentIdStore.java | 3 +- .../commands/componentids/package-info.java | 2 +- .../tjbot/commands/free/FreeCommand.java | 8 ++-- .../tjbot/commands/free/FreeUtil.java | 4 +- .../commands/mathcommands/TeXCommand.java | 12 ++--- .../commands/moderation/AuditCommand.java | 9 ++-- .../tjbot/commands/moderation/BanCommand.java | 13 +++--- .../commands/moderation/KickCommand.java | 16 ++++--- .../commands/moderation/ModerationUtils.java | 17 +++---- .../commands/moderation/MuteCommand.java | 11 ++--- .../commands/moderation/UnbanCommand.java | 11 ++--- .../commands/moderation/UnmuteCommand.java | 11 ++--- .../commands/moderation/WarnCommand.java | 10 ++--- .../tjbot/commands/system/BotCore.java | 12 ++--- .../tjbot/commands/system/ReloadCommand.java | 12 ++--- .../tjbot/commands/tags/TagCommand.java | 8 ++-- .../tjbot/commands/tags/TagManageCommand.java | 16 +++---- .../tjbot/commands/tags/TagSystem.java | 8 ++-- .../tjbot/commands/tags/TagsCommand.java | 11 ++--- .../commands/tophelper/TopHelpersCommand.java | 12 ++--- .../tjbot/commands/utils/MessageUtils.java | 2 +- .../commands/SlashCommandAdapterTest.java | 10 ++--- .../tjbot/commands/basic/PingCommandTest.java | 4 +- .../org/togetherjava/tjbot/jda/JdaTester.java | 26 +++++------ ... SlashCommandInteractionEventBuilder.java} | 44 +++++++++---------- 35 files changed, 224 insertions(+), 209 deletions(-) rename application/src/test/java/org/togetherjava/tjbot/jda/{SlashCommandEventBuilder.java => SlashCommandInteractionEventBuilder.java} (82%) diff --git a/application/build.gradle b/application/build.gradle index 1f4f66bc41..6929cafd39 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -41,7 +41,7 @@ shadowJar { dependencies { implementation project(':database') - implementation 'net.dv8tion:JDA:5.0.0-alpha.3' + implementation 'net.dv8tion:JDA:5.0.0-alpha.5' implementation 'org.apache.logging.log4j:log4j-core:2.16.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.16.0' diff --git a/application/src/main/java/org/togetherjava/tjbot/Application.java b/application/src/main/java/org/togetherjava/tjbot/Application.java index 7383bebb8d..f821d18c31 100644 --- a/application/src/main/java/org/togetherjava/tjbot/Application.java +++ b/application/src/main/java/org/togetherjava/tjbot/Application.java @@ -20,7 +20,7 @@ * Main class of the application. Use {@link #main(String[])} to start an instance of it. *

* New commands can be created by implementing - * {@link net.dv8tion.jda.api.events.interaction.SlashCommandEvent} or extending + * {@link net.dv8tion.jda.api.events.interaction.SlashCommandInteractionEvent} or extending * {@link org.togetherjava.tjbot.commands.SlashCommandAdapter}. They can then be registered in * {@link Features}. */ diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java index a5a01c20e8..d41d8d7b3f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java @@ -1,12 +1,15 @@ package org.togetherjava.tjbot.commands; import net.dv8tion.jda.api.entities.Emoji; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; import net.dv8tion.jda.api.interactions.commands.build.CommandData; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; +import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.componentids.ComponentId; import org.togetherjava.tjbot.commands.componentids.ComponentIdGenerator; @@ -28,9 +31,9 @@ * is then to be returned by {@link #getData()} where the system will then pick it up from. *

* After registration, the system will notify a command whenever one of its corresponding slash - * commands ({@link #onSlashCommand(SlashCommandEvent)}), buttons - * ({@link #onButtonClick(ButtonClickEvent, List)}) or menus - * ({@link #onSelectionMenu(SelectionMenuEvent, List)}) have been triggered. + * commands ({@link #onSlashCommand(SlashCommandInteractionEvent)}), buttons + * ({@link #onButtonClick(ButtonInteractionEvent, List)}) or menus + * ({@link #onSelectionMenu(SelectMenuInteractionEvent, List)}) have been triggered. *

*

* Some example commands are available in {@link org.togetherjava.tjbot.commands.basic}. @@ -40,7 +43,7 @@ public interface SlashCommand extends Feature { /** * Gets the name of the command. *

- * Requirements for this are documented in {@link CommandData#CommandData(String, String)}. + * Requirements for this are documented in {@link Commands#slash(String, String)}. *

*

* After registration of the command, the name must not change anymore. @@ -53,7 +56,7 @@ public interface SlashCommand extends Feature { /** * Gets the description of the command. *

- * Requirements for this are documented in {@link CommandData#CommandData(String, String)}. + * Requirements for this are documented in {@link Commands#slash(String, String)}. *

*

* After registration of the command, the description must not change anymore. @@ -89,7 +92,7 @@ public interface SlashCommand extends Feature { * @return the command data of this command */ @NotNull - CommandData getData(); + SlashCommandData getData(); /** * Triggered by the core system when a slash command corresponding to this implementation (based @@ -104,7 +107,7 @@ public interface SlashCommand extends Feature { *

* Buttons or menus have to be created with a component ID (see * {@link ComponentInteraction#getComponentId()}, - * {@link net.dv8tion.jda.api.interactions.components.Button#of(ButtonStyle, String, Emoji)}) in + * {@link Button#of(ButtonStyle, String, Emoji)}}) in * a very specific format, otherwise the core system will fail to identify the command that * corresponded to the button or menu click event and is unable to route it back. *

@@ -115,8 +118,8 @@ public interface SlashCommand extends Feature { * given to {@link #acceptComponentIdGenerator(ComponentIdGenerator)} during system setup. The * required {@link ComponentId} instance accepts optional extra arguments, which, if provided, * can be picked up during the corresponding event (see - * {@link #onButtonClick(ButtonClickEvent, List)}, - * {@link #onSelectionMenu(SelectionMenuEvent, List)}). + * {@link #onButtonClick(ButtonInteractionEvent, List)}, + * {@link #onSelectionMenu(SelectMenuInteractionEvent, List)}). *

* Alternatively, if {@link SlashCommandAdapter} has been extended, it also offers a handy * {@link SlashCommandAdapter#generateComponentId(String...)} method to ease the flow. @@ -129,7 +132,7 @@ public interface SlashCommand extends Feature { * * @param event the event that triggered this */ - void onSlashCommand(@NotNull SlashCommandEvent event); + void onSlashCommand(@NotNull SlashCommandInteractionEvent event); /** * Triggered by the core system when a button corresponding to this implementation (based on @@ -147,9 +150,9 @@ public interface SlashCommand extends Feature { * * @param event the event that triggered this * @param args the arguments transported with the button, see - * {@link #onSlashCommand(SlashCommandEvent)} for details on how these are created + * {@link #onSlashCommand(SlashCommandInteractionEvent)} for details on how these are created */ - void onButtonClick(@NotNull ButtonClickEvent event, @NotNull List args); + void onButtonClick(@NotNull ButtonInteractionEvent event, @NotNull List args); /** * Triggered by the core system when a selection menu corresponding to this implementation @@ -167,14 +170,14 @@ public interface SlashCommand extends Feature { * * @param event the event that triggered this * @param args the arguments transported with the selection menu, see - * {@link #onSlashCommand(SlashCommandEvent)} for details on how these are created + * {@link #onSlashCommand(SlashCommandInteractionEvent)} for details on how these are created */ - void onSelectionMenu(@NotNull SelectionMenuEvent event, @NotNull List args); + void onSelectionMenu(@NotNull SelectMenuInteractionEvent event, @NotNull List args); /** * Triggered by the core system during its setup phase. It will provide the command a component * id generator through this method, which can be used to generate component ids, as used for - * button or selection menus. See {@link #onSlashCommand(SlashCommandEvent)} for details on how + * button or selection menus. See {@link #onSlashCommand(SlashCommandInteractionEvent)} for details on how * to use this. * * @param generator the provided component id generator diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommandAdapter.java b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommandAdapter.java index f49d82a639..cd2c2f4770 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommandAdapter.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommandAdapter.java @@ -1,9 +1,11 @@ package org.togetherjava.tjbot.commands; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.componentids.ComponentId; import org.togetherjava.tjbot.commands.componentids.ComponentIdGenerator; @@ -15,11 +17,11 @@ /** * Adapter implementation of a {@link SlashCommand}. The minimal setup only requires implementation - * of {@link #onSlashCommand(SlashCommandEvent)}. A new command can then be registered by adding it + * of {@link #onSlashCommand(SlashCommandInteractionEvent)}. A new command can then be registered by adding it * to {@link Features}. *

- * Further, {@link #onButtonClick(ButtonClickEvent, List)} and - * {@link #onSelectionMenu(SelectionMenuEvent, List)} can be overridden if desired. The default + * Further, {@link #onButtonClick(ButtonInteractionEvent, List)} and + * {@link #onSelectionMenu(SelectMenuInteractionEvent, List)} can be overridden if desired. The default * implementation is empty, the adapter will not react to such events. *

*

@@ -31,7 +33,7 @@ *

* If implementations want to add buttons or selection menus, it is highly advised to use component * IDs generated by {@link #generateComponentId(String...)}, which will automatically create IDs - * that are valid per {@link SlashCommand#onSlashCommand(SlashCommandEvent)}. + * that are valid per {@link SlashCommand#onSlashCommand(SlashCommandInteractionEvent)}. *

*

* Some example commands are available in {@link org.togetherjava.tjbot.commands.basic}. A minimal @@ -46,7 +48,7 @@ * } * * @Override - * public void onSlashCommand(@NotNull SlashCommandEvent event) { + * public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { * event.reply("Pong!").queue(); * } * } @@ -59,7 +61,7 @@ public abstract class SlashCommandAdapter implements SlashCommand { private final String name; private final String description; private final SlashCommandVisibility visibility; - private final CommandData data; + private final SlashCommandData data; private ComponentIdGenerator componentIdGenerator; /** @@ -77,7 +79,7 @@ protected SlashCommandAdapter(@NotNull String name, @NotNull String description, this.description = description; this.visibility = visibility; - data = new CommandData(name, description); + data = Commands.slash(name, description); } @Override @@ -96,7 +98,7 @@ protected SlashCommandAdapter(@NotNull String name, @NotNull String description, } @Override - public final @NotNull CommandData getData() { + public final @NotNull SlashCommandData getData() { return data; } @@ -107,19 +109,19 @@ public final void acceptComponentIdGenerator(@NotNull ComponentIdGenerator gener @SuppressWarnings("NoopMethodInAbstractClass") @Override - public void onButtonClick(@NotNull ButtonClickEvent event, @NotNull List args) { + public void onButtonClick(@NotNull ButtonInteractionEvent event, @NotNull List args) { // Adapter does not react by default, subclasses may change this behavior } @SuppressWarnings("NoopMethodInAbstractClass") @Override - public void onSelectionMenu(@NotNull SelectionMenuEvent event, @NotNull List args) { + public void onSelectionMenu(@NotNull SelectMenuInteractionEvent event, @NotNull List args) { // Adapter does not react by default, subclasses may change this behavior } /** * Helper method to generate component IDs that are considered valid per - * {@link SlashCommand#onSlashCommand(SlashCommandEvent)}. + * {@link SlashCommand#onSlashCommand(SlashCommandInteractionEvent)}. *

* They can be used to create buttons or selection menus and transport additional data * throughout the event (e.g. the user id who created the button dialog). @@ -138,7 +140,7 @@ public void onSelectionMenu(@NotNull SelectionMenuEvent event, @NotNull List * They can be used to create buttons or selection menus and transport additional data * throughout the event (e.g. the user id who created the button dialog). diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/basic/PingCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/basic/PingCommand.java index eec68480c3..17928dbd7f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/basic/PingCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/basic/PingCommand.java @@ -1,6 +1,6 @@ package org.togetherjava.tjbot.commands.basic; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.SlashCommandAdapter; import org.togetherjava.tjbot.commands.SlashCommandVisibility; @@ -24,7 +24,7 @@ public PingCommand() { * @param event the corresponding event */ @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { event.reply("Pong!").queue(); } } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/basic/RoleSelectCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/basic/RoleSelectCommand.java index c7931e86ef..2939b662dd 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/basic/RoleSelectCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/basic/RoleSelectCommand.java @@ -4,17 +4,18 @@ import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; -import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; import net.dv8tion.jda.api.interactions.components.ActionRow; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; +import net.dv8tion.jda.api.interactions.components.selections.SelectMenu; import net.dv8tion.jda.api.interactions.components.selections.SelectOption; -import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -89,7 +90,7 @@ private static SelectOption mapToSelectOption(@NotNull Role role) { } @Override - public void onSlashCommand(@NotNull final SlashCommandEvent event) { + public void onSlashCommand(@NotNull final SlashCommandInteractionEvent event) { Member member = Objects.requireNonNull(event.getMember(), "Member is null"); if (!member.hasPermission(Permission.MANAGE_ROLES)) { event.reply("You dont have the right permissions to use this command") @@ -105,8 +106,8 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) { return; } - SelectionMenu.Builder menu = - SelectionMenu.create(generateComponentId(Lifespan.PERMANENT, member.getId())); + SelectMenu.Builder menu = + SelectMenu.create(generateComponentId(Lifespan.PERMANENT, member.getId())); boolean isEphemeral = false; if (CHOOSE_OPTION.equals(event.getSubcommandName())) { @@ -139,13 +140,13 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) { * Adds role options to a selection menu. *

* - * @param event the {@link SlashCommandEvent} - * @param menu the menu to add options to {@link SelectionMenu.Builder} + * @param event the {@link SlashCommandInteractionEvent} + * @param menu the menu to add options to {@link SelectMenu.Builder} * @param placeHolder the placeholder for the menu {@link String} * @param minValues the minimum number of selections. nullable {@link Integer} */ private static void addMenuOptions(@NotNull final Interaction event, - @NotNull final SelectionMenu.Builder menu, @NotNull final String placeHolder, + @NotNull final SelectMenu.Builder menu, @NotNull final String placeHolder, @Nullable final Integer minValues) { Guild guild = Objects.requireNonNull(event.getGuild(), "The given guild cannot be null"); @@ -188,7 +189,7 @@ private static void addMenuOptions(@NotNull final Interaction event, } @Override - public void onSelectionMenu(@NotNull final SelectionMenuEvent event, + public void onSelectionMenu(@NotNull final SelectMenuInteractionEvent event, @NotNull final List args) { Guild guild = Objects.requireNonNull(event.getGuild(), "The given guild cannot be null"); @@ -211,13 +212,13 @@ public void onSelectionMenu(@NotNull final SelectionMenuEvent event, } /** - * Handles selection of a {@link SelectionMenuEvent}. + * Handles selection of a {@link SelectMenuInteractionEvent}. * - * @param event the unacknowledged {@link SelectionMenuEvent} + * @param event the unacknowledged {@link SelectMenuInteractionEvent} * @param selectedRoles the {@link Role roles} selected * @param guild the {@link Guild} */ - private static void handleRoleSelection(final @NotNull SelectionMenuEvent event, + private static void handleRoleSelection(final @NotNull SelectMenuInteractionEvent event, final @NotNull Collection selectedRoles, final Guild guild) { Collection rolesToAdd = new ArrayList<>(selectedRoles.size()); Collection rolesToRemove = new ArrayList<>(selectedRoles.size()); @@ -261,8 +262,8 @@ private static Function roleFromSelectOptionFunction(Guild g */ private void handleNewRoleBuilderSelection(@NotNull final ComponentInteraction event, final @NotNull Collection selectedRoles) { - SelectionMenu.Builder menu = - SelectionMenu.create(generateComponentId(event.getUser().getId())) + SelectMenu.Builder menu = + SelectMenu.create(generateComponentId(event.getUser().getId())) .setPlaceholder("Select your roles") .setMaxValues(selectedRoles.size()) .setMinValues(0); @@ -297,7 +298,7 @@ private static void handleNullRole(final @NotNull SelectOption selectedOption) { * @param additionRoles the roles to add * @param removalRoles the roles to remove */ - private static void handleRoleModifications(@NotNull final Interaction event, + private static void handleRoleModifications(@NotNull final IReplyCallback event, final Member member, final @NotNull Guild guild, final Collection additionRoles, final Collection removalRoles) { guild.modifyMemberRoles(member, additionRoles, removalRoles) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java index 3338a892c6..18bb428fa3 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/basic/VcActivityCommand.java @@ -5,13 +5,13 @@ import net.dv8tion.jda.api.entities.Invite; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.VoiceChannel; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.Command; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; -import net.dv8tion.jda.api.requests.restaction.interactions.ReplyAction; +import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory; import org.togetherjava.tjbot.commands.SlashCommandAdapter; import org.togetherjava.tjbot.commands.SlashCommandVisibility; + import java.util.List; import java.util.Map; import java.util.Objects; @@ -117,7 +118,7 @@ public VcActivityCommand() { @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Member member = Objects.requireNonNull(event.getMember(), "member is null"); GuildVoiceState voiceState = Objects.requireNonNull(member.getVoiceState(), "Voicestates aren't being cached, check the JDABuilder"); @@ -176,7 +177,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { return Optional.empty(); } - private static void handleSubcommand(@NotNull SlashCommandEvent event, + private static void handleSubcommand(@NotNull SlashCommandInteractionEvent event, @NotNull VoiceChannel voiceChannel, @NotNull String applicationId, @Nullable Integer maxUses, @Nullable Integer maxAgeDays, @NotNull String applicationName) { @@ -192,8 +193,8 @@ private static void handleSubcommand(@NotNull SlashCommandEvent event, } - private static @NotNull ReplyAction replyInvite(@NotNull SlashCommandEvent event, - @NotNull Invite invite, @NotNull String applicationName) { + private static @NotNull ReplyCallbackAction replyInvite(@NotNull SlashCommandInteractionEvent event, + @NotNull Invite invite, @NotNull String applicationName) { return event.reply(""" %s wants to start %s. Feel free to join by clicking %s , enjoy! @@ -201,7 +202,7 @@ private static void handleSubcommand(@NotNull SlashCommandEvent event, """.formatted(event.getUser().getAsTag(), applicationName, invite.getUrl())); } - private static void handleErrors(@NotNull SlashCommandEvent event, + private static void handleErrors(@NotNull SlashCommandInteractionEvent event, @Nullable Throwable throwable) { event.reply("Something went wrong :/").queue(); logger.warn("Something went wrong in the VcActivityCommand", throwable); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentId.java b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentId.java index eaeb9b17b8..5c6ae80486 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentId.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentId.java @@ -1,13 +1,12 @@ package org.togetherjava.tjbot.commands.componentids; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; import org.jetbrains.annotations.NotNull; import java.util.List; /** * Payload carried by component IDs. See - * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandEvent)} for its + * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandInteractionEvent)} for its * usages. * * @param commandName the name of the command that handles the event associated to this component diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdGenerator.java b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdGenerator.java index 52bffc901a..ad68b84c53 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdGenerator.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdGenerator.java @@ -1,8 +1,7 @@ package org.togetherjava.tjbot.commands.componentids; import net.dv8tion.jda.api.entities.Emoji; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; import org.jetbrains.annotations.NotNull; @@ -12,7 +11,7 @@ * Component IDs are used during button or selection menu events. They can carry arbitrary data and * are persisted by the system. *

- * See {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandEvent)} for + * See {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandInteractionEvent)} for * more context on how to use this. *

* The interface {@link ComponentIdParser} is the counterpart to this, offering parsing back the diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdParser.java b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdParser.java index a6188da8b9..7830dd3a24 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdParser.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdParser.java @@ -1,8 +1,6 @@ package org.togetherjava.tjbot.commands.componentids; import net.dv8tion.jda.api.entities.Emoji; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; import org.jetbrains.annotations.NotNull; @@ -14,7 +12,7 @@ * Component IDs are used during button or selection menu events. They can carry arbitrary data and * are persisted by the system. *

- * See {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandEvent)} for + * See {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandInteractionEvent)} for * more context on how to use this. *

* The interface {@link ComponentIdGenerator} is the counterpart to this, offering generation of IDs diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdStore.java b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdStore.java index 8aca4f38c3..2378600f4f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdStore.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/ComponentIdStore.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; import org.jetbrains.annotations.NotNull; import org.jooq.Result; import org.slf4j.Logger; @@ -27,7 +26,7 @@ /** * Thread-safe storage for component IDs. Can put, persist and get back component IDs based on * UUIDs. Component IDs are used for button and selection menu commands, see - * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandEvent)} for + * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandInteractionEvent)} for * details. *

* Use {@link #putOrThrow(UUID, ComponentId, Lifespan)} to put and persist a component ID; and diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/package-info.java b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/package-info.java index 1353844d85..239d79060a 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/componentids/package-info.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/componentids/package-info.java @@ -2,7 +2,7 @@ * This package provides utilities to generate, persist and parse component IDs. *

* See - * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(net.dv8tion.jda.api.events.interaction.SlashCommandEvent)} + * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(net.dv8tion.jda.api.events.interaction.SlashCommandInteractionEvent)} * for details on component IDs. *

* The class {@link org.togetherjava.tjbot.commands.componentids.ComponentIdStore} is the central diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java index b4da6a8fdf..5e5cb5e5cf 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeCommand.java @@ -8,7 +8,7 @@ import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.events.GenericEvent; import net.dv8tion.jda.api.events.ReadyEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; import org.jetbrains.annotations.NotNull; @@ -124,7 +124,7 @@ public void onReady(@NotNull final ReadyEvent event) { * @throws IllegalStateException if this method is called for a Global Slash Command */ @Override - public void onSlashCommand(@NotNull final SlashCommandEvent event) { + public void onSlashCommand(@NotNull final SlashCommandInteractionEvent event) { logger.debug("/free used by {} on channel {}", event.getUser().getAsTag(), event.getChannel().getName()); if (!handleShouldBeProcessed(event)) { @@ -154,7 +154,7 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) { * @param event the event to test for validity. * @return true if the event should be processed false otherwise. */ - private boolean handleShouldBeProcessed(@NotNull final SlashCommandEvent event) { + private boolean handleShouldBeProcessed(@NotNull final SlashCommandInteractionEvent event) { if (!isReady) { logger.debug( "Slash command requested by {} in {}(channel: {}) before command is ready.", @@ -240,7 +240,7 @@ private void checkBusyStatusAllChannels(@NotNull JDA jda) { return guild; } - private @NotNull Guild requiresGuild(SlashCommandEvent event) { + private @NotNull Guild requiresGuild(SlashCommandInteractionEvent event) { Guild guild = event.getGuild(); if (guild == null) { throw new IllegalStateException( diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java index 99a002c257..627d2b3b35 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java @@ -2,7 +2,7 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.TextChannel; -import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.utils.TimeUtil; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -27,7 +27,7 @@ enum FreeUtil { * @param interaction The event or hook that this message is responding to * @param message The text to be display for the user to read. */ - public static void sendErrorMessage(@NotNull Interaction interaction, @NotNull String message) { + public static void sendErrorMessage(@NotNull IReplyCallback interaction, @NotNull String message) { interaction.reply(message).setEphemeral(true).queue(); } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/TeXCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/TeXCommand.java index 468fe7fda2..6ca3a797b8 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/TeXCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/TeXCommand.java @@ -1,10 +1,10 @@ package org.togetherjava.tjbot.commands.mathcommands; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; -import net.dv8tion.jda.api.interactions.components.Button; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; +import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle; import org.jetbrains.annotations.NotNull; import org.scilab.forge.jlatexmath.ParseException; import org.scilab.forge.jlatexmath.TeXConstants; @@ -52,7 +52,7 @@ public TeXCommand() { } @Override - public void onSlashCommand(@NotNull final SlashCommandEvent event) { + public void onSlashCommand(@NotNull final SlashCommandInteractionEvent event) { String latex = Objects.requireNonNull(event.getOption(LATEX_OPTION)).getAsString(); String userID = (Objects.requireNonNull(event.getMember()).getId()); TeXFormula formula; @@ -93,7 +93,7 @@ public void onSlashCommand(@NotNull final SlashCommandEvent event) { } @Override - public void onButtonClick(@NotNull final ButtonClickEvent event, + public void onButtonClick(@NotNull final ButtonInteractionEvent event, @NotNull final List args) { if (!args.get(0).equals(Objects.requireNonNull(event.getMember()).getId())) { event.reply("You are not the person who executed the command, you cannot do that") diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/AuditCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/AuditCommand.java index a9391a5871..c4bf8cfb6c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/AuditCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/AuditCommand.java @@ -3,8 +3,9 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.*; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.requests.RestAction; @@ -110,7 +111,7 @@ public AuditCommand(@NotNull ModerationActionsStore actionsStore) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { OptionMapping targetOption = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null"); User target = targetOption.getAsUser(); @@ -128,7 +129,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") private boolean handleChecks(@NotNull Member bot, @NotNull Member author, - @Nullable Member target, @NotNull Guild guild, @NotNull Interaction event) { + @Nullable Member target, @NotNull Guild guild, @NotNull IReplyCallback event) { // Member doesn't exist if attempting to audit a user who is not part of the guild. if (target != null && !ModerationUtils.handleCanInteractWithTarget(ACTION_VERB, bot, author, target, event)) { @@ -138,7 +139,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } private void auditUser(@NotNull User user, @NotNull ISnowflake guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { List actions = actionsStore.getActionsByTargetAscending(guild.getIdLong(), user.getIdLong()); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/BanCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/BanCommand.java index f11d15772c..0586518516 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/BanCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/BanCommand.java @@ -3,10 +3,11 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.GenericEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.interactions.Interaction; import net.dv8tion.jda.api.interactions.InteractionHook; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; @@ -76,7 +77,7 @@ public BanCommand(@NotNull ModerationActionsStore actionsStore) { } private static RestAction handleAlreadyBanned(@NotNull Guild.Ban ban, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { String reason = ban.getReason(); String reasonText = reason == null || reason.isBlank() ? "" : " (reason: %s)".formatted(reason); @@ -120,7 +121,7 @@ private static RestAction sendDm(@NotNull ISnowflake target, } private static Optional> handleNotAlreadyBannedResponse( - @NotNull Throwable alreadyBannedFailure, @NotNull Interaction event, + @NotNull Throwable alreadyBannedFailure, @NotNull IReplyCallback event, @NotNull Guild guild, @NotNull User target) { if (alreadyBannedFailure instanceof ErrorResponseException errorResponseException) { if (errorResponseException.getErrorResponse() == ErrorResponse.UNKNOWN_BAN) { @@ -145,7 +146,7 @@ private static Optional> handleNotAlreadyBannedRespo @SuppressWarnings("MethodWithTooManyParameters") private RestAction banUserFlow(@NotNull User target, @NotNull Member author, @Nullable ModerationUtils.TemporaryData temporaryData, @NotNull String reason, - int deleteHistoryDays, @NotNull Guild guild, @NotNull SlashCommandEvent event) { + int deleteHistoryDays, @NotNull Guild guild, @NotNull SlashCommandInteractionEvent event) { return sendDm(target, temporaryData, reason, guild, event) .flatMap(hasSentDm -> banUser(target, author, temporaryData, reason, deleteHistoryDays, guild).map(banResult -> hasSentDm)) @@ -174,7 +175,7 @@ private AuditableRestAction banUser(@NotNull User target, @NotNull Member @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion", "MethodWithTooManyParameters"}) private boolean handleChecks(@NotNull Member bot, @NotNull Member author, @Nullable Member target, @NotNull CharSequence reason, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { // Member doesn't exist if attempting to ban a user who is not part of the guild. if (target != null && !ModerationUtils.handleCanInteractWithTarget(ACTION_VERB, bot, author, target, event)) { @@ -195,7 +196,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { OptionMapping targetOption = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null"); User target = targetOption.getAsUser(); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/KickCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/KickCommand.java index 8c9fcf5dfe..62b5bef951 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/KickCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/KickCommand.java @@ -1,10 +1,14 @@ package org.togetherjava.tjbot.commands.moderation; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.ISnowflake; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.GenericEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; @@ -54,14 +58,14 @@ public KickCommand(@NotNull ModerationActionsStore actionsStore) { this.actionsStore = Objects.requireNonNull(actionsStore); } - private static void handleAbsentTarget(@NotNull Interaction event) { + private static void handleAbsentTarget(@NotNull IReplyCallback event) { event.reply("I can not kick the given user since they are not part of the guild anymore.") .setEphemeral(true) .queue(); } private void kickUserFlow(@NotNull Member target, @NotNull Member author, - @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandEvent event) { + @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandInteractionEvent event) { sendDm(target, reason, guild, event) .flatMap(hasSentDm -> kickUser(target, author, reason, guild) .map(kickResult -> hasSentDm)) @@ -110,7 +114,7 @@ private AuditableRestAction kickUser(@NotNull Member target, @NotNull Memb @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion", "MethodWithTooManyParameters"}) private boolean handleChecks(@NotNull Member bot, @NotNull Member author, @Nullable Member target, @NotNull CharSequence reason, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { // Member doesn't exist if attempting to kick a user who is not part of the guild anymore. if (target == null) { handleAbsentTarget(event); @@ -134,7 +138,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Member target = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null") .getAsMember(); Member author = Objects.requireNonNull(event.getMember(), "The author is null"); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ModerationUtils.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ModerationUtils.java index fcb916be95..47447069f9 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ModerationUtils.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/ModerationUtils.java @@ -4,6 +4,7 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -56,7 +57,7 @@ public enum ModerationUtils { * @return whether the reason is valid */ @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") - static boolean handleReason(@NotNull CharSequence reason, @NotNull Interaction event) { + static boolean handleReason(@NotNull CharSequence reason, @NotNull IReplyCallback event) { if (reason.length() <= REASON_MAX_LENGTH) { return true; } @@ -84,7 +85,7 @@ static boolean handleReason(@NotNull CharSequence reason, @NotNull Interaction e */ @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") static boolean handleCanInteractWithTarget(@NotNull String actionVerb, @NotNull Member bot, - @NotNull Member author, @NotNull Member target, @NotNull Interaction event) { + @NotNull Member author, @NotNull Member target, @NotNull IReplyCallback event) { String targetTag = target.getUser().getAsTag(); if (!author.canInteract(target)) { event @@ -119,7 +120,7 @@ static boolean handleCanInteractWithTarget(@NotNull String actionVerb, @NotNull */ @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") static boolean handleCanInteractWithRole(@NotNull Member bot, @NotNull Member author, - @NotNull Role role, @NotNull Interaction event) { + @NotNull Role role, @NotNull IReplyCallback event) { if (!author.canInteract(role)) { event .reply("The role %s is too powerful for you to interact with." @@ -155,7 +156,7 @@ static boolean handleCanInteractWithRole(@NotNull Member bot, @NotNull Member au @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") static boolean handleHasBotPermissions(@NotNull String actionVerb, @NotNull Permission permission, @NotNull IPermissionHolder bot, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { if (!bot.hasPermission(permission)) { event .reply("I can not %s users in this guild since I do not have the %s permission." @@ -170,7 +171,7 @@ static boolean handleHasBotPermissions(@NotNull String actionVerb, return true; } - private static void handleAbsentTarget(@NotNull String actionVerb, @NotNull Interaction event) { + private static void handleAbsentTarget(@NotNull String actionVerb, @NotNull IReplyCallback event) { event .reply("I can not %s the given user since they are not part of the guild anymore." .formatted(actionVerb)) @@ -212,7 +213,7 @@ private static void handleAbsentTarget(@NotNull String actionVerb, @NotNull Inte static boolean handleRoleChangeChecks(@Nullable Role role, @NotNull String actionVerb, @Nullable Member target, @NotNull Member bot, @NotNull Member author, @NotNull Guild guild, @NotNull Predicate hasRequiredRole, - @NotNull CharSequence reason, @NotNull Interaction event) { + @NotNull CharSequence reason, @NotNull IReplyCallback event) { if (role == null) { event .reply("Can not %s the user, unable to find the corresponding role on this server" @@ -260,7 +261,7 @@ static boolean handleRoleChangeChecks(@Nullable Role role, @NotNull String actio @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") static boolean handleHasAuthorPermissions(@NotNull String actionVerb, @NotNull Permission permission, @NotNull IPermissionHolder author, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { if (!author.hasPermission(permission)) { event .reply("You can not %s users in this guild since you do not have the %s permission." @@ -287,7 +288,7 @@ static boolean handleHasAuthorPermissions(@NotNull String actionVerb, @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") static boolean handleHasAuthorRole(@NotNull String actionVerb, @NotNull Predicate hasRequiredRole, @NotNull Member author, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { if (author.getRoles().stream().map(Role::getName).anyMatch(hasRequiredRole)) { return true; } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/MuteCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/MuteCommand.java index f10606c8a4..354f635f88 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/MuteCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/MuteCommand.java @@ -2,8 +2,9 @@ import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.GenericEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.requests.RestAction; @@ -66,7 +67,7 @@ public MuteCommand(@NotNull ModerationActionsStore actionsStore) { this.actionsStore = Objects.requireNonNull(actionsStore); } - private static void handleAlreadyMutedTarget(@NotNull Interaction event) { + private static void handleAlreadyMutedTarget(@NotNull IReplyCallback event) { event.reply("The user is already muted.").setEphemeral(true).queue(); } @@ -123,7 +124,7 @@ private AuditableRestAction muteUser(@NotNull Member target, @NotNull Memb @SuppressWarnings("MethodWithTooManyParameters") private void muteUserFlow(@NotNull Member target, @NotNull Member author, @Nullable ModerationUtils.TemporaryData temporaryData, @NotNull String reason, - @NotNull Guild guild, @NotNull SlashCommandEvent event) { + @NotNull Guild guild, @NotNull SlashCommandInteractionEvent event) { sendDm(target, temporaryData, reason, guild, event) .flatMap(hasSentDm -> muteUser(target, author, temporaryData, reason, guild) .map(banResult -> hasSentDm)) @@ -135,7 +136,7 @@ private void muteUserFlow(@NotNull Member target, @NotNull Member author, @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion", "MethodWithTooManyParameters"}) private boolean handleChecks(@NotNull Member bot, @NotNull Member author, @Nullable Member target, @NotNull CharSequence reason, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { if (!ModerationUtils.handleRoleChangeChecks( ModerationUtils.getMutedRole(guild).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -153,7 +154,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Member target = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null") .getAsMember(); Member author = Objects.requireNonNull(event.getMember(), "The author is null"); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnbanCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnbanCommand.java index 516ee88183..2ecb591336 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnbanCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnbanCommand.java @@ -2,9 +2,10 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.requests.ErrorResponse; import org.jetbrains.annotations.NotNull; @@ -50,7 +51,7 @@ public UnbanCommand(@NotNull ModerationActionsStore actionsStore) { } private void unban(@NotNull User target, @NotNull Member author, @NotNull String reason, - @NotNull Guild guild, @NotNull Interaction event) { + @NotNull Guild guild, @NotNull IReplyCallback event) { guild.unban(target).reason(reason).queue(result -> { MessageEmbed message = ModerationUtils.createActionResponse(author.getUser(), ModerationAction.UNBAN, target, null, reason); @@ -66,7 +67,7 @@ private void unban(@NotNull User target, @NotNull Member author, @NotNull String } private static void handleFailure(@NotNull Throwable unbanFailure, @NotNull User target, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { String targetTag = target.getAsTag(); if (unbanFailure instanceof ErrorResponseException errorResponseException) { if (errorResponseException.getErrorResponse() == ErrorResponse.UNKNOWN_USER) { @@ -90,7 +91,7 @@ private static void handleFailure(@NotNull Throwable unbanFailure, @NotNull User @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion"}) private boolean handleChecks(@NotNull IPermissionHolder bot, @NotNull Member author, - @NotNull CharSequence reason, @NotNull Guild guild, @NotNull Interaction event) { + @NotNull CharSequence reason, @NotNull Guild guild, @NotNull IReplyCallback event) { if (!ModerationUtils.handleHasAuthorRole(ACTION_VERB, hasRequiredRole, author, event)) { return false; } @@ -107,7 +108,7 @@ private boolean handleChecks(@NotNull IPermissionHolder bot, @NotNull Member aut } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { User target = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null") .getAsUser(); Member author = Objects.requireNonNull(event.getMember(), "The author is null"); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnmuteCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnmuteCommand.java index fcd0f66a31..8328170632 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnmuteCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnmuteCommand.java @@ -2,8 +2,9 @@ import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.GenericEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.restaction.AuditableRestAction; @@ -54,7 +55,7 @@ public UnmuteCommand(@NotNull ModerationActionsStore actionsStore) { this.actionsStore = Objects.requireNonNull(actionsStore); } - private static void handleNotMutedTarget(@NotNull Interaction event) { + private static void handleNotMutedTarget(@NotNull IReplyCallback event) { event.reply("The user is not muted.").setEphemeral(true).queue(); } @@ -96,7 +97,7 @@ private AuditableRestAction unmuteUser(@NotNull Member target, @NotNull Me } private void unmuteUserFlow(@NotNull Member target, @NotNull Member author, - @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandEvent event) { + @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandInteractionEvent event) { sendDm(target, reason, guild, event) .flatMap(hasSentDm -> unmuteUser(target, author, reason, guild) .map(banResult -> hasSentDm)) @@ -108,7 +109,7 @@ private void unmuteUserFlow(@NotNull Member target, @NotNull Member author, @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion", "MethodWithTooManyParameters"}) private boolean handleChecks(@NotNull Member bot, @NotNull Member author, @Nullable Member target, @NotNull CharSequence reason, @NotNull Guild guild, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { if (!ModerationUtils.handleRoleChangeChecks( ModerationUtils.getMutedRole(guild).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -126,7 +127,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Member target = Objects.requireNonNull(event.getOption(TARGET_OPTION), "The target is null") .getAsMember(); Member author = Objects.requireNonNull(event.getMember(), "The author is null"); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/WarnCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/WarnCommand.java index 2b2c8265c2..87c2099b54 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/WarnCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/WarnCommand.java @@ -1,7 +1,7 @@ package org.togetherjava.tjbot.commands.moderation; import net.dv8tion.jda.api.entities.*; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.InteractionHook; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; @@ -53,7 +53,7 @@ public WarnCommand(@NotNull ModerationActionsStore actionsStore) { private @NotNull RestAction warnUserFlow(@NotNull User target, @NotNull Member author, @NotNull String reason, @NotNull Guild guild, - @NotNull SlashCommandEvent event) { + @NotNull SlashCommandInteractionEvent event) { return dmUser(target, reason, guild, event).map(hasSentDm -> { warnUser(target, author, reason, guild); return hasSentDm; @@ -63,7 +63,7 @@ public WarnCommand(@NotNull ModerationActionsStore actionsStore) { } private static @NotNull RestAction dmUser(@NotNull ISnowflake target, - @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandEvent event) { + @NotNull String reason, @NotNull Guild guild, @NotNull SlashCommandInteractionEvent event) { return event.getJDA() .openPrivateChannelById(target.getId()) .flatMap(channel -> channel.sendMessage( @@ -98,7 +98,7 @@ private void warnUser(@NotNull User target, @NotNull Member author, @NotNull Str } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { OptionMapping targetOption = Objects.requireNonNull(event.getOption(USER_OPTION), "The target is null"); Member author = Objects.requireNonNull(event.getMember(), "The author is null"); @@ -116,7 +116,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") private boolean handleChecks(@NotNull Member bot, @NotNull Member author, - @Nullable Member target, String reason, @NotNull SlashCommandEvent event) { + @Nullable Member target, String reason, @NotNull SlashCommandInteractionEvent event) { if (target != null && !ModerationUtils.handleCanInteractWithTarget(ACTION_VERB, bot, author, target, event)) { return false; diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java b/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java index 913a571ec1..09a728f67f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/system/BotCore.java @@ -6,9 +6,9 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.events.ReadyEvent; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import net.dv8tion.jda.api.exceptions.ErrorHandler; @@ -179,21 +179,21 @@ public void onMessageUpdate(@NotNull final MessageUpdateEvent event) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) { logger.debug("Received slash command '{}' (#{}) on guild '{}'", event.getName(), event.getId(), event.getGuild()); COMMAND_SERVICE.execute(() -> requireSlashCommand(event.getName()).onSlashCommand(event)); } @Override - public void onButtonClick(@NotNull ButtonClickEvent event) { + public void onButtonInteraction(@NotNull ButtonInteractionEvent event) { logger.debug("Received button click '{}' (#{}) on guild '{}'", event.getComponentId(), event.getId(), event.getGuild()); COMMAND_SERVICE.execute(() -> forwardComponentCommand(event, SlashCommand::onButtonClick)); } @Override - public void onSelectionMenu(@NotNull SelectionMenuEvent event) { + public void onSelectMenuInteraction(@NotNull SelectMenuInteractionEvent event) { logger.debug("Received selection menu event '{}' (#{}) on guild '{}'", event.getComponentId(), event.getId(), event.getGuild()); COMMAND_SERVICE diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/system/ReloadCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/system/ReloadCommand.java index 33613c797a..cd2c83a223 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/system/ReloadCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/system/ReloadCommand.java @@ -4,10 +4,10 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.interactions.components.Button; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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.ButtonStyle; import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.restaction.CommandListUpdateAction; import org.jetbrains.annotations.NotNull; @@ -54,7 +54,7 @@ public ReloadCommand(@NotNull SlashCommandProvider commandProvider) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Member member = Objects.requireNonNull(event.getMember()); if (!member.hasPermission(Permission.MANAGE_SERVER)) { @@ -76,7 +76,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { } @Override - public void onButtonClick(@NotNull ButtonClickEvent event, @NotNull List args) { + public void onButtonClick(@NotNull ButtonInteractionEvent event, @NotNull List args) { // Ignore if another user clicked the button String userId = args.get(0); if (!userId.equals(Objects.requireNonNull(event.getMember()).getId())) { diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagCommand.java index ac15f24a51..73ba5a16da 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagCommand.java @@ -1,10 +1,10 @@ package org.togetherjava.tjbot.commands.tags; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; -import net.dv8tion.jda.api.requests.restaction.interactions.ReplyAction; +import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.SlashCommandAdapter; import org.togetherjava.tjbot.commands.SlashCommandVisibility; @@ -43,7 +43,7 @@ public TagCommand(TagSystem tagSystem) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { String id = Objects.requireNonNull(event.getOption(ID_OPTION)).getAsString(); OptionMapping replyToUserOption = event.getOption(REPLY_TO_USER_OPTION); @@ -51,7 +51,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { return; } - ReplyAction message = event + ReplyCallbackAction message = event .replyEmbeds(new EmbedBuilder().setDescription(tagSystem.getTag(id).orElseThrow()) .setFooter(event.getUser().getName() + " • used " + event.getCommandString()) .setTimestamp(Instant.now()) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagManageCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagManageCommand.java index e257db4c53..1ebd8d900e 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagManageCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagManageCommand.java @@ -3,9 +3,9 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; -import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import net.dv8tion.jda.api.interactions.commands.CommandInteraction; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; @@ -89,8 +89,8 @@ public TagManageCommand(TagSystem tagSystem) { .addOption(OptionType.STRING, ID_OPTION, ID_DESCRIPTION, true)); } - private static void sendSuccessMessage(@NotNull Interaction event, @NotNull String id, - @NotNull String actionVerb) { + private static void sendSuccessMessage(@NotNull IReplyCallback event, @NotNull String id, + @NotNull String actionVerb) { logger.info("User '{}' {} the tag with id '{}'.", event.getUser().getId(), actionVerb, id); event @@ -114,7 +114,7 @@ private static void sendSuccessMessage(@NotNull Interaction event, @NotNull Stri * @return the parsed message id, if successful */ private static OptionalLong parseMessageIdAndHandle(@NotNull String messageId, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { try { return OptionalLong.of(Long.parseLong(messageId)); } catch (NumberFormatException e) { @@ -128,7 +128,7 @@ private static OptionalLong parseMessageIdAndHandle(@NotNull String messageId, } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { if (!hasTagManageRole(Objects.requireNonNull(event.getMember()))) { event.reply("Tags can only be managed by users with a corresponding role.") .setEphemeral(true) @@ -148,7 +148,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { } } - private void rawTag(@NotNull SlashCommandEvent event) { + private void rawTag(@NotNull SlashCommandInteractionEvent event) { String id = Objects.requireNonNull(event.getOption(ID_OPTION)).getAsString(); if (tagSystem.handleIsUnknownTag(id, event)) { return; @@ -269,7 +269,7 @@ private void handleActionWithMessage(@NotNull TagStatus requiredTagStatus, * @return whether the status of the given tag is not equal to the required status */ private boolean isWrongTagStatusAndHandle(@NotNull TagStatus requiredTagStatus, - @NotNull String id, @NotNull Interaction event) { + @NotNull String id, @NotNull IReplyCallback event) { if (requiredTagStatus == TagStatus.EXISTS) { return tagSystem.handleIsUnknownTag(id, event); } else if (requiredTagStatus == TagStatus.NOT_EXISTS) { diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagSystem.java b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagSystem.java index a708ef5d5a..0a9090d0d5 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagSystem.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagSystem.java @@ -1,9 +1,9 @@ package org.togetherjava.tjbot.commands.tags; import net.dv8tion.jda.api.entities.Emoji; -import net.dv8tion.jda.api.interactions.Interaction; -import net.dv8tion.jda.api.interactions.components.Button; -import net.dv8tion.jda.api.interactions.components.ButtonStyle; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; +import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle; import org.jetbrains.annotations.NotNull; import org.togetherjava.tjbot.commands.utils.StringDistances; import org.togetherjava.tjbot.db.Database; @@ -59,7 +59,7 @@ static Button createDeleteButton(String componentId) { * @return whether the given tag is unknown to the system */ @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") - boolean handleIsUnknownTag(@NotNull String id, @NotNull Interaction event) { + boolean handleIsUnknownTag(@NotNull String id, @NotNull IReplyCallback event) { if (hasTag(id)) { return false; } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagsCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagsCommand.java index 761faaebe1..8606c7f933 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagsCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tags/TagsCommand.java @@ -2,14 +2,15 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.togetherjava.tjbot.commands.SlashCommandAdapter; import org.togetherjava.tjbot.commands.SlashCommandVisibility; + import java.time.Instant; -import org.slf4j.Logger; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -48,7 +49,7 @@ public TagsCommand(TagSystem tagSystem) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { Collection tagIds = tagSystem.getAllIds(); if (tagIds.size() > MAX_TAGS_THRESHOLD_WARNING) { // TODO Implement the edge case @@ -72,7 +73,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { } @Override - public void onButtonClick(@NotNull ButtonClickEvent event, @NotNull List args) { + public void onButtonClick(@NotNull ButtonInteractionEvent event, @NotNull List args) { String userId = args.get(0); if (!event.getUser().getId().equals(userId) && !Objects.requireNonNull(event.getMember()) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersCommand.java index 876ce3dcb2..789c9cb03a 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersCommand.java @@ -6,8 +6,10 @@ import com.github.freva.asciitable.HorizontalAlign; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.interactions.callbacks.IDeferrableCallback; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jooq.Records; @@ -65,7 +67,7 @@ public TopHelpersCommand(@NotNull Database database) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { if (!handleHasAuthorRole(event.getMember(), event)) { return; } @@ -91,7 +93,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { } @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") - private boolean handleHasAuthorRole(@NotNull Member author, @NotNull Interaction event) { + private boolean handleHasAuthorRole(@NotNull Member author, @NotNull IReplyCallback event) { if (author.getRoles().stream().map(Role::getName).anyMatch(hasRequiredRole)) { return true; } @@ -125,14 +127,14 @@ private boolean handleHasAuthorRole(@NotNull Member author, @NotNull Interaction .fetch(Records.mapping(TopHelperResult::new))); } - private static void handleError(@NotNull Throwable error, @NotNull Interaction event) { + private static void handleError(@NotNull Throwable error, @NotNull IDeferrableCallback event) { logger.warn("Failed to compute top-helpers", error); event.getHook().editOriginal("Sorry, something went wrong.").queue(); } private static void handleTopHelpers(@NotNull Collection topHelpers, @NotNull Collection members, @NotNull TimeRange timeRange, - @NotNull Interaction event) { + @NotNull IDeferrableCallback event) { Map userIdToMember = members.stream().collect(Collectors.toMap(Member::getIdLong, Function.identity())); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/utils/MessageUtils.java b/application/src/main/java/org/togetherjava/tjbot/commands/utils/MessageUtils.java index 70895df89a..9ef485e9f2 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/utils/MessageUtils.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/utils/MessageUtils.java @@ -2,7 +2,7 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.components.Button; +import net.dv8tion.jda.api.interactions.components.buttons.Button; import net.dv8tion.jda.api.utils.MarkdownSanitizer; import org.jetbrains.annotations.NotNull; diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/SlashCommandAdapterTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/SlashCommandAdapterTest.java index 410796c88c..a665fceb56 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/SlashCommandAdapterTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/SlashCommandAdapterTest.java @@ -1,7 +1,7 @@ package org.togetherjava.tjbot.commands; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.interactions.commands.build.CommandData; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; import org.togetherjava.tjbot.commands.componentids.Lifespan; @@ -19,7 +19,7 @@ static SlashCommandAdapter createAdapter() { // noinspection AnonymousInnerClass return new SlashCommandAdapter(NAME, DESCRIPTION, VISIBILITY) { @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { // No implementation needed for the test } }; @@ -43,7 +43,7 @@ void getVisibility() { @Test void getData() { SlashCommandAdapter adapter = createAdapter(); - CommandData data = adapter.getData(); + SlashCommandData data = adapter.getData(); assertEquals(NAME, data.getName(), "adapters name is inconsistent with the base data object"); assertEquals(DESCRIPTION, data.getDescription(), @@ -53,7 +53,7 @@ void getData() { String otherName = NAME + "-bar"; String otherDescription = DESCRIPTION + "-bar"; data.setName(otherName).setDescription(otherDescription); - CommandData otherData = adapter.getData(); + SlashCommandData otherData = adapter.getData(); assertSame(data, otherData, "adapter changed the data object"); assertEquals(otherName, otherData.getName(), "name changes did not carry over"); diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/basic/PingCommandTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/basic/PingCommandTest.java index 457b7e3bec..cbe926353a 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/basic/PingCommandTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/basic/PingCommandTest.java @@ -1,6 +1,6 @@ package org.togetherjava.tjbot.commands.basic; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.junit.jupiter.api.Test; import org.togetherjava.tjbot.commands.SlashCommand; import org.togetherjava.tjbot.jda.JdaTester; @@ -14,7 +14,7 @@ void pingCommand() { SlashCommand command = new PingCommand(); JdaTester jdaTester = new JdaTester(); - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command).build(); + SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command).build(); command.onSlashCommand(event); verify(event, times(1)).reply("Pong!"); diff --git a/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java b/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java index 5c6ed68067..148b50162f 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java @@ -2,7 +2,7 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.SelfUser; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.requests.restaction.MessageAction; import net.dv8tion.jda.api.utils.ConcurrentSessionController; import net.dv8tion.jda.api.utils.cache.CacheFlag; @@ -10,7 +10,7 @@ import net.dv8tion.jda.internal.entities.*; import net.dv8tion.jda.internal.requests.Requester; import net.dv8tion.jda.internal.requests.restaction.MessageActionImpl; -import net.dv8tion.jda.internal.requests.restaction.interactions.ReplyActionImpl; +import net.dv8tion.jda.internal.requests.restaction.interactions.ReplyCallbackActionImpl; import net.dv8tion.jda.internal.utils.config.AuthorizationConfig; import org.jetbrains.annotations.NotNull; import org.mockito.ArgumentMatchers; @@ -27,7 +27,7 @@ * Utility class for testing {@link SlashCommand}s. *

* Mocks JDA and can create events that can be used to test {@link SlashCommand}s, e.g. - * {@link #createSlashCommandEvent(SlashCommand)}. The created events are Mockito mocks, which can + * {@link #createSlashCommandInteractionEvent(SlashCommand)}. The created events are Mockito mocks, which can * be exploited for testing. *

* An example test using this class might look like: @@ -38,7 +38,7 @@ * SlashCommand command = new PingCommand(); * JdaTester jdaTester = new JdaTester(); * - * SlashCommandEvent event = jdaTester.createSlashCommandEvent(command).build(); + * SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command).build(); * command.onSlashCommand(event); * * verify(event, times(1)).reply("Pong!"); @@ -105,7 +105,7 @@ public JdaTester() { /** * Creates a Mockito mocked slash command event, which can be used for - * {@link SlashCommand#onSlashCommand(SlashCommandEvent)}. + * {@link SlashCommand#onSlashCommand(SlashCommandInteractionEvent)}. *

* The method creates a builder that can be used to further adjust the event before creation, * e.g. provide options. @@ -113,20 +113,20 @@ public JdaTester() { * @param command the command to create an event for * @return a builder used to create a Mockito mocked slash command event */ - public @NotNull SlashCommandEventBuilder createSlashCommandEvent( + public @NotNull SlashCommandInteractionEventBuilder createSlashCommandInteractionEvent( @NotNull SlashCommand command) { - UnaryOperator mockOperator = event -> { - SlashCommandEvent slashCommandEvent = spy(event); - ReplyActionImpl replyAction = mock(ReplyActionImpl.class); + UnaryOperator mockOperator = event -> { + SlashCommandInteractionEvent SlashCommandInteractionEvent = spy(event); + ReplyCallbackActionImpl replyAction = mock(ReplyCallbackActionImpl.class); - doReturn(replyAction).when(slashCommandEvent).reply(anyString()); + doReturn(replyAction).when(SlashCommandInteractionEvent).reply(anyString()); when(replyAction.setEphemeral(anyBoolean())).thenReturn(replyAction); - doReturn(member).when(slashCommandEvent).getMember(); + doReturn(member).when(SlashCommandInteractionEvent).getMember(); - return slashCommandEvent; + return SlashCommandInteractionEvent; }; - return new SlashCommandEventBuilder(jda, mockOperator).command(command) + return new SlashCommandInteractionEventBuilder(jda, mockOperator).command(command) .token(TEST_TOKEN) .channelId(String.valueOf(TEXT_CHANNEL_ID)) .applicationId(String.valueOf(APPLICATION_ID)) diff --git a/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandEventBuilder.java b/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandInteractionEventBuilder.java similarity index 82% rename from application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandEventBuilder.java rename to application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandInteractionEventBuilder.java index 6cca185720..ceb3c0f0a1 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandEventBuilder.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandInteractionEventBuilder.java @@ -2,13 +2,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; import net.dv8tion.jda.api.utils.data.DataObject; import net.dv8tion.jda.internal.JDAImpl; -import net.dv8tion.jda.internal.interactions.CommandInteractionImpl; +import net.dv8tion.jda.internal.interactions.command.SlashCommandInteractionImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.togetherjava.tjbot.commands.SlashCommand; @@ -21,9 +21,9 @@ /** * Builder to create slash command events that can be used for example with - * {@link SlashCommand#onSlashCommand(SlashCommandEvent)}. + * {@link SlashCommand#onSlashCommand(SlashCommandInteractionEvent)}. *

- * Create instances of this class by using {@link JdaTester#createSlashCommandEvent(SlashCommand)}. + * Create instances of this class by using {@link JdaTester#createSlashCommandInteractionEvent(SlashCommand)}. *

* Among other Discord related things, the builder optionally accepts a subcommand * ({@link #subcommand(String)}) and options ({@link #option(String, String)}). An already set @@ -35,16 +35,16 @@ *

  * {@code
  * // /ping
- * jdaTester.createSlashCommandEvent(command).build();
+ * jdaTester.createSlashCommandInteractionEvent(command).build();
  *
  * // /days start:10.01.2021 end:13.01.2021
- * jdaTester.createSlashCommandEvent(command)
+ * jdaTester.createSlashCommandInteractionEvent(command)
  *   .option("start", "10.01.2021")
  *   .option("end", "13.01.2021")
  *   .build();
  *
  * // /db put key:foo value:bar
- * jdaTester.createSlashCommandEvent(command)
+ * jdaTester.createSlashCommandInteractionEvent(command)
  *   .subcommand("put")
  *   .option("key", "foo")
  *   .option("value", "bar")
@@ -53,10 +53,10 @@
  * 
*/ @SuppressWarnings("ClassWithTooManyFields") -public final class SlashCommandEventBuilder { +public final class SlashCommandInteractionEventBuilder { private static final ObjectMapper JSON = new ObjectMapper(); private final JDAImpl jda; - private final UnaryOperator mockOperator; + private final UnaryOperator mockOperator; private String token; private String channelId; private String applicationId; @@ -66,7 +66,7 @@ public final class SlashCommandEventBuilder { private final Map nameToOption = new HashMap<>(); private String subcommand; - SlashCommandEventBuilder(@NotNull JDAImpl jda, UnaryOperator mockOperator) { + SlashCommandInteractionEventBuilder(@NotNull JDAImpl jda, UnaryOperator mockOperator) { this.jda = jda; this.mockOperator = mockOperator; } @@ -85,7 +85,7 @@ public final class SlashCommandEventBuilder { * @throws IllegalArgumentException if the option does not exist in the corresponding command, * as specified by its {@link SlashCommand#getData()} */ - public @NotNull SlashCommandEventBuilder option(@NotNull String name, @NotNull String value) { + public @NotNull SlashCommandInteractionEventBuilder option(@NotNull String name, @NotNull String value) { // TODO Also add overloads for other types requireOption(name, OptionType.STRING); nameToOption.put(name, new Option(name, value, OptionType.STRING)); @@ -97,7 +97,7 @@ public final class SlashCommandEventBuilder { * * @return this builder instance for chaining */ - public @NotNull SlashCommandEventBuilder clearOptions() { + public @NotNull SlashCommandInteractionEventBuilder clearOptions() { nameToOption.clear(); return this; } @@ -113,7 +113,7 @@ public final class SlashCommandEventBuilder { * @throws IllegalArgumentException if the subcommand does not exist in the corresponding * command, as specified by its {@link SlashCommand#getData()} */ - public @NotNull SlashCommandEventBuilder subcommand(@Nullable String subcommand) { + public @NotNull SlashCommandInteractionEventBuilder subcommand(@Nullable String subcommand) { if (subcommand != null) { requireSubcommand(subcommand); } @@ -123,37 +123,37 @@ public final class SlashCommandEventBuilder { } @NotNull - SlashCommandEventBuilder command(@NotNull SlashCommand command) { + SlashCommandInteractionEventBuilder command(@NotNull SlashCommand command) { this.command = command; return this; } @NotNull - SlashCommandEventBuilder channelId(@NotNull String channelId) { + SlashCommandInteractionEventBuilder channelId(@NotNull String channelId) { this.channelId = channelId; return this; } @NotNull - SlashCommandEventBuilder token(@NotNull String token) { + SlashCommandInteractionEventBuilder token(@NotNull String token) { this.token = token; return this; } @NotNull - SlashCommandEventBuilder applicationId(@NotNull String applicationId) { + SlashCommandInteractionEventBuilder applicationId(@NotNull String applicationId) { this.applicationId = applicationId; return this; } @NotNull - SlashCommandEventBuilder guildId(@NotNull String guildId) { + SlashCommandInteractionEventBuilder guildId(@NotNull String guildId) { this.guildId = guildId; return this; } @NotNull - SlashCommandEventBuilder userId(@NotNull String userId) { + SlashCommandInteractionEventBuilder userId(@NotNull String userId) { this.userId = userId; return this; } @@ -164,7 +164,7 @@ SlashCommandEventBuilder userId(@NotNull String userId) { * * @return the created slash command instance */ - public @NotNull SlashCommandEvent build() { + public @NotNull SlashCommandInteractionEvent build() { PayloadSlashCommand event = createEvent(); String json; @@ -174,8 +174,8 @@ SlashCommandEventBuilder userId(@NotNull String userId) { throw new IllegalStateException(e); } - return mockOperator.apply(new SlashCommandEvent(jda, 0, - new CommandInteractionImpl(jda, DataObject.fromJson(json)))); + return mockOperator.apply(new SlashCommandInteractionEvent(jda, 0, + new SlashCommandInteractionImpl(jda, DataObject.fromJson(json)))); } private @NotNull PayloadSlashCommand createEvent() { From f78a63ebf3addccdfb37267553b0151feba111f1 Mon Sep 17 00:00:00 2001 From: nltbee Date: Thu, 17 Mar 2022 14:29:50 +0100 Subject: [PATCH 3/3] Upgrade JDA to alpha 9 --- application/build.gradle | 2 +- .../java/org/togetherjava/tjbot/commands/free/FreeUtil.java | 4 +--- .../src/test/java/org/togetherjava/tjbot/jda/JdaTester.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index 6929cafd39..28e4136531 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -41,7 +41,7 @@ shadowJar { dependencies { implementation project(':database') - implementation 'net.dv8tion:JDA:5.0.0-alpha.5' + implementation 'net.dv8tion:JDA:5.0.0-alpha.9' implementation 'org.apache.logging.log4j:log4j-core:2.16.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.16.0' diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java index 627d2b3b35..5274a41b68 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java @@ -64,9 +64,7 @@ public static void sendErrorMessage(@NotNull IReplyCallback interaction, @NotNul * @return the id of the latest message or empty if it could not be retrieved. */ public static @NotNull OptionalLong getLastMessageId(@NotNull TextChannel channel) { - if (channel.hasLatestMessage()) { - return OptionalLong.of(channel.getLatestMessageIdLong()); - } + // black magic to convert Optional into OptionalLong because Optional does not have // .mapToLong return getChannelHistory(channel, 1).stream() diff --git a/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java b/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java index 148b50162f..ccdbe2591a 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java @@ -77,7 +77,7 @@ public JdaTester() { GuildImpl guild = spy(new GuildImpl(jda, GUILD_ID)); member = spy(new MemberImpl(guild, user)); TextChannelImpl textChannel = spy(new TextChannelImpl(TEXT_CHANNEL_ID, guild)); - PrivateChannelImpl privateChannel = spy(new PrivateChannelImpl(PRIVATE_CHANNEL_ID, user)); + PrivateChannelImpl privateChannel = spy(new PrivateChannelImpl(jda, PRIVATE_CHANNEL_ID, user)); MessageAction messageAction = mock(MessageActionImpl.class); EntityBuilder entityBuilder = mock(EntityBuilder.class);