From 0f51c5ca17a9b3eff32ccf2b48160e982941e1e7 Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Tue, 27 Sep 2022 10:29:19 +0200 Subject: [PATCH 1/8] update to alpha 10 --- application/build.gradle | 2 +- .../tjbot/commands/basic/RoleSelectCommand.java | 5 ++--- .../mathcommands/wolframalpha/WolframAlphaHandler.java | 9 ++------- .../commands/moderation/temp/TemporaryMuteAction.java | 3 +-- .../moderation/temp/TemporaryQuarantineAction.java | 2 +- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index 3e9ece84ca..e659f7f3e9 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -45,7 +45,7 @@ dependencies { implementation project(':database') implementation project(':utils') - implementation 'net.dv8tion:JDA:5.0.0-alpha.9' + implementation 'net.dv8tion:JDA:5.0.0-alpha.10' implementation 'org.apache.logging.log4j:log4j-core:2.19.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0' 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 096bb3327a..d03735d53e 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 @@ -183,9 +183,8 @@ private void sendRoleSelectionMenu(final CommandInteraction event, .map(RoleSelectCommand::mapToSelectOption) .forEach(menu::addOptions); - OptionMapping titleOption = event.getOption(TITLE_OPTION); - String title = titleOption == null ? "Select your roles:" : titleOption.getAsString(); - + String title = + event.getOption(TITLE_OPTION, "Select your roles:", OptionMapping::getAsString); MessageEmbed embed = createEmbed(title, event.getOption(DESCRIPTION_OPTION).getAsString()); event.replyEmbeds(embed).addActionRow(menu.build()).queue(); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaHandler.java b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaHandler.java index 2d53992e68..749ddee1fe 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaHandler.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaHandler.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper; import io.mikael.urlbuilder.UrlBuilder; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,18 +37,12 @@ final class WolframAlphaHandler { * Discord and do not provide a nice user experience anymore. */ private static final int MAX_IMAGE_HEIGHT_PX = 400; - /** - * Maximum amount of embeds Discord supports. - *

- * This should be replaced with a constant provided by JDA, once it does offer one. - */ - private static final int MAX_EMBEDS = 10; /** * Maximum amount of tiles to send. *

* One embed is used as initial description and summary. */ - private static final int MAX_TILES = MAX_EMBEDS - 1; + private static final int MAX_TILES = Message.MAX_EMBED_COUNT - 1; private final String query; private final String userApiQuery; diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryMuteAction.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryMuteAction.java index aa1a40e096..6b140773c6 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryMuteAction.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryMuteAction.java @@ -39,8 +39,7 @@ public ModerationAction getRevokeType() { @Override public RestAction revokeAction(Guild guild, User target, String reason) { return guild - .removeRoleFromMember(target.getIdLong(), - ModerationUtils.getMutedRole(guild, config).orElseThrow()) + .removeRoleFromMember(target, ModerationUtils.getMutedRole(guild, config).orElseThrow()) .reason(reason); } } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryQuarantineAction.java b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryQuarantineAction.java index ca44ddc746..4d372f259c 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryQuarantineAction.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/moderation/temp/TemporaryQuarantineAction.java @@ -39,7 +39,7 @@ public ModerationAction getRevokeType() { @Override public RestAction revokeAction(Guild guild, User target, String reason) { return guild - .removeRoleFromMember(target.getIdLong(), + .removeRoleFromMember(target, ModerationUtils.getQuarantinedRole(guild, config).orElseThrow()) .reason(reason); } From 103dea9b915cbbfa66d6660a30a3c7b8a0b43a0e Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Tue, 27 Sep 2022 10:57:40 +0200 Subject: [PATCH 2/8] update to alpha 13 --- application/build.gradle | 2 +- .../tjbot/commands/BotCommandAdapter.java | 2 +- .../tjbot/commands/SlashCommand.java | 3 +-- .../commands/basic/RoleSelectCommand.java | 3 ++- .../basic/SuggestionsUpDownVoter.java | 21 ++++++++++--------- .../componentids/ComponentIdGenerator.java | 3 +-- .../componentids/ComponentIdParser.java | 3 +-- .../FileSharingMessageListener.java | 3 ++- .../tjbot/commands/tags/TagSystem.java | 5 ++--- 9 files changed, 22 insertions(+), 23 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index e659f7f3e9..370a2ef549 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -45,7 +45,7 @@ dependencies { implementation project(':database') implementation project(':utils') - implementation 'net.dv8tion:JDA:5.0.0-alpha.10' + implementation 'net.dv8tion:JDA:5.0.0-alpha.13' implementation 'org.apache.logging.log4j:log4j-core:2.19.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0' diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/BotCommandAdapter.java b/application/src/main/java/org/togetherjava/tjbot/commands/BotCommandAdapter.java index f7cf697420..3a5e5af1f3 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/BotCommandAdapter.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/BotCommandAdapter.java @@ -51,7 +51,7 @@ public abstract class BotCommandAdapter implements BotCommand { * @param visibility the visibility of the command */ protected BotCommandAdapter(CommandData data, CommandVisibility visibility) { - this.data = Objects.requireNonNull(data, "The data shouldn't be null"); + this.data = data.setGuildOnly(visibility == CommandVisibility.GUILD); this.visibility = Objects.requireNonNull(visibility, "The visibility shouldn't be null"); this.name = data.getName(); 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 53b5456d65..ba72609bc2 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/SlashCommand.java @@ -1,6 +1,5 @@ package org.togetherjava.tjbot.commands; -import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; @@ -81,7 +80,7 @@ public interface SlashCommand extends BotCommand { *

* Buttons or menus have to be created with a component ID (see * {@link ComponentInteraction#getComponentId()}, - * {@link net.dv8tion.jda.api.interactions.components.buttons.Button#of(ButtonStyle, String, Emoji)}) + * {@link net.dv8tion.jda.api.interactions.components.buttons.Button#of(ButtonStyle, String, String)}) * 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. *

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 d03735d53e..05a372eca1 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 @@ -3,6 +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.entities.emoji.Emoji; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.SelectMenuInteractionEvent; import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; @@ -195,7 +196,7 @@ private static SelectOption mapToSelectOption(Role role) { SelectOption option = SelectOption.of(role.getName(), role.getId()); if (null != roleIcon && roleIcon.isEmoji()) { - option = option.withEmoji((Emoji.fromUnicode(roleIcon.getEmoji()))); + option = option.withEmoji(Emoji.fromUnicode(roleIcon.getEmoji())); } return option; 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 f6bc7965b7..3ca76e4ae3 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 @@ -1,8 +1,9 @@ package org.togetherjava.tjbot.commands.basic; -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.entities.emoji.Emoji; +import net.dv8tion.jda.api.entities.emoji.RichCustomEmoji; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.requests.ErrorResponse; @@ -22,8 +23,8 @@ public final class SuggestionsUpDownVoter extends MessageReceiverAdapter { private static final Logger logger = LoggerFactory.getLogger(SuggestionsUpDownVoter.class); private static final int TITLE_MAX_LENGTH = 60; - private static final String FALLBACK_UP_VOTE = "👍"; - private static final String FALLBACK_DOWN_VOTE = "👎"; + private static final Emoji FALLBACK_UP_VOTE = Emoji.fromUnicode("👍"); + private static final Emoji FALLBACK_DOWN_VOTE = Emoji.fromUnicode("👎"); private final SuggestionsConfig config; @@ -68,13 +69,13 @@ private static void createThread(Message message) { message.createThreadChannel(title).queue(); } - private static void reactWith(String emoteName, String fallbackUnicodeEmote, Guild guild, + private static void reactWith(String emojiName, Emoji fallbackEmoji, Guild guild, Message message) { - getEmoteByName(emoteName, guild).map(message::addReaction).orElseGet(() -> { + getEmojiByName(emojiName, guild).map(message::addReaction).orElseGet(() -> { logger.warn( - "Unable to vote on a suggestion with the configured emote ('{}'), using fallback instead.", - emoteName); - return message.addReaction(fallbackUnicodeEmote); + "Unable to vote on a suggestion with the configured emoji ('{}'), using fallback instead.", + emojiName); + return message.addReaction(fallbackEmoji); }).queue(ignored -> { }, exception -> { if (exception instanceof ErrorResponseException responseException @@ -88,7 +89,7 @@ private static void reactWith(String emoteName, String fallbackUnicodeEmote, Gui }); } - private static Optional getEmoteByName(String name, Guild guild) { - return guild.getEmotesByName(name, false).stream().findAny(); + private static Optional getEmojiByName(String name, Guild guild) { + return guild.getEmojisByName(name, false).stream().findAny(); } } 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 dd8035e8d0..0a746965d8 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,6 +1,5 @@ package org.togetherjava.tjbot.commands.componentids; -import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; import net.dv8tion.jda.api.interactions.components.buttons.Button; @@ -26,7 +25,7 @@ public interface ComponentIdGenerator { * interactions, such as button or selection menus. *

* See {@link ComponentInteraction#getComponentId()} and - * {@link Button#of(ButtonStyle, String, Emoji)} for details on where the generated ID can be + * {@link Button#of(ButtonStyle, String, String)} for details on where the generated ID can be * used. * * @param componentId the component ID payload to persist and generate a valid ID for 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 4e17409c6e..83173f0474 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,6 +1,5 @@ package org.togetherjava.tjbot.commands.componentids; -import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.components.ComponentInteraction; import net.dv8tion.jda.api.interactions.components.buttons.Button; @@ -28,7 +27,7 @@ public interface ComponentIdParser { * interactions, such as button or selection menus. *

* See {@link ComponentInteraction#getComponentId()} and - * {@link Button#of(ButtonStyle, String, Emoji)} for details on where the ID was originally + * {@link Button#of(ButtonStyle, String, String)} for details on where the ID was originally * transported with. * * @param uuid the UUID to parse which represents the component ID diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java index c36b37730d..d3b93681b6 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java @@ -114,7 +114,8 @@ private void processAttachments(MessageReceivedEvent event, List> tasks = new ArrayList<>(); for (Message.Attachment attachment : attachments) { - CompletableFuture task = attachment.retrieveInputStream() + CompletableFuture task = attachment.getProxy() + .download() .thenApply(this::readAttachment) .thenAccept( content -> nameToFile.put(getNameOf(attachment), new GistFile(content))); 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 8a34131be9..5d7d0cce41 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,6 +1,6 @@ package org.togetherjava.tjbot.commands.tags; -import net.dv8tion.jda.api.entities.Emoji; +import net.dv8tion.jda.api.entities.emoji.Emoji; 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; @@ -44,8 +44,7 @@ public TagSystem(Database database) { */ @SuppressWarnings("StaticMethodOnlyUsedInOneClass") static Button createDeleteButton(String componentId) { - return Button.of(ButtonStyle.DANGER, componentId, "Delete", - Emoji.fromUnicode("\uD83D\uDDD1")); // trash bin + return Button.of(ButtonStyle.DANGER, componentId, "Delete", Emoji.fromUnicode("🗑")); } /** From 7a6489516895a0e5912de47e5f24d4a0fd02ac7e Mon Sep 17 00:00:00 2001 From: Zabuzard Date: Tue, 27 Sep 2022 16:43:28 +0200 Subject: [PATCH 3/8] update to alpha 18 --- application/build.gradle | 2 +- .../org/togetherjava/tjbot/Application.java | 2 +- .../FileSharingMessageListener.java | 2 +- .../tjbot/commands/help/HelpSystemHelper.java | 15 +- .../help/HelpThreadOverviewUpdater.java | 11 +- .../commands/help/ImplicitAskListener.java | 14 +- .../commands/mathcommands/TeXCommand.java | 4 +- .../wolframalpha/WolframAlphaCommand.java | 15 +- .../mediaonly/MediaOnlyChannelListener.java | 9 +- .../commands/moderation/AuditCommand.java | 47 +++--- .../BlacklistedAttachmentListener.java | 17 ++- .../commands/moderation/scam/ScamBlocker.java | 17 +-- .../commands/reminder/RemindRoutine.java | 6 +- .../tjbot/commands/tags/TagManageCommand.java | 4 +- .../tophelper/TopHelpersMessageListener.java | 2 +- .../tjbot/moderation/ModAuditLogWriter.java | 12 +- .../commands/mathcommands/TeXCommandTest.java | 3 +- .../MediaOnlyChannelListenerTest.java | 20 +-- .../commands/reminder/RemindRoutineTest.java | 13 +- .../commands/tags/TagManageCommandTest.java | 10 +- .../tjbot/commands/tags/TagsCommandTest.java | 3 +- .../tjbot/jda/ButtonClickEventBuilder.java | 35 +++-- .../org/togetherjava/tjbot/jda/JdaTester.java | 141 ++++++++++++------ 23 files changed, 244 insertions(+), 160 deletions(-) diff --git a/application/build.gradle b/application/build.gradle index 370a2ef549..a9f365227b 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -45,7 +45,7 @@ dependencies { implementation project(':database') implementation project(':utils') - implementation 'net.dv8tion:JDA:5.0.0-alpha.13' + implementation 'net.dv8tion:JDA:5.0.0-alpha.18' implementation 'org.apache.logging.log4j:log4j-core:2.19.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0' diff --git a/application/src/main/java/org/togetherjava/tjbot/Application.java b/application/src/main/java/org/togetherjava/tjbot/Application.java index 5927afe8af..b8ad05eb67 100644 --- a/application/src/main/java/org/togetherjava/tjbot/Application.java +++ b/application/src/main/java/org/togetherjava/tjbot/Application.java @@ -79,7 +79,7 @@ public static void runBot(Config config) { Database database = new Database("jdbc:sqlite:" + databasePath.toAbsolutePath()); JDA jda = JDABuilder.createDefault(config.getToken()) - .enableIntents(GatewayIntent.GUILD_MEMBERS) + .enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.MESSAGE_CONTENT) .build(); jda.awaitReady(); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java index d3b93681b6..f91db2823f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/filesharing/FileSharingMessageListener.java @@ -218,7 +218,7 @@ private boolean isHelpThread(MessageReceivedEvent event) { return false; } - ThreadChannel thread = event.getThreadChannel(); + ThreadChannel thread = event.getChannel().asThreadChannel(); String rootChannelName = thread.getParentChannel().getName(); return isStagingChannelName.test(rootChannelName) || isOverviewChannelName.test(rootChannelName); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java index 59f4a54a25..c5fede7f80 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpSystemHelper.java @@ -2,10 +2,12 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.requests.RestAction; -import net.dv8tion.jda.api.requests.restaction.MessageAction; +import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; +import net.dv8tion.jda.api.utils.FileUpload; +import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; import net.dv8tion.jda.internal.requests.CompletedRestAction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -110,9 +112,10 @@ RestAction sendExplanationMessage(MessageChannel threadChannel) { HelpSystemHelper.embedWith( "Don't forget to close your thread using the command **/help-thread close** when your question has been answered, thanks.")); - MessageAction action = threadChannel.sendMessage(message); + MessageCreateAction action = threadChannel.sendMessage(message); if (useCodeSyntaxExampleImage) { - action = action.addFile(codeSyntaxExampleData, CODE_SYNTAX_EXAMPLE_PATH); + action = action + .addFiles(FileUpload.fromData(codeSyntaxExampleData, CODE_SYNTAX_EXAMPLE_PATH)); } return action.setEmbeds(embeds); } @@ -295,7 +298,9 @@ private void executeUncategorizedAdviceCheck(long threadChannelId, long authorId Hey there 👋 You have to select a category for your help thread, otherwise nobody can see your question. Please use the `/help-thread change category` slash-command and pick what fits best, thanks 🙂 """); - Message message = new MessageBuilder(author.getAsMention()).setEmbeds(embed).build(); + MessageCreateData message = new MessageCreateBuilder().setContent(author.getAsMention()) + .setEmbeds(embed) + .build(); return threadChannel.sendMessage(message); }).queue(); diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadOverviewUpdater.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadOverviewUpdater.java index eb32a0e5ac..eac3a9c5f0 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadOverviewUpdater.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/HelpThreadOverviewUpdater.java @@ -1,10 +1,12 @@ package org.togetherjava.tjbot.commands.help; import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; +import net.dv8tion.jda.api.utils.messages.MessageEditBuilder; +import net.dv8tion.jda.api.utils.messages.MessageEditData; import net.dv8tion.jda.internal.requests.CompletedRestAction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,7 +114,7 @@ private void updateOverview(TextChannel overviewChannel) { List activeThreads = helper.getActiveThreadsIn(overviewChannel); logger.debug("Found {} active questions", activeThreads.size()); - Message message = new MessageBuilder() + MessageEditData message = new MessageEditBuilder() .setContent(STATUS_TITLE + "\n\n" + createDescription(activeThreads)) .build(); @@ -165,7 +167,7 @@ private static boolean isStatusMessage(Message message) { } private RestAction sendUpdatedOverview(@Nullable Message statusMessage, - Message updatedStatusMessage, MessageChannel overviewChannel) { + MessageEditData updatedStatusMessage, MessageChannel overviewChannel) { logger.debug("Sending the updated question overview"); if (statusMessage == null) { int currentFailures = FIND_STATUS_MESSAGE_CONSECUTIVE_FAILURES.incrementAndGet(); @@ -174,7 +176,8 @@ private RestAction sendUpdatedOverview(@Nullable Message statusMessage, "Failed to locate the question overview too often ({} times), sending a fresh message instead.", currentFailures); FIND_STATUS_MESSAGE_CONSECUTIVE_FAILURES.set(0); - return overviewChannel.sendMessage(updatedStatusMessage); + return overviewChannel + .sendMessage(MessageCreateData.fromEditData(updatedStatusMessage)); } logger.info( diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/help/ImplicitAskListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/help/ImplicitAskListener.java index 629d022128..1dd00e7110 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/help/ImplicitAskListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/help/ImplicitAskListener.java @@ -3,13 +3,14 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.requests.ErrorResponse; import net.dv8tion.jda.api.requests.RestAction; -import net.dv8tion.jda.api.requests.restaction.MessageAction; +import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; +import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; @@ -170,7 +171,7 @@ private RestAction handleEvent(ThreadChannel threadChannel, Message message, }); } - private static MessageAction sendInitialMessage(ThreadChannel threadChannel, + private static MessageCreateAction sendInitialMessage(ThreadChannel threadChannel, Message originalMessage, String title) { String content = originalMessage.getContentRaw(); Member author = originalMessage.getMember(); @@ -181,8 +182,9 @@ private static MessageAction sendInitialMessage(ThreadChannel threadChannel, .setColor(HelpSystemHelper.AMBIENT_COLOR) .build(); - Message threadMessage = new MessageBuilder( - """ + MessageCreateData threadMessage = new MessageCreateBuilder() + .setContent( + """ %s has a question about '**%s**' and will send the details now. Please use `/help-thread change category` to greatly increase the visibility of the question.""" @@ -191,7 +193,7 @@ private static MessageAction sendInitialMessage(ThreadChannel threadChannel, return threadChannel.sendMessage(threadMessage); } - private static MessageAction notifyUser(IMentionable threadChannel, Message message) { + private static MessageCreateAction notifyUser(IMentionable threadChannel, Message message) { return message.getChannel() .sendMessage( """ 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 3e6d707e9c..ead51436f8 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 @@ -6,6 +6,7 @@ import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.components.buttons.Button; import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle; +import net.dv8tion.jda.api.utils.FileUpload; import org.scilab.forge.jlatexmath.ParseException; import org.scilab.forge.jlatexmath.TeXConstants; import org.scilab.forge.jlatexmath.TeXFormula; @@ -110,7 +111,8 @@ private void sendImage(IDeferrableCallback event, String userID, Image image) throws IOException { ByteArrayOutputStream renderedTextImageStream = getRenderedTextImageStream(image); event.getHook() - .editOriginal(renderedTextImageStream.toByteArray(), "tex.png") + .editOriginalAttachments( + FileUpload.fromData(renderedTextImageStream.toByteArray(), "tex.png")) .setActionRow(Button.of(ButtonStyle.DANGER, generateComponentId(userID), "Delete")) .queue(); } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaCommand.java b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaCommand.java index c599368bb0..764afa2420 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaCommand.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/mathcommands/wolframalpha/WolframAlphaCommand.java @@ -1,18 +1,19 @@ package org.togetherjava.tjbot.commands.mathcommands.wolframalpha; import io.mikael.urlbuilder.UrlBuilder; -import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.callbacks.IDeferrableCallback; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.requests.restaction.WebhookMessageUpdateAction; import org.togetherjava.tjbot.commands.CommandVisibility; +import net.dv8tion.jda.api.utils.FileUpload; import org.togetherjava.tjbot.commands.SlashCommandAdapter; import org.togetherjava.tjbot.config.Config; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.List; import java.util.concurrent.CompletableFuture; /** @@ -74,13 +75,11 @@ public void onSlashCommand(SlashCommandInteractionEvent event) { private static void sendResponse(WolframAlphaHandler.HandlerResponse response, IDeferrableCallback event) { - WebhookMessageUpdateAction action = - event.getHook().editOriginalEmbeds(response.embeds()); + List files = response.attachments() + .stream() + .map(attachment -> FileUpload.fromData(attachment.data(), attachment.name())) + .toList(); - for (WolframAlphaHandler.Attachment attachment : response.attachments()) { - action = action.addFile(attachment.data(), attachment.name()); - } - - action.queue(); + event.getHook().editOriginalEmbeds(response.embeds()).setFiles(files).queue(); } } diff --git a/application/src/main/java/org/togetherjava/tjbot/commands/mediaonly/MediaOnlyChannelListener.java b/application/src/main/java/org/togetherjava/tjbot/commands/mediaonly/MediaOnlyChannelListener.java index b2bce6613f..af29d1013f 100644 --- a/application/src/main/java/org/togetherjava/tjbot/commands/mediaonly/MediaOnlyChannelListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/commands/mediaonly/MediaOnlyChannelListener.java @@ -1,12 +1,13 @@ package org.togetherjava.tjbot.commands.mediaonly; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.MessageType; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.requests.RestAction; +import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; +import net.dv8tion.jda.api.utils.messages.MessageCreateData; import org.togetherjava.tjbot.commands.MessageReceiverAdapter; import org.togetherjava.tjbot.config.Config; @@ -59,10 +60,10 @@ private RestAction dmUser(Message message) { .setColor(Color.ORANGE) .build(); - Message dmMessage = new MessageBuilder( + MessageCreateData dmMessage = new MessageCreateBuilder().setContent( "Hey there, you posted a message without media (image, video, link) in a media-only channel. Please see the description of the channel for details and then repost with media attached, thanks 😀") - .setEmbeds(originalMessageEmbed) - .build(); + .setEmbeds(originalMessageEmbed) + .build(); return message.getAuthor() .openPrivateChannel() 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 8fceb3adb6..f8e9f560bc 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 @@ -2,17 +2,21 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; -import net.dv8tion.jda.api.MessageBuilder; -import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; 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.components.ActionRow; import net.dv8tion.jda.api.interactions.components.buttons.Button; import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.utils.TimeUtil; +import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; +import net.dv8tion.jda.api.utils.messages.MessageEditBuilder; +import net.dv8tion.jda.api.utils.messages.MessageRequest; import net.dv8tion.jda.internal.requests.CompletedRestAction; import org.togetherjava.tjbot.commands.CommandVisibility; import org.togetherjava.tjbot.commands.SlashCommandAdapter; @@ -21,6 +25,7 @@ import java.time.Instant; import java.time.ZoneOffset; import java.util.*; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -68,8 +73,10 @@ public void onSlashCommand(SlashCommandInteractionEvent event) { return; } - auditUser(guild.getIdLong(), target.getIdLong(), event.getMember().getIdLong(), -1, - event.getJDA()).flatMap(event::reply).queue(); + auditUser(MessageCreateBuilder::new, guild.getIdLong(), target.getIdLong(), + event.getMember().getIdLong(), -1, event.getJDA()).map(MessageCreateBuilder::build) + .flatMap(event::reply) + .queue(); } private boolean handleChecks(Member bot, Member author, @Nullable Member target, @@ -86,7 +93,8 @@ private boolean handleChecks(Member bot, Member author, @Nullable Member target, * can contain {@link AuditCommand#MAX_PAGE_LENGTH} actions, {@code -1} encodes the last * page */ - private RestAction auditUser(long guildId, long targetId, long callerId, + private > RestAction auditUser( + Supplier messageBuilderSupplier, long guildId, long targetId, long callerId, int pageNumber, JDA jda) { List actions = actionsStore.getActionsByTargetAscending(guildId, targetId); List> groupedActions = groupActionsByPages(actions); @@ -103,8 +111,8 @@ private RestAction auditUser(long guildId, long targetId, long callerId .map(user -> createSummaryEmbed(user, actions)) .flatMap(auditEmbed -> attachEmbedFields(auditEmbed, groupedActions, pageNumberInLimits, totalPages, jda)) - .map(auditEmbed -> attachPageTurnButtons(auditEmbed, pageNumberInLimits, totalPages, - guildId, targetId, callerId)); + .map(auditEmbed -> attachPageTurnButtons(messageBuilderSupplier, auditEmbed, + pageNumberInLimits, totalPages, guildId, targetId, callerId)); } private List> groupActionsByPages(List actions) { @@ -197,20 +205,22 @@ private static String formatTime(Instant when) { return TimeUtil.getDateTimeString(when.atOffset(ZoneOffset.UTC)); } - private Message attachPageTurnButtons(EmbedBuilder auditEmbed, int pageNumber, int totalPages, - long guildId, long targetId, long callerId) { - var messageBuilder = new MessageBuilder(auditEmbed.build()); + private > R attachPageTurnButtons( + Supplier messageBuilderSupplier, EmbedBuilder auditEmbed, int pageNumber, + int totalPages, long guildId, long targetId, long callerId) { + var messageBuilder = messageBuilderSupplier.get(); + messageBuilder.setEmbeds(auditEmbed.build()); if (totalPages <= 1) { - return messageBuilder.build(); + return messageBuilder; } - ActionRow pageTurnButtons = + List