diff --git a/application/build.gradle b/application/build.gradle index 3ed6987a3f..28e4136531 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.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/Application.java b/application/src/main/java/org/togetherjava/tjbot/Application.java index e26f948db2..e0995470d4 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/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/SlashCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java index a5a01c20e8..fd1c2c2c08 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,9 +107,9 @@ 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 - * 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. + * {@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. *

* The component ID has to be a UUID-string (see {@link java.util.UUID}), which is associated to * a specific database entry, containing meta information about the command being executed. Such @@ -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,10 @@ 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,15 +171,16 @@ 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 - * to use this. + * 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..a8bb33b9ab 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,12 +17,12 @@ /** * 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 - * to {@link Features}. + * 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 - * implementation is empty, the adapter will not react to such events. + * 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. *

*

* The adapter manages all command related data itself, which can be provided during construction @@ -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,20 @@ 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 +141,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 de5f9c5716..594489b223 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,16 +4,17 @@ 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.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; @@ -77,7 +78,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") @@ -93,8 +94,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())); addMenuOptions(event, menu, "Select the roles to display", 1); @@ -115,13 +116,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"); @@ -164,7 +165,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"); @@ -187,13 +188,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()); @@ -237,11 +238,10 @@ 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())) - .setPlaceholder("Select your roles") - .setMaxValues(selectedRoles.size()) - .setMinValues(0); + SelectMenu.Builder menu = SelectMenu.create(generateComponentId(event.getUser().getId())) + .setPlaceholder("Select your roles") + .setMaxValues(selectedRoles.size()) + .setMinValues(0); selectedRoles.forEach(role -> menu.addOption(role.getName(), role.getId())); @@ -273,7 +273,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/SuggestionsUpDownVoter.java b/application/src/main/java/org/togetherjava/tjbot/commands/basic/SuggestionsUpDownVoter.java index 8966932dcd..e3d7b5b29a 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/basic/SuggestionsUpDownVoter.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/basic/SuggestionsUpDownVoter.java @@ -3,7 +3,7 @@ import net.dv8tion.jda.api.entities.Emote; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.requests.ErrorResponse; import org.jetbrains.annotations.NotNull; @@ -39,8 +39,8 @@ public SuggestionsUpDownVoter(@NotNull Config config) { } @Override - public void onMessageReceived(@NotNull GuildMessageReceivedEvent event) { - if (event.getAuthor().isBot() || event.isWebhookMessage()) { + public void onMessageReceived(@NotNull MessageReceivedEvent event) { + if (event.getAuthor().isBot() || event.isWebhookMessage() || !event.isFromGuild()) { return; } 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..04819cd751 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,12 +118,13 @@ 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"); - 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 +132,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!") @@ -177,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) { @@ -193,8 +193,9 @@ 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! @@ -202,7 +203,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..4b31487515 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,14 +1,13 @@ 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 - * usages. + * {@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 * ID, when triggered 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..41b9ef0a3c 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,8 +11,9 @@ * 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 - * more context on how to use this. + * 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 * payload from the ID. 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..e616592bd0 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,8 +12,9 @@ * 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 - * more context on how to use this. + * 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 * from payload. 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..ad4dcde67e 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,8 +26,8 @@ /** * 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 - * details. + * {@link org.togetherjava.tjbot.commands.SlashCommand#onSlashCommand(SlashCommandInteractionEvent)} + * for details. *

* Use {@link #putOrThrow(UUID, ComponentId, Lifespan)} to put and persist a component ID; and * {@link #get(UUID)} to get it back. Component IDs are persisted during application runs and can 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/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 dea8890c7c..5ac0ff2b57 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,8 +8,8 @@ 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.message.guild.GuildMessageReceivedEvent; +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; import org.slf4j.Logger; @@ -129,7 +129,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)) { @@ -159,7 +159,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.", @@ -245,7 +245,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( @@ -294,26 +294,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/free/FreeUtil.java b/application/src/main/java/org/togetherjava/tjbot/commands/free/FreeUtil.java index 99a002c257..0ab0711a4c 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,8 @@ 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(); } @@ -64,9 +65,7 @@ public static void sendErrorMessage(@NotNull Interaction interaction, @NotNull S * @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/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 9a8c67e2d3..edd7c0df43 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,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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; @@ -112,7 +112,7 @@ public AuditCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Confi } @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(); @@ -130,7 +130,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)) { @@ -140,7 +140,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 d4a700d02b..109b1275bb 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,10 @@ 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; @@ -77,7 +77,7 @@ public BanCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config } 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); @@ -121,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) { @@ -146,7 +146,8 @@ 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)) @@ -175,7 +176,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)) { @@ -196,7 +197,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 b943b1e27d..17bd9cf460 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,13 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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 +57,15 @@ public KickCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config 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 44f4be3de6..48119596d4 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 @@ -3,7 +3,7 @@ import net.dv8tion.jda.api.EmbedBuilder; 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; @@ -50,7 +50,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; } @@ -78,7 +78,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 @@ -113,7 +113,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." @@ -149,7 +149,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." @@ -164,7 +164,8 @@ 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)) @@ -206,7 +207,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" @@ -254,7 +255,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." @@ -281,7 +282,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 bde61f0c59..7b4f244ef1 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,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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; @@ -68,7 +68,7 @@ public MuteCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config 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(); } @@ -126,7 +126,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(result -> hasSentDm)) @@ -138,7 +138,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, config).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -156,7 +156,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/NoteCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/NoteCommand.java index bc027947b8..285e4973ca 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/NoteCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/NoteCommand.java @@ -1,8 +1,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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 org.jetbrains.annotations.NotNull; @@ -54,7 +54,7 @@ public NoteCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { OptionMapping targetOption = event.getOption(USER_OPTION); Member author = event.getMember(); Guild guild = event.getGuild(); @@ -70,7 +70,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { @SuppressWarnings("BooleanMethodNameMustStartWithQuestion") private boolean handleChecks(@NotNull Member bot, @NotNull Member author, - @Nullable Member target, CharSequence content, @NotNull Interaction event) { + @Nullable Member target, CharSequence content, @NotNull IReplyCallback event) { if (target != null && !ModerationUtils.handleCanInteractWithTarget(ACTION_VERB, bot, author, target, event)) { return false; @@ -84,7 +84,7 @@ private boolean handleChecks(@NotNull Member bot, @NotNull Member author, } private void sendNote(@NotNull User target, @NotNull Member author, @NotNull String content, - @NotNull ISnowflake guild, @NotNull Interaction event) { + @NotNull ISnowflake guild, @NotNull IReplyCallback event) { storeNote(target, author, content, guild); sendFeedback(target, author, content, event); } @@ -100,7 +100,7 @@ private void storeNote(@NotNull User target, @NotNull Member author, @NotNull St } private static void sendFeedback(@NotNull User target, @NotNull Member author, - @NotNull String noteContent, @NotNull Interaction event) { + @NotNull String noteContent, @NotNull IReplyCallback event) { MessageEmbed feedback = ModerationUtils.createActionResponse(author.getUser(), ModerationAction.NOTE, target, null, noteContent); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/QuarantineCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/QuarantineCommand.java index 9d655b0440..cc3453dff5 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/QuarantineCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/QuarantineCommand.java @@ -2,8 +2,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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; @@ -59,7 +59,7 @@ public QuarantineCommand(@NotNull ModerationActionsStore actionsStore, @NotNull this.actionsStore = Objects.requireNonNull(actionsStore); } - private static void handleAlreadyQuarantinedTarget(@NotNull Interaction event) { + private static void handleAlreadyQuarantinedTarget(@NotNull IReplyCallback event) { event.reply("The user is already quarantined.").setEphemeral(true).queue(); } @@ -107,7 +107,8 @@ private AuditableRestAction quarantineUser(@NotNull Member target, @NotNul } private void quarantineUserFlow(@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 -> quarantineUser(target, author, reason, guild) .map(result -> hasSentDm)) @@ -119,7 +120,7 @@ private void quarantineUserFlow(@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.getQuarantinedRole(guild, config).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -139,7 +140,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 = event.getOption(TARGET_OPTION).getAsMember(); Member author = event.getMember(); String reason = event.getOption(REASON_OPTION).getAsString(); 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 b7c72b6948..c26670f831 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,9 @@ 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; @@ -51,7 +51,7 @@ public UnbanCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Confi } 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); @@ -67,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) { @@ -91,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; } @@ -108,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 dde79efa3a..bd2e79bdd7 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,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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; @@ -56,7 +56,7 @@ public UnmuteCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Conf 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(); } @@ -99,7 +99,8 @@ 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(result -> hasSentDm)) @@ -111,7 +112,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, config).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -129,7 +130,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/UnquarantineCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnquarantineCommand.java index 0da00e5527..9e33c4841f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnquarantineCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/UnquarantineCommand.java @@ -2,8 +2,8 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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; @@ -61,7 +61,7 @@ public UnquarantineCommand(@NotNull ModerationActionsStore actionsStore, this.actionsStore = Objects.requireNonNull(actionsStore); } - private static void handleNotQuarantinedTarget(@NotNull Interaction event) { + private static void handleNotQuarantinedTarget(@NotNull IReplyCallback event) { event.reply("The user is not quarantined.").setEphemeral(true).queue(); } @@ -106,7 +106,8 @@ private AuditableRestAction unquarantineUser(@NotNull Member target, } private void unquarantineUserFlow(@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 -> unquarantineUser(target, author, reason, guild) .map(result -> hasSentDm)) @@ -118,7 +119,7 @@ private void unquarantineUserFlow(@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.getQuarantinedRole(guild, config).orElse(null), ACTION_VERB, target, bot, author, guild, hasRequiredRole, reason, event)) { @@ -138,7 +139,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 = event.getOption(TARGET_OPTION).getAsMember(); Member author = event.getMember(); String reason = event.getOption(REASON_OPTION).getAsString(); 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 f82ffb00b9..32c84a400d 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; @@ -54,7 +54,7 @@ public WarnCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config 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; @@ -64,7 +64,8 @@ public WarnCommand(@NotNull ModerationActionsStore actionsStore, @NotNull Config } 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( @@ -99,7 +100,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"); @@ -117,7 +118,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/reminder/RemindCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/reminder/RemindCommand.java index 72396dfd37..664bd69306 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/reminder/RemindCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/reminder/RemindCommand.java @@ -2,8 +2,8 @@ import net.dv8tion.jda.api.entities.ISnowflake; import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; -import net.dv8tion.jda.api.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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 org.jetbrains.annotations.NotNull; @@ -71,7 +71,7 @@ public RemindCommand(@NotNull Database database) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { int timeAmount = Math.toIntExact(event.getOption(TIME_AMOUNT_OPTION).getAsLong()); String timeUnit = event.getOption(TIME_UNIT_OPTION).getAsString(); String content = event.getOption(CONTENT_OPTION).getAsString(); @@ -116,7 +116,7 @@ public void onSlashCommand(@NotNull SlashCommandEvent event) { } private static boolean handleIsRemindAtWithinLimits(@NotNull Instant remindAt, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { ZonedDateTime maxWhen = ZonedDateTime.now(ZoneOffset.UTC).plus(MAX_TIME_PERIOD); if (remindAt.atZone(ZoneOffset.UTC).isBefore(maxWhen)) { @@ -133,7 +133,7 @@ private static boolean handleIsRemindAtWithinLimits(@NotNull Instant remindAt, } private boolean handleIsUserBelowMaxPendingReminders(@NotNull ISnowflake author, - @NotNull Interaction event) { + @NotNull IReplyCallback event) { int pendingReminders = database.read(context -> context.fetchCount(PENDING_REMINDERS, PENDING_REMINDERS.AUTHOR_ID.equal(author.getIdLong()))); 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 57dce916b2..55d3dc160b 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.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; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.interactions.commands.Command; @@ -155,19 +155,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() @@ -178,21 +182,21 @@ public void onGuildMessageUpdate(@NotNull GuildMessageUpdateEvent 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 @@ -282,7 +286,7 @@ private 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/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 73308fd317..de59fae319 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 e2bae097b8..3eb996a7cb 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 @@ -5,9 +5,9 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.User; -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; @@ -112,7 +112,7 @@ public TagManageCommand(@NotNull TagSystem tagSystem, @NotNull Config config, .addOption(OptionType.STRING, ID_OPTION, ID_DESCRIPTION, true)); } - private static void sendSuccessMessage(@NotNull Interaction event, @NotNull String id, + 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); @@ -137,7 +137,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) { @@ -151,7 +151,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) @@ -171,7 +171,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; @@ -338,7 +338,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 e17b8c2160..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,8 +2,8 @@ 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; @@ -49,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 @@ -73,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 9e46748efd..7b0b77958f 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,9 @@ 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.interactions.Interaction; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +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 +66,7 @@ public TopHelpersCommand(@NotNull Database database, @NotNull Config config) { } @Override - public void onSlashCommand(@NotNull SlashCommandEvent event) { + public void onSlashCommand(@NotNull SlashCommandInteractionEvent event) { if (!handleHasAuthorRole(event.getMember(), event)) { return; } @@ -91,7 +92,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 +126,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/tophelper/TopHelpersMessageListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/tophelper/TopHelpersMessageListener.java index 26c314e8f0..b7643df083 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; @@ -29,7 +29,7 @@ public TopHelpersMessageListener(@NotNull Database database, @NotNull Config con } @Override - public void onMessageReceived(@NotNull GuildMessageReceivedEvent event) { + public void onMessageReceived(@NotNull MessageReceivedEvent event) { if (event.getAuthor().isBot() || event.isWebhookMessage()) { return; } @@ -37,7 +37,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()) diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/utils/DiscordClientAction.java b/application/src/main/java/org/togetherjava/tjbot/commands/utils/DiscordClientAction.java index 4effea23c3..bf3b947e44 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/utils/DiscordClientAction.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/utils/DiscordClientAction.java @@ -1,7 +1,7 @@ package org.togetherjava.tjbot.commands.utils; -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.Contract; import org.jetbrains.annotations.NotNull; 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 d363ae2dd2..f92d05d0f6 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.jetbrains.annotations.NotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -14,8 +14,9 @@ final class PingCommandTest { private JdaTester jdaTester; private SlashCommand command; - private @NotNull SlashCommandEvent triggerSlashCommand() { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command).build(); + private @NotNull SlashCommandInteractionEvent triggerSlashCommand() { + SlashCommandInteractionEvent event = + jdaTester.createSlashCommandInteractionEvent(command).build(); command.onSlashCommand(event); return event; } @@ -31,7 +32,7 @@ void setUp() { void pingRespondsWithPong() { // GIVEN // WHEN using '/ping' - SlashCommandEvent event = triggerSlashCommand(); + SlashCommandInteractionEvent event = triggerSlashCommand(); // THEN the bot replies with pong verify(event).reply("Pong!"); diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagCommandTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagCommandTest.java index eb4311e2cf..9c59de5ff5 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagCommandTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagCommandTest.java @@ -2,7 +2,7 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; @@ -12,7 +12,7 @@ import org.togetherjava.tjbot.db.Database; import org.togetherjava.tjbot.db.generated.tables.Tags; import org.togetherjava.tjbot.jda.JdaTester; -import org.togetherjava.tjbot.jda.SlashCommandEventBuilder; +import org.togetherjava.tjbot.jda.SlashCommandInteractionEventBuilder; import static org.mockito.Mockito.*; @@ -29,15 +29,16 @@ void setUp() { command = new TagCommand(system); } - private @NotNull SlashCommandEvent triggerSlashCommand(@NotNull String id, + private @NotNull SlashCommandInteractionEvent triggerSlashCommand(@NotNull String id, @Nullable Member userToReplyTo) { - SlashCommandEventBuilder builder = - jdaTester.createSlashCommandEvent(command).setOption(TagCommand.ID_OPTION, id); + SlashCommandInteractionEventBuilder builder = + jdaTester.createSlashCommandInteractionEvent(command) + .setOption(TagCommand.ID_OPTION, id); if (userToReplyTo != null) { builder.setOption(TagCommand.REPLY_TO_USER_OPTION, userToReplyTo); } - SlashCommandEvent event = builder.build(); + SlashCommandInteractionEvent event = builder.build(); command.onSlashCommand(event); return event; } @@ -47,7 +48,7 @@ void setUp() { void canNotFindTagInEmptySystem() { // GIVEN a system without any tags registered // WHEN triggering the slash command '/tag id:first' - SlashCommandEvent event = triggerSlashCommand("first", null); + SlashCommandInteractionEvent event = triggerSlashCommand("first", null); // THEN responds that the tag could not be found verify(event).reply("Could not find any tag with id 'first'."); @@ -60,7 +61,7 @@ void canNotFindTagSuggestDifferentTag() { system.putTag("first", "foo"); // WHEN triggering the slash command '/tag id:second' - SlashCommandEvent event = triggerSlashCommand("second", null); + SlashCommandInteractionEvent event = triggerSlashCommand("second", null); // THEN responds that the tag could not be found and instead suggests using the other tag verify(event) @@ -74,7 +75,7 @@ void canFindTheTagAndRespondWithContent() { system.putTag("first", "foo"); // WHEN triggering the slash command '/tag id:first' - SlashCommandEvent event = triggerSlashCommand("first", null); + SlashCommandInteractionEvent event = triggerSlashCommand("first", null); // THEN finds the tag and responds with its content verify(event).replyEmbeds(any(MessageEmbed.class)); @@ -88,7 +89,7 @@ void canFindTagsAndRepliesToUser() { Member userToReplyTo = jdaTester.createMemberSpy(1); // WHEN triggering the slash command '/tag id:first reply-to:...' with that user - SlashCommandEvent event = triggerSlashCommand("first", userToReplyTo); + SlashCommandInteractionEvent event = triggerSlashCommand("first", userToReplyTo); // THEN responds with the tags content and replies to the user verify(event).replyEmbeds(any(MessageEmbed.class)); diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagManageCommandTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagManageCommandTest.java index 70ba13ed88..3bec6f8ac3 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagManageCommandTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagManageCommandTest.java @@ -6,7 +6,7 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; 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.requests.ErrorResponse; import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.BeforeEach; @@ -36,7 +36,7 @@ final class TagManageCommandTest { private Member moderator; private ModAuditLogWriter modAuditLogWriter; - private static @NotNull MessageEmbed getResponse(@NotNull SlashCommandEvent event) { + private static @NotNull MessageEmbed getResponse(@NotNull SlashCommandInteractionEvent event) { ArgumentCaptor responseCaptor = ArgumentCaptor.forClass(MessageEmbed.class); verify(event).replyEmbeds(responseCaptor.capture()); return responseCaptor.getValue(); @@ -61,13 +61,13 @@ void setUp() { when(moderatorRole.getName()).thenReturn(moderatorRoleName); } - private @NotNull SlashCommandEvent triggerRawCommand(@NotNull String tagId) { + private @NotNull SlashCommandInteractionEvent triggerRawCommand(@NotNull String tagId) { return triggerRawCommandWithUser(tagId, moderator); } - private @NotNull SlashCommandEvent triggerRawCommandWithUser(@NotNull String tagId, + private @NotNull SlashCommandInteractionEvent triggerRawCommandWithUser(@NotNull String tagId, @NotNull Member user) { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command) + SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command) .setSubcommand(TagManageCommand.Subcommand.RAW.getName()) .setOption(TagManageCommand.ID_OPTION, tagId) .setUserWhoTriggered(user) @@ -77,20 +77,20 @@ void setUp() { return event; } - private @NotNull SlashCommandEvent triggerCreateCommand(@NotNull String tagId, + private @NotNull SlashCommandInteractionEvent triggerCreateCommand(@NotNull String tagId, @NotNull String content) { return triggerTagContentCommand(TagManageCommand.Subcommand.CREATE, tagId, content); } - private @NotNull SlashCommandEvent triggerEditCommand(@NotNull String tagId, + private @NotNull SlashCommandInteractionEvent triggerEditCommand(@NotNull String tagId, @NotNull String content) { return triggerTagContentCommand(TagManageCommand.Subcommand.EDIT, tagId, content); } - private @NotNull SlashCommandEvent triggerTagContentCommand( + private @NotNull SlashCommandInteractionEvent triggerTagContentCommand( @NotNull TagManageCommand.Subcommand subcommand, @NotNull String tagId, @NotNull String content) { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command) + SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command) .setSubcommand(subcommand.getName()) .setOption(TagManageCommand.ID_OPTION, tagId) .setOption(TagManageCommand.CONTENT_OPTION, content) @@ -101,22 +101,22 @@ void setUp() { return event; } - private @NotNull SlashCommandEvent triggerCreateWithMessageCommand(@NotNull String tagId, - @NotNull String messageId) { + private @NotNull SlashCommandInteractionEvent triggerCreateWithMessageCommand( + @NotNull String tagId, @NotNull String messageId) { return triggerTagMessageCommand(TagManageCommand.Subcommand.CREATE_WITH_MESSAGE, tagId, messageId); } - private @NotNull SlashCommandEvent triggerEditWithMessageCommand(@NotNull String tagId, - @NotNull String messageId) { + private @NotNull SlashCommandInteractionEvent triggerEditWithMessageCommand( + @NotNull String tagId, @NotNull String messageId) { return triggerTagMessageCommand(TagManageCommand.Subcommand.EDIT_WITH_MESSAGE, tagId, messageId); } - private @NotNull SlashCommandEvent triggerTagMessageCommand( + private @NotNull SlashCommandInteractionEvent triggerTagMessageCommand( @NotNull TagManageCommand.Subcommand subcommand, @NotNull String tagId, @NotNull String messageId) { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command) + SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command) .setSubcommand(subcommand.getName()) .setOption(TagManageCommand.ID_OPTION, tagId) .setOption(TagManageCommand.MESSAGE_ID_OPTION, messageId) @@ -127,8 +127,8 @@ void setUp() { return event; } - private @NotNull SlashCommandEvent triggerDeleteCommand(@NotNull String tagId) { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command) + private @NotNull SlashCommandInteractionEvent triggerDeleteCommand(@NotNull String tagId) { + SlashCommandInteractionEvent event = jdaTester.createSlashCommandInteractionEvent(command) .setSubcommand(TagManageCommand.Subcommand.DELETE.getName()) .setOption(TagManageCommand.ID_OPTION, tagId) .setUserWhoTriggered(moderator) @@ -156,7 +156,7 @@ void commandCanNotBeUsedWithoutRoles() { Member regularUser = jdaTester.createMemberSpy(1); // WHEN the regular user triggers any '/tag-manage' command - SlashCommandEvent event = triggerRawCommandWithUser("foo", regularUser); + SlashCommandInteractionEvent event = triggerRawCommandWithUser("foo", regularUser); // THEN the command can not be used since the user lacks roles verify(event).reply("Tags can only be managed by users with a corresponding role."); @@ -168,7 +168,7 @@ void commandCanNotBeUsedWithoutRoles() { void rawTagCanNotFindUnknownTag() { // GIVEN a tag system without any tags // WHEN using '/tag-manage raw id:unknown' - SlashCommandEvent event = triggerRawCommand("unknown"); + SlashCommandInteractionEvent event = triggerRawCommand("unknown"); // THEN the command can not find the tag and responds accordingly verify(event).reply(startsWith("Could not find any tag")); @@ -197,7 +197,7 @@ void createTagThatAlreadyExistsFails() { system.putTag("foo", "old"); // WHEN using '/tag-manage create id:foo content:new' - SlashCommandEvent event = triggerCreateCommand("foo", "new"); + SlashCommandInteractionEvent event = triggerCreateCommand("foo", "new"); // THEN the command fails and responds accordingly, the tag is still there and unchanged verify(event).reply("The tag with id 'foo' already exists."); @@ -211,7 +211,7 @@ void createTagThatAlreadyExistsFails() { void createNewTagWorks() { // GIVEN a tag system without any tags // WHEN using '/tag-manage create id:foo content:bar' - SlashCommandEvent event = triggerCreateCommand("foo", "bar"); + SlashCommandInteractionEvent event = triggerCreateCommand("foo", "bar"); // THEN the command succeeds and the system contains the tag assertEquals("Success", getResponse(event).getTitle()); @@ -227,7 +227,7 @@ void createNewTagWorks() { void editUnknownTagFails() { // GIVEN a tag system without any tags // WHEN using '/tag-manage edit id:foo content:new' - SlashCommandEvent event = triggerEditCommand("foo", "new"); + SlashCommandInteractionEvent event = triggerEditCommand("foo", "new"); // THEN the command fails and responds accordingly, the tag was not created verify(event).reply(startsWith("Could not find any tag with id")); @@ -242,7 +242,7 @@ void editExistingTagWorks() { system.putTag("foo", "old"); // WHEN using '/tag-manage edit id:foo content:new' - SlashCommandEvent event = triggerEditCommand("foo", "new"); + SlashCommandInteractionEvent event = triggerEditCommand("foo", "new"); // THEN the command succeeds and the content of the tag was changed assertEquals("Success", getResponse(event).getTitle()); @@ -258,7 +258,7 @@ void editExistingTagWorks() { void deleteUnknownTagFails() { // GIVEN a tag system without any tags // WHEN using '/tag-manage delete id:foo' - SlashCommandEvent event = triggerDeleteCommand("foo"); + SlashCommandInteractionEvent event = triggerDeleteCommand("foo"); // THEN the command fails and responds accordingly verify(event).reply(startsWith("Could not find any tag with id")); @@ -272,7 +272,7 @@ void deleteExistingTagWorks() { system.putTag("foo", "bar"); // WHEN using '/tag-manage delete id:foo' - SlashCommandEvent event = triggerDeleteCommand("foo"); + SlashCommandInteractionEvent event = triggerDeleteCommand("foo"); // THEN the command succeeds and the tag was deleted assertEquals("Success", getResponse(event).getTitle()); @@ -287,7 +287,7 @@ void deleteExistingTagWorks() { void createWithMessageFailsForInvalidMessageId() { // GIVEN a tag system without any tags // WHEN using '/tag-manage create-with-message id:foo message-id:bar' - SlashCommandEvent event = triggerCreateWithMessageCommand("foo", "bar"); + SlashCommandInteractionEvent event = triggerCreateWithMessageCommand("foo", "bar"); // THEN the command fails and responds accordingly, the tag was not created verify(event).reply("The given message id 'bar' is invalid, expected a number."); @@ -303,7 +303,7 @@ void createWithMessageTagThatAlreadyExistsFails() { postMessage("new", "1"); // WHEN using '/tag-manage create-with-message id:foo message-id:1' - SlashCommandEvent event = triggerCreateWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerCreateWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag is still there and unchanged verify(event).reply("The tag with id 'foo' already exists."); @@ -319,7 +319,7 @@ void createWithMessageNewTagWorks() { postMessage("bar", "1"); // WHEN using '/tag-manage create-with-message id:foo message-id:1' - SlashCommandEvent event = triggerCreateWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerCreateWithMessageCommand("foo", "1"); // THEN the command succeeds and the system contains the tag assertEquals("Success", getResponse(event).getTitle()); @@ -338,7 +338,7 @@ void createWithMessageUnknownMessageFails() { jdaTester.createErrorResponseException(ErrorResponse.UNKNOWN_MESSAGE)); // WHEN using '/tag-manage create-with-message id:foo message-id:1' - SlashCommandEvent event = triggerCreateWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerCreateWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag was not created verify(event).reply("The message with id '1' does not exist."); @@ -353,7 +353,7 @@ void createWithMessageGenericErrorFails() { failOnRetrieveMessage("1", new IOException("Generic network failure")); // WHEN using '/tag-manage create-with-message id:foo message-id:1' - SlashCommandEvent event = triggerCreateWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerCreateWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag was not created verify(event).reply(startsWith("Something unexpected went wrong")); @@ -368,7 +368,7 @@ void editWithMessageFailsForInvalidMessageId() { system.putTag("foo", "old"); // WHEN using '/tag-manage edit-with-message id:foo message-id:new' - SlashCommandEvent event = triggerEditWithMessageCommand("foo", "bar"); + SlashCommandInteractionEvent event = triggerEditWithMessageCommand("foo", "bar"); // THEN the command fails and responds accordingly, the tags content was not changed verify(event).reply("The given message id 'bar' is invalid, expected a number."); @@ -383,7 +383,7 @@ void editWithMessageUnknownTagFails() { postMessage("bar", "1"); // WHEN using '/tag-manage edit-with-message id:foo message-id:new' - SlashCommandEvent event = triggerEditWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerEditWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag was not created verify(event).reply(startsWith("Could not find any tag with id")); @@ -399,7 +399,7 @@ void editWithMessageExistingTagWorks() { postMessage("new", "1"); // WHEN using '/tag-manage edit-with-message id:foo message-id:1' - SlashCommandEvent event = triggerEditWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerEditWithMessageCommand("foo", "1"); // THEN the command succeeds and the content of the tag was changed assertEquals("Success", getResponse(event).getTitle()); @@ -419,7 +419,7 @@ void editWithMessageUnknownMessageFails() { jdaTester.createErrorResponseException(ErrorResponse.UNKNOWN_MESSAGE)); // WHEN using '/tag-manage edit-with-message id:foo message-id:1' - SlashCommandEvent event = triggerEditWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerEditWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag has not changed verify(event).reply("The message with id '1' does not exist."); @@ -436,7 +436,7 @@ void editWithMessageGenericErrorFails() { failOnRetrieveMessage("1", new IOException("Generic network failure")); // WHEN using '/tag-manage edit-with-message id:foo message-id:1' - SlashCommandEvent event = triggerEditWithMessageCommand("foo", "1"); + SlashCommandInteractionEvent event = triggerEditWithMessageCommand("foo", "1"); // THEN the command fails and responds accordingly, the tag has not changed verify(event).reply(startsWith("Something unexpected went wrong")); diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagSystemTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagSystemTest.java index 440650a31b..9c441b023d 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagSystemTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagSystemTest.java @@ -1,6 +1,6 @@ package org.togetherjava.tjbot.commands.tags; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.togetherjava.tjbot.db.Database; @@ -49,7 +49,8 @@ void createDeleteButton() { @Test void handleIsUnknownTag() { insertTagRaw("known", "foo"); - SlashCommandEvent event = jdaTester.createSlashCommandEvent(new TagCommand(system)).build(); + SlashCommandInteractionEvent event = + jdaTester.createSlashCommandInteractionEvent(new TagCommand(system)).build(); assertFalse(system.handleIsUnknownTag("known", event)); verify(event, never()).reply(anyString()); diff --git a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagsCommandTest.java b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagsCommandTest.java index 4773035e8b..d2481a00b3 100644 --- a/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagsCommandTest.java +++ b/application/src/test/java/org/togetherjava/tjbot/commands/tags/TagsCommandTest.java @@ -3,8 +3,8 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.MessageEmbed; -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.components.ActionRow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,21 +28,23 @@ final class TagsCommandTest { private JdaTester jdaTester; private SlashCommand command; - private static @Nullable String getResponseDescription(@NotNull SlashCommandEvent event) { + private static @Nullable String getResponseDescription( + @NotNull SlashCommandInteractionEvent event) { ArgumentCaptor responseCaptor = ArgumentCaptor.forClass(MessageEmbed.class); verify(event).replyEmbeds(responseCaptor.capture()); return responseCaptor.getValue().getDescription(); } - private @NotNull SlashCommandEvent triggerSlashCommand() { - SlashCommandEvent event = jdaTester.createSlashCommandEvent(command).build(); + private @NotNull SlashCommandInteractionEvent triggerSlashCommand() { + SlashCommandInteractionEvent event = + jdaTester.createSlashCommandInteractionEvent(command).build(); command.onSlashCommand(event); return event; } - private @NotNull ButtonClickEvent triggerButtonClick(@NotNull Member userWhoClicked, + private @NotNull ButtonInteractionEvent triggerButtonClick(@NotNull Member userWhoClicked, long idOfAuthor) { - ButtonClickEvent event = jdaTester.createButtonClickEvent() + ButtonInteractionEvent event = jdaTester.createButtonInteractionEvent() .setUserWhoClicked(userWhoClicked) .setActionRows(ActionRow.of(TagSystem.createDeleteButton("foo"))) .buildWithSingleButton(); @@ -62,7 +64,7 @@ void setUp() { void noResponseForEmptySystem() { // GIVEN a tag system without any tags // WHEN using '/tags' - SlashCommandEvent event = triggerSlashCommand(); + SlashCommandInteractionEvent event = triggerSlashCommand(); // THEN the response has no description assertNull(getResponseDescription(event)); @@ -75,7 +77,7 @@ void singleElementListForOneTag() { system.putTag("first", "foo"); // WHEN using '/tags' - SlashCommandEvent event = triggerSlashCommand(); + SlashCommandInteractionEvent event = triggerSlashCommand(); // THEN the response consists of the single element assertEquals("• first", getResponseDescription(event)); @@ -90,7 +92,7 @@ void multipleElementListForMultipleTag() { system.putTag("third", "baz"); // WHEN using '/tags' - SlashCommandEvent event = triggerSlashCommand(); + SlashCommandInteractionEvent event = triggerSlashCommand(); // THEN the response contains all tags String expectedDescription = """ @@ -108,7 +110,7 @@ void authorCanDeleteList() { Member messageAuthor = jdaTester.createMemberSpy(idOfAuthor); // WHEN the original author clicks the delete button - ButtonClickEvent event = triggerButtonClick(messageAuthor, idOfAuthor); + ButtonInteractionEvent event = triggerButtonClick(messageAuthor, idOfAuthor); // THEN the '/tags' message is deleted verify(event.getMessage()).delete(); @@ -123,7 +125,7 @@ void moderatorCanDeleteList() { doReturn(true).when(moderator).hasPermission(any(Permission.class)); // WHEN the moderator clicks the delete button - ButtonClickEvent event = triggerButtonClick(moderator, idOfAuthor); + ButtonInteractionEvent event = triggerButtonClick(moderator, idOfAuthor); // THEN the '/tags' message is deleted verify(event.getMessage()).delete(); @@ -138,7 +140,7 @@ void othersCanNotDeleteList() { doReturn(false).when(otherUser).hasPermission(any(Permission.class)); // WHEN the other clicks the delete button - ButtonClickEvent event = triggerButtonClick(otherUser, idOfAuthor); + ButtonInteractionEvent event = triggerButtonClick(otherUser, idOfAuthor); // THEN the '/tags' message is not deleted verify(event.getMessage(), never()).delete(); diff --git a/application/src/test/java/org/togetherjava/tjbot/jda/ButtonClickEventBuilder.java b/application/src/test/java/org/togetherjava/tjbot/jda/ButtonClickEventBuilder.java index dbb4178e27..6b9192566b 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/ButtonClickEventBuilder.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/ButtonClickEventBuilder.java @@ -6,9 +6,9 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.events.interaction.ButtonClickEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; 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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.togetherjava.tjbot.commands.SlashCommand; @@ -23,9 +23,9 @@ /** * Builder to create button click events that can be used for example with - * {@link SlashCommand#onButtonClick(ButtonClickEvent, List)}. + * {@link SlashCommand#onButtonClick(ButtonInteractionEvent, List)}. *

- * Create instances of this class by using {@link JdaTester#createButtonClickEvent()}. + * Create instances of this class by using {@link JdaTester#createButtonInteractionEvent()}. *

* Among other Discord related things, the builder optionally accepts a message * ({@link #setMessage(Message)}) and the user who clicked on the button @@ -69,12 +69,12 @@ */ public final class ButtonClickEventBuilder { private static final ObjectMapper JSON = new ObjectMapper(); - private final @NotNull Supplier mockEventSupplier; + private final @NotNull Supplier mockEventSupplier; private final UnaryOperator mockMessageOperator; private MessageBuilder messageBuilder; private Member userWhoClicked; - ButtonClickEventBuilder(@NotNull Supplier mockEventSupplier, + ButtonClickEventBuilder(@NotNull Supplier mockEventSupplier, @NotNull UnaryOperator mockMessageOperator) { this.mockEventSupplier = mockEventSupplier; this.mockMessageOperator = mockMessageOperator; @@ -158,7 +158,7 @@ public ButtonClickEventBuilder setUserWhoClicked(@NotNull Member userWhoClicked) * * @return the created slash command instance */ - public @NotNull ButtonClickEvent buildWithSingleButton() { + public @NotNull ButtonInteractionEvent buildWithSingleButton() { return createEvent(null); } @@ -173,11 +173,11 @@ public ButtonClickEventBuilder setUserWhoClicked(@NotNull Member userWhoClicked) * contained in the message. * @return the created slash command instance */ - public @NotNull ButtonClickEvent build(@NotNull Button clickedButton) { + public @NotNull ButtonInteractionEvent build(@NotNull Button clickedButton) { return createEvent(clickedButton); } - private @NotNull ButtonClickEvent createEvent(@Nullable Button maybeClickedButton) { + private @NotNull ButtonInteractionEvent createEvent(@Nullable Button maybeClickedButton) { Message message = mockMessageOperator.apply(messageBuilder.build()); Button clickedButton = determineClickedButton(maybeClickedButton, message); @@ -226,9 +226,9 @@ public ButtonClickEventBuilder setUserWhoClicked(@NotNull Member userWhoClicked) return message.getActionRows().stream().map(ActionRow::getButtons).flatMap(List::stream); } - private @NotNull ButtonClickEvent mockButtonClickEvent(@NotNull Message message, + private @NotNull ButtonInteractionEvent mockButtonClickEvent(@NotNull Message message, @NotNull Button clickedButton) { - ButtonClickEvent event = mockEventSupplier.get(); + ButtonInteractionEvent event = mockEventSupplier.get(); when(event.getMessage()).thenReturn(message); when(event.getButton()).thenReturn(clickedButton); 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 a9d9500e73..4c96a216ae 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java @@ -3,15 +3,15 @@ import net.dv8tion.jda.api.AccountType; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.*; -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.exceptions.ErrorResponseException; -import net.dv8tion.jda.api.interactions.Interaction; -import net.dv8tion.jda.api.interactions.components.Component; +import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; +import net.dv8tion.jda.api.interactions.components.ItemComponent; import net.dv8tion.jda.api.requests.ErrorResponse; import net.dv8tion.jda.api.requests.Response; import net.dv8tion.jda.api.requests.RestAction; -import net.dv8tion.jda.api.requests.restaction.interactions.ReplyAction; +import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import net.dv8tion.jda.api.utils.AttachmentOption; import net.dv8tion.jda.api.utils.ConcurrentSessionController; import net.dv8tion.jda.api.utils.cache.CacheFlag; @@ -20,7 +20,7 @@ import net.dv8tion.jda.internal.requests.Requester; import net.dv8tion.jda.internal.requests.restaction.AuditableRestActionImpl; 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.jetbrains.annotations.Nullable; @@ -46,8 +46,8 @@ * 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 - * be exploited for testing. + * {@link #createSlashCommandInteractionEvent(SlashCommand)}. The created events are Mockito mocks, + * which can be exploited for testing. *

* An example test using this class might look like: * @@ -57,7 +57,8 @@ * 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).reply("Pong!"); @@ -79,7 +80,7 @@ public final class JdaTester { private final JDAImpl jda; private final MemberImpl member; private final GuildImpl guild; - private final ReplyActionImpl replyAction; + private final ReplyCallbackActionImpl replyAction; private final AuditableRestActionImpl auditableRestAction; private final MessageActionImpl messageAction; private final TextChannelImpl textChannel; @@ -105,7 +106,7 @@ public JdaTester() { Member selfMember = spy(new MemberImpl(guild, selfUser)); member = spy(new MemberImpl(guild, user)); textChannel = spy(new TextChannelImpl(TEXT_CHANNEL_ID, guild)); - privateChannel = spy(new PrivateChannelImpl(PRIVATE_CHANNEL_ID, user)); + privateChannel = spy(new PrivateChannelImpl(jda, PRIVATE_CHANNEL_ID, user)); messageAction = mock(MessageActionImpl.class); EntityBuilder entityBuilder = mock(EntityBuilder.class); Role everyoneRole = new RoleImpl(GUILD_ID, guild); @@ -134,10 +135,11 @@ public JdaTester() { doReturn(messageAction).when(privateChannel).sendMessage(anyString()); - replyAction = mock(ReplyActionImpl.class); + replyAction = mock(ReplyCallbackActionImpl.class); when(replyAction.setEphemeral(anyBoolean())).thenReturn(replyAction); when(replyAction.addActionRow(anyCollection())).thenReturn(replyAction); - when(replyAction.addActionRow(ArgumentMatchers.any())).thenReturn(replyAction); + when(replyAction.addActionRow(ArgumentMatchers.any())) + .thenReturn(replyAction); when(replyAction.setContent(anyString())).thenReturn(replyAction); when(replyAction.addFile(any(byte[].class), any(String.class), any(AttachmentOption.class))) .thenReturn(replyAction); @@ -157,7 +159,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. @@ -165,15 +167,15 @@ 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); - mockInteraction(slashCommandEvent); - return slashCommandEvent; + UnaryOperator mockOperator = event -> { + SlashCommandInteractionEvent SlashCommandInteractionEvent = spy(event); + mockInteraction(SlashCommandInteractionEvent); + return SlashCommandInteractionEvent; }; - return new SlashCommandEventBuilder(jda, mockOperator).setCommand(command) + return new SlashCommandInteractionEventBuilder(jda, mockOperator).setCommand(command) .setToken(TEST_TOKEN) .setChannelId(String.valueOf(TEXT_CHANNEL_ID)) .setApplicationId(String.valueOf(APPLICATION_ID)) @@ -184,16 +186,16 @@ public JdaTester() { /** * Creates a Mockito mocked button click event, which can be used for - * {@link SlashCommand#onButtonClick(ButtonClickEvent, List)}. + * {@link SlashCommand#onButtonClick(ButtonInteractionEvent, List)}. *

* The method creates a builder that can be used to further adjust the event before creation, * e.g. provide options. * * @return a builder used to create a Mockito mocked slash command event */ - public @NotNull ButtonClickEventBuilder createButtonClickEvent() { - Supplier mockEventSupplier = () -> { - ButtonClickEvent event = mock(ButtonClickEvent.class); + public @NotNull ButtonClickEventBuilder createButtonInteractionEvent() { + Supplier mockEventSupplier = () -> { + ButtonInteractionEvent event = mock(ButtonInteractionEvent.class); mockButtonClickEvent(event); return event; }; @@ -240,12 +242,12 @@ public JdaTester() { * Gets the Mockito mock used as universal reply action by all mocks created by this tester * instance. *

- * For example the events created by {@link #createSlashCommandEvent(SlashCommand)} will return - * this mock on several of their methods. + * For example the events created by {@link #createSlashCommandInteractionEvent(SlashCommand)} + * will return this mock on several of their methods. * * @return the reply action mock used by this tester */ - public @NotNull ReplyAction getReplyActionMock() { + public @NotNull ReplyCallbackAction getReplyActionMock() { return replyAction; } @@ -253,8 +255,8 @@ public JdaTester() { * Gets the text channel spy used as universal text channel by all mocks created by this tester * instance. *

- * For example the events created by {@link #createSlashCommandEvent(SlashCommand)} will return - * this spy on several of their methods. + * For example the events created by {@link #createSlashCommandInteractionEvent(SlashCommand)} + * will return this spy on several of their methods. * * @return the text channel spy used by this tester */ @@ -267,7 +269,7 @@ public JdaTester() { *

* Such an action is useful for testing things involving calls like * {@link TextChannel#retrieveMessageById(long)} or similar, example: - * + * *

      * {
      *     @code
@@ -279,7 +281,7 @@ public JdaTester() {
      *     doReturn(action).when(jdaTester.getTextChannelSpy()).retrieveMessageById("1");
      * }
      * 
- * + * * @param t the object to consume on success * @param the type of the object to consume * @return the mocked action @@ -307,7 +309,7 @@ public JdaTester() { *

* Such an action is useful for testing things involving calls like * {@link TextChannel#retrieveMessageById(long)} or similar, example: - * + * *

      * {
      *     @code
@@ -319,7 +321,7 @@ public JdaTester() {
      *     doReturn(action).when(jdaTester.getTextChannelSpy()).retrieveMessageById("1");
      * }
      * 
- * + * * @param failureReason the reason to consume on failure * @param the type of the object the action would contain if it would succeed * @return the mocked action @@ -347,7 +349,7 @@ public JdaTester() { *

* The exception merely wraps around the given reason and has no valid error code or message * set. - * + * * @param reason the reason of the error * @return the created exception */ @@ -356,7 +358,7 @@ public JdaTester() { return ErrorResponseException.create(reason, new Response(null, -1, "", -1, Set.of())); } - private void mockInteraction(@NotNull Interaction interaction) { + private void mockInteraction(@NotNull IReplyCallback interaction) { doReturn(replyAction).when(interaction).reply(anyString()); doReturn(replyAction).when(interaction).replyEmbeds(ArgumentMatchers.any()); doReturn(replyAction).when(interaction).replyEmbeds(anyCollection()); @@ -371,7 +373,7 @@ private void mockInteraction(@NotNull Interaction interaction) { doReturn(privateChannel).when(interaction).getPrivateChannel(); } - private void mockButtonClickEvent(@NotNull ButtonClickEvent event) { + private void mockButtonClickEvent(@NotNull ButtonInteractionEvent event) { mockInteraction(event); doReturn(replyAction).when(event).editButton(any()); 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 85% 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 af1f4a34a1..ec414445dd 100644 --- a/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandEventBuilder.java +++ b/application/src/test/java/org/togetherjava/tjbot/jda/SlashCommandInteractionEventBuilder.java @@ -2,15 +2,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; 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; @@ -30,9 +30,10 @@ /** * 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 #setSubcommand(String)}) and options ({@link #setOption(String, String)}). An already set @@ -44,16 +45,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)
  *   .setOption("start", "10.01.2021")
  *   .setOption("end", "13.01.2021")
  *   .build();
  *
  * // /db put key:foo value:bar
- * jdaTester.createSlashCommandEvent(command)
+ * jdaTester.createSlashCommandInteractionEvent(command)
  *   .setSubcommand("put")
  *   .setOption("key", "foo")
  *   .setOption("value", "bar")
@@ -62,10 +63,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; @@ -76,7 +77,8 @@ public final class SlashCommandEventBuilder { private String subcommand; private Member userWhoTriggered; - SlashCommandEventBuilder(@NotNull JDAImpl jda, UnaryOperator mockOperator) { + SlashCommandInteractionEventBuilder(@NotNull JDAImpl jda, + UnaryOperator mockOperator) { this.jda = jda; this.mockOperator = mockOperator; } @@ -95,7 +97,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 setOption(@NotNull String name, + public @NotNull SlashCommandInteractionEventBuilder setOption(@NotNull String name, @NotNull String value) { putOptionRaw(name, value, OptionType.STRING); return this; @@ -115,7 +117,8 @@ 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 setOption(@NotNull String name, @NotNull User value) { + public @NotNull SlashCommandInteractionEventBuilder setOption(@NotNull String name, + @NotNull User value) { putOptionRaw(name, value, OptionType.USER); return this; } @@ -134,7 +137,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 setOption(@NotNull String name, + public @NotNull SlashCommandInteractionEventBuilder setOption(@NotNull String name, @NotNull Member value) { putOptionRaw(name, value, OptionType.USER); return this; @@ -145,7 +148,7 @@ public final class SlashCommandEventBuilder { * * @return this builder instance for chaining */ - public @NotNull SlashCommandEventBuilder clearOptions() { + public @NotNull SlashCommandInteractionEventBuilder clearOptions() { nameToOption.clear(); return this; } @@ -161,7 +164,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 setSubcommand(@Nullable String subcommand) { + public @NotNull SlashCommandInteractionEventBuilder setSubcommand(@Nullable String subcommand) { if (subcommand != null) { requireSubcommand(subcommand); } @@ -177,43 +180,44 @@ public final class SlashCommandEventBuilder { * @return this builder instance for chaining */ @NotNull - public SlashCommandEventBuilder setUserWhoTriggered(@NotNull Member userWhoTriggered) { + public SlashCommandInteractionEventBuilder setUserWhoTriggered( + @NotNull Member userWhoTriggered) { this.userWhoTriggered = userWhoTriggered; return this; } @NotNull - SlashCommandEventBuilder setCommand(@NotNull SlashCommand command) { + SlashCommandInteractionEventBuilder setCommand(@NotNull SlashCommand command) { this.command = command; return this; } @NotNull - SlashCommandEventBuilder setChannelId(@NotNull String channelId) { + SlashCommandInteractionEventBuilder setChannelId(@NotNull String channelId) { this.channelId = channelId; return this; } @NotNull - SlashCommandEventBuilder setToken(@NotNull String token) { + SlashCommandInteractionEventBuilder setToken(@NotNull String token) { this.token = token; return this; } @NotNull - SlashCommandEventBuilder setApplicationId(@NotNull String applicationId) { + SlashCommandInteractionEventBuilder setApplicationId(@NotNull String applicationId) { this.applicationId = applicationId; return this; } @NotNull - SlashCommandEventBuilder setGuildId(@NotNull String guildId) { + SlashCommandInteractionEventBuilder setGuildId(@NotNull String guildId) { this.guildId = guildId; return this; } @NotNull - SlashCommandEventBuilder setUserId(@NotNull String userId) { + SlashCommandInteractionEventBuilder setUserId(@NotNull String userId) { this.userId = userId; return this; } @@ -224,7 +228,7 @@ SlashCommandEventBuilder setUserId(@NotNull String userId) { * * @return the created slash command instance */ - public @NotNull SlashCommandEvent build() { + public @NotNull SlashCommandInteractionEvent build() { PayloadSlashCommand event = createEvent(); String json; @@ -237,9 +241,9 @@ SlashCommandEventBuilder setUserId(@NotNull String userId) { return spySlashCommandEvent(json); } - private SlashCommandEvent spySlashCommandEvent(String jsonData) { - SlashCommandEvent event = spy(new SlashCommandEvent(jda, 0, - new CommandInteractionImpl(jda, DataObject.fromJson(jsonData)))); + private SlashCommandInteractionEvent spySlashCommandEvent(String jsonData) { + SlashCommandInteractionEvent event = spy(new SlashCommandInteractionEvent(jda, 0, + new SlashCommandInteractionImpl(jda, DataObject.fromJson(jsonData)))); event = mockOperator.apply(event); when(event.getMember()).thenReturn(userWhoTriggered);