diff --git a/build.gradle.kts b/build.gradle.kts index e0eefd179..dec9e4341 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,15 +4,16 @@ import com.github.jengelman.gradle.plugins.shadow.transformers.* plugins { java id("com.github.johnrengelman.shadow") version "8.1.1" - id("org.springframework.boot") version "3.5.0" + id("org.springframework.boot") version "4.0.1" id("io.spring.dependency-management") version "1.1.7" - id("org.graalvm.buildtools.native") version "0.10.6" + id("org.graalvm.buildtools.native") version "0.11.3" checkstyle } java { - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion = JavaLanguageVersion.of(25) + } } group = "net.discordjug" @@ -27,22 +28,24 @@ repositories { dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") compileOnly("com.google.code.findbugs:jsr305:3.0.2") compileOnly("org.jetbrains:annotations:26.0.2") // DIH4JDA (Command Framework) & JDA - implementation("com.github.DynxstyGIT:DIH4JDA:a64b5a9dc5") - implementation("net.dv8tion:JDA:5.5.1") { + implementation("com.github.jasonlessenich:DIH4JDA:1.7.0") + //implementation("xyz.dynxsty:dih4jda:1.7.0") + implementation("net.dv8tion:JDA:6.2.0") { exclude(module = "opus-java") } // Caffeine (Caching Library) - implementation("com.github.ben-manes.caffeine:caffeine:3.2.0") + implementation("com.github.ben-manes.caffeine:caffeine:3.2.2") implementation("com.google.code.gson:gson:2.13.1") implementation("org.yaml:snakeyaml:2.4") implementation("com.google.re2j:re2j:1.8") - implementation("commons-validator:commons-validator:1.9.0") + implementation("commons-validator:commons-validator:1.10.0") implementation("com.mashape.unirest:unirest-java:1.4.9") @@ -60,20 +63,16 @@ dependencies { testAnnotationProcessor("org.projectlombok:lombok:1.18.38") // Sentry - implementation("io.sentry:sentry:8.13.2") + implementation("io.sentry:sentry:8.20.0") // Spring - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.springframework.boot:spring-boot-starter-data-jdbc") //required for registering native hints implementation("org.jetbrains.kotlin:kotlin-reflect") -} - -configurations { - all { - exclude(group = "commons-logging", module = "commons-logging") - } + + implementation("org.slf4j:jcl-over-slf4j") } tasks.withType { diff --git a/src/main/java/net/discordjug/javabot/RuntimeHintsConfiguration.java b/src/main/java/net/discordjug/javabot/RuntimeHintsConfiguration.java index d2b30f876..980a1aea5 100644 --- a/src/main/java/net/discordjug/javabot/RuntimeHintsConfiguration.java +++ b/src/main/java/net/discordjug/javabot/RuntimeHintsConfiguration.java @@ -1,7 +1,5 @@ package net.discordjug.javabot; -import java.nio.channels.Channel; - import club.minnced.discord.webhook.send.WebhookEmbed; import com.zaxxer.hikari.HikariConfig; import net.discordjug.javabot.data.config.BotConfig; @@ -16,19 +14,8 @@ import net.discordjug.javabot.data.config.guild.QOTWConfig; import net.discordjug.javabot.data.config.guild.ServerLockConfig; import net.discordjug.javabot.data.config.guild.StarboardConfig; -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.ScheduledEvent; -import net.dv8tion.jda.api.entities.ThreadMember; -import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.entities.channel.forums.ForumTag; -import net.dv8tion.jda.api.entities.emoji.RichCustomEmoji; -import net.dv8tion.jda.api.entities.sticker.GuildSticker; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.managers.AudioManager; import net.dv8tion.jda.internal.entities.GuildVoiceStateImpl; -import net.dv8tion.jda.internal.entities.MemberPresenceImpl; import net.dv8tion.jda.internal.requests.restaction.PermOverrideData; import org.h2.server.TcpServer; import org.springframework.aot.hint.MemberCategory; @@ -49,8 +36,6 @@ BotConfig.class, GuildConfig.class, GuildConfigItem.class, SystemsConfig.class, ApiConfig.class, HelpConfig.class, MessageCacheConfig.class, MetricsConfig.class, ModerationConfig.class, QOTWConfig.class, ServerLockConfig.class, StarboardConfig.class, - //ensure JDA can create necessary caches - User[].class, Guild[].class, Member[].class, Role[].class, Channel[].class, AudioManager[].class, ScheduledEvent[].class, ThreadMember[].class, ForumTag[].class, RichCustomEmoji[].class, GuildSticker[].class, MemberPresenceImpl[].class, //needs to be serialized for channel managers etc PermOverrideData.class, diff --git a/src/main/java/net/discordjug/javabot/api/TomcatConfig.java b/src/main/java/net/discordjug/javabot/api/TomcatConfig.java deleted file mode 100644 index 18ce7649b..000000000 --- a/src/main/java/net/discordjug/javabot/api/TomcatConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.discordjug.javabot.api; - -import org.apache.catalina.connector.Connector; -import org.apache.coyote.ajp.AjpNioProtocol; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.net.InetAddress; - -import net.discordjug.javabot.data.config.SystemsConfig; - - -/** - * Holds all configuration for the {@link org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat} - * web service. - */ -@Configuration -public class TomcatConfig { - - private final int ajpPort; - private final InetAddress ajpAddress; - private final boolean tomcatAjpEnabled; - private final SystemsConfig systemsConfig; - - /** - * Initializes this object. - * @param ajpPort The port to run AJP under - * @param tomcatAjpEnabled true if AJP is enabled, else false - * @param systemsConfig an object representing the configuration of various systems - * @param ajpAddress the listen address for AJP - */ - public TomcatConfig(@Value("${tomcat.ajp.port}") int ajpPort, @Value("${tomcat.ajp.enabled}") boolean tomcatAjpEnabled, @Value("${tomcat.ajp.address}") InetAddress ajpAddress, SystemsConfig systemsConfig) { - this.ajpPort = ajpPort; - this.tomcatAjpEnabled = tomcatAjpEnabled; - this.systemsConfig = systemsConfig; - this.ajpAddress = ajpAddress; - } - - /** - * Sets up the {@link TomcatServletWebServerFactory} using the {@link Value}s defined in the - * application.properties file. - * - * @return The {@link TomcatServletWebServerFactory}. - */ - @Bean - TomcatServletWebServerFactory servletContainer() { - TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); - if (tomcatAjpEnabled) { - Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol"); - AjpNioProtocol protocol= (AjpNioProtocol) ajpConnector.getProtocolHandler(); - protocol.setSecret(systemsConfig.getApiConfig().getAjpSecret()); - protocol.setAddress(ajpAddress); - ajpConnector.setPort(ajpPort); - ajpConnector.setSecure(true); - tomcat.addAdditionalTomcatConnectors(ajpConnector); - } - return tomcat; - } -} diff --git a/src/main/java/net/discordjug/javabot/data/h2db/commands/DbAdminCommand.java b/src/main/java/net/discordjug/javabot/data/h2db/commands/DbAdminCommand.java index 75fbdafe6..9f10f19f2 100644 --- a/src/main/java/net/discordjug/javabot/data/h2db/commands/DbAdminCommand.java +++ b/src/main/java/net/discordjug/javabot/data/h2db/commands/DbAdminCommand.java @@ -4,6 +4,7 @@ import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; import net.discordjug.javabot.data.config.BotConfig; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.interactions.InteractionContextType; import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.interactions.commands.build.SubcommandGroupData; @@ -27,7 +28,7 @@ public DbAdminCommand(BotConfig botConfig, ExportSchemaSubcommand exportSchemaSu setRegistrationType(RegistrationType.GUILD); setCommandData(Commands.slash("db-admin", "(ADMIN ONLY) Administrative Commands for managing the bot's database.") .setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.MANAGE_SERVER)) - .setGuildOnly(true) + .setContexts(InteractionContextType.GUILD) ); addSubcommands(exportSchemaSubcommand, exportTableSubcommand, migrationsListSubcommand, migrateSubcommand, quickMigrateSubcommand); addSubcommandGroups(SubcommandGroup.of( diff --git a/src/main/java/net/discordjug/javabot/data/h2db/commands/QuickMigrateSubcommand.java b/src/main/java/net/discordjug/javabot/data/h2db/commands/QuickMigrateSubcommand.java index 851766622..c6dd89a2d 100644 --- a/src/main/java/net/discordjug/javabot/data/h2db/commands/QuickMigrateSubcommand.java +++ b/src/main/java/net/discordjug/javabot/data/h2db/commands/QuickMigrateSubcommand.java @@ -1,5 +1,6 @@ package net.discordjug.javabot.data.h2db.commands; +import net.dv8tion.jda.api.modals.Modal; import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; import xyz.dynxsty.dih4jda.interactions.components.ModalHandler; import net.discordjug.javabot.annotations.AutoDetectableComponentHandler; @@ -7,14 +8,13 @@ import net.discordjug.javabot.util.ExceptionLogger; import net.discordjug.javabot.util.Responses; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.components.label.Label; +import net.dv8tion.jda.api.components.textinput.TextInput; +import net.dv8tion.jda.api.components.textinput.TextInputStyle; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; -import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.modals.Modal; -import net.dv8tion.jda.api.interactions.components.text.TextInput; -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; import net.dv8tion.jda.api.interactions.modals.ModalMapping; import org.jetbrains.annotations.NotNull; @@ -105,7 +105,7 @@ public void handleModal(@NotNull ModalInteractionEvent event, List } private @NotNull Modal buildQuickMigrateModal() { - TextInput sqlInput = TextInput.create("sql", "SQL-Statement (H2)", TextInputStyle.PARAGRAPH) + TextInput sqlInput = TextInput.create("sql", TextInputStyle.PARAGRAPH) .setPlaceholder(""" CREATE TABLE my_table ( thread_id BIGINT PRIMARY KEY, @@ -114,12 +114,12 @@ CREATE TABLE my_table ( """) .setRequired(true) .build(); - TextInput confirmInput = TextInput.create("confirmation", "Confirmation", TextInputStyle.SHORT) + TextInput confirmInput = TextInput.create("confirmation", TextInputStyle.SHORT) .setPlaceholder("Type 'CONFIRM' to confirm this action") .setRequired(true) .build(); return Modal.create("quick-migrate", "Quick Migrate") - .addComponents(ActionRow.of(sqlInput), ActionRow.of(confirmInput)) + .addComponents(Label.of("SQL-Statement (H2)", sqlInput), Label.of("Confirmation", confirmInput)) .build(); } } diff --git a/src/main/java/net/discordjug/javabot/data/h2db/message_cache/MessageCache.java b/src/main/java/net/discordjug/javabot/data/h2db/message_cache/MessageCache.java index 5245b0cd3..a6cdf62e0 100644 --- a/src/main/java/net/discordjug/javabot/data/h2db/message_cache/MessageCache.java +++ b/src/main/java/net/discordjug/javabot/data/h2db/message_cache/MessageCache.java @@ -1,5 +1,25 @@ package net.discordjug.javabot.data.h2db.message_cache; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.discordjug.javabot.data.config.BotConfig; +import net.discordjug.javabot.data.config.guild.MessageCacheConfig; +import net.discordjug.javabot.data.h2db.message_cache.dao.MessageCacheRepository; +import net.discordjug.javabot.data.h2db.message_cache.model.CachedMessage; +import net.discordjug.javabot.systems.user_commands.IdCalculatorCommand; +import net.discordjug.javabot.util.ExceptionLogger; +import net.discordjug.javabot.util.Responses; +import net.discordjug.javabot.util.TimeUtils; +import net.discordjug.javabot.util.UserUtils; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; +import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.Message.Attachment; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; +import net.dv8tion.jda.api.utils.FileUpload; + import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URI; @@ -21,29 +41,6 @@ import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import net.discordjug.javabot.data.config.BotConfig; -import net.discordjug.javabot.data.config.guild.MessageCacheConfig; -import net.discordjug.javabot.data.h2db.message_cache.dao.MessageCacheRepository; -import net.discordjug.javabot.data.h2db.message_cache.model.CachedMessage; -import net.discordjug.javabot.systems.user_commands.IdCalculatorCommand; -import net.discordjug.javabot.util.ExceptionLogger; -import net.discordjug.javabot.util.Responses; -import net.discordjug.javabot.util.TimeUtils; -import net.discordjug.javabot.util.UserUtils; -import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.Message.Attachment; -import net.dv8tion.jda.api.entities.MessageEmbed; -import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.entities.UserSnowflake; -import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; -import net.dv8tion.jda.api.interactions.components.buttons.Button; -import net.dv8tion.jda.api.requests.restaction.MessageCreateAction; -import net.dv8tion.jda.api.utils.FileUpload; - /** * Listens for Incoming Messages and stores them in the Message Cache. */ @@ -128,7 +125,7 @@ public void sendUpdatedMessageToLog(Message updated, CachedMessage before) { if (updated.getContentRaw().trim().equals(before.getMessageContent()) && updated.getAttachments().size() == before.getAttachments().size()) return; MessageCreateAction action = config.getMessageCacheLogChannel() .sendMessageEmbeds(buildMessageEditEmbed(updated.getGuild(), updated.getAuthor(), updated.getChannel(), before, updated)) - .setActionRow(Button.link(updated.getJumpUrl(), "Jump to Message")); + .addComponents(ActionRow.of(Button.link(updated.getJumpUrl(), "Jump to Message"))); if (before.getMessageContent().length() > MessageEmbed.VALUE_MAX_LENGTH || updated.getContentRaw().length() > MessageEmbed.VALUE_MAX_LENGTH) { action.addFiles(FileUpload.fromData(buildEditedMessageFile(updated.getAuthor(), before, updated), before.getMessageId() + ".txt")); } diff --git a/src/main/java/net/discordjug/javabot/listener/GitHubLinkListener.java b/src/main/java/net/discordjug/javabot/listener/GitHubLinkListener.java index 13d200a16..b90c5b89a 100644 --- a/src/main/java/net/discordjug/javabot/listener/GitHubLinkListener.java +++ b/src/main/java/net/discordjug/javabot/listener/GitHubLinkListener.java @@ -4,9 +4,10 @@ import net.discordjug.javabot.util.ExceptionLogger; import net.discordjug.javabot.util.InteractionUtils; import net.discordjug.javabot.util.StringUtils; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.components.buttons.Button; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -37,7 +38,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { if (!content.getFirst().isBlank() && !content.getSecond().isBlank()) { event.getMessage().reply(String.format("```%s\n%s\n```", content.getSecond(), StringUtils.standardSanitizer().compute(content.getFirst()))) .setAllowedMentions(List.of()) - .setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()), Button.link(matcher.group(), "View on GitHub")) + .addComponents(ActionRow.of(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()), Button.link(matcher.group(), "View on GitHub"))) .queue(); } } @@ -56,7 +57,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { String[] segments = Arrays.copyOfRange(arr, 3, arr.length); // The file name, split by "." String[] file = segments[segments.length - 1].split("\\."); - Integer[] lines = Arrays.stream(file[1].split("L")) + Integer[] lines = Arrays.stream(file[file.length-1].split("L")) .map(line -> line.replace("-", "")) .filter(line -> line.matches("-?\\d+")) // check if the given link is a number .map(Integer::valueOf).sorted().toArray(Integer[]::new); diff --git a/src/main/java/net/discordjug/javabot/listener/JobChannelCloseOldPostsListener.java b/src/main/java/net/discordjug/javabot/listener/JobChannelCloseOldPostsListener.java index d61751653..aec7cadaa 100644 --- a/src/main/java/net/discordjug/javabot/listener/JobChannelCloseOldPostsListener.java +++ b/src/main/java/net/discordjug/javabot/listener/JobChannelCloseOldPostsListener.java @@ -9,6 +9,7 @@ import net.discordjug.javabot.data.config.guild.ModerationConfig; import net.discordjug.javabot.util.InteractionUtils; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.entities.UserSnowflake; import net.dv8tion.jda.api.entities.channel.ChannelType; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; @@ -78,7 +79,7 @@ public void onChannelCreate(ChannelCreateEvent event) { .setDescription("Since only one open post is allowed per user, older posts have been closed") .setColor(Color.YELLOW) .build()) - .addActionRow(InteractionUtils.createDeleteButton(post.getOwnerIdLong())) + .addComponents(ActionRow.of(InteractionUtils.createDeleteButton(post.getOwnerIdLong()))) .queue(); } } diff --git a/src/main/java/net/discordjug/javabot/listener/QOTWSubmissionListener.java b/src/main/java/net/discordjug/javabot/listener/QOTWSubmissionListener.java index 717cf4113..73c2a4791 100644 --- a/src/main/java/net/discordjug/javabot/listener/QOTWSubmissionListener.java +++ b/src/main/java/net/discordjug/javabot/listener/QOTWSubmissionListener.java @@ -4,6 +4,7 @@ import net.discordjug.javabot.data.config.BotConfig; import net.discordjug.javabot.data.config.guild.QOTWConfig; import net.discordjug.javabot.util.InteractionUtils; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.entities.channel.ChannelType; import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; @@ -35,7 +36,7 @@ public void onMessageReceived(@NotNull MessageReceivedEvent event) { Please keep in mind that messages **over 2000 characters** get split in half due to webhook limitations. If you want to make sure that your submission is properly formatted, split your message into smaller chunks instead.""", event.getAuthor().getAsMention()) - .setActionRow(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong())) + .addComponents(ActionRow.of(InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()))) .queue(); } } diff --git a/src/main/java/net/discordjug/javabot/systems/configuration/SetConfigSubcommand.java b/src/main/java/net/discordjug/javabot/systems/configuration/SetConfigSubcommand.java index 6a903fcc5..8cdab6554 100644 --- a/src/main/java/net/discordjug/javabot/systems/configuration/SetConfigSubcommand.java +++ b/src/main/java/net/discordjug/javabot/systems/configuration/SetConfigSubcommand.java @@ -5,6 +5,9 @@ import net.discordjug.javabot.data.config.GuildConfig; import net.discordjug.javabot.data.config.UnknownPropertyException; import net.discordjug.javabot.util.Responses; +import net.dv8tion.jda.api.components.label.Label; +import net.dv8tion.jda.api.components.textinput.TextInput; +import net.dv8tion.jda.api.components.textinput.TextInputStyle; import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; @@ -12,10 +15,8 @@ import net.dv8tion.jda.api.interactions.commands.OptionMapping; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; -import net.dv8tion.jda.api.interactions.components.text.TextInput; -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; -import net.dv8tion.jda.api.interactions.modals.Modal; import net.dv8tion.jda.api.interactions.modals.ModalMapping; +import net.dv8tion.jda.api.modals.Modal; import net.dv8tion.jda.api.requests.restaction.interactions.InteractionCallbackAction; import xyz.dynxsty.dih4jda.interactions.AutoCompletable; import xyz.dynxsty.dih4jda.interactions.components.ModalHandler; @@ -58,9 +59,9 @@ public InteractionCallbackAction handleConfigSubcommand(@Nonnull SlashCommand } return event.replyModal( Modal.create(ComponentIdBuilder.build("config-set", property), "Change configuration value") - .addActionRow(TextInput.create("value", "new value", TextInputStyle.PARAGRAPH) + .addComponents(Label.of("new value", TextInput.create("value", TextInputStyle.PARAGRAPH) .setValue(String.valueOf(resolved)) - .build()) + .build())) .build()); } String valueString = valueOption.getAsString().trim(); diff --git a/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCButtonHandler.java b/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCButtonHandler.java index 541d9136c..4bd960b54 100644 --- a/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCButtonHandler.java +++ b/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCButtonHandler.java @@ -6,8 +6,8 @@ import net.discordjug.javabot.annotations.AutoDetectableComponentHandler; import net.discordjug.javabot.util.Responses; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; -import net.dv8tion.jda.api.interactions.components.buttons.Button; import net.dv8tion.jda.api.requests.restaction.PermissionOverrideAction; import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler; import xyz.dynxsty.dih4jda.util.ComponentIdBuilder; @@ -40,7 +40,7 @@ public void handleButton(ButtonInteractionEvent event, Button button) { Responses.error(event, "Only the VC owner can use this.").queue(); return; } - String[] id = ComponentIdBuilder.split(button.getId()); + String[] id = ComponentIdBuilder.split(button.getCustomId()); switch (id[1]) { case MAKE_PRIVATE_ID -> changeVisibility(event, createMakePublicButton(), "This voice channel is now private.", PermissionOverrideAction::setDenied); diff --git a/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCListener.java b/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCListener.java index 8ecd66edb..0ae954dcf 100644 --- a/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCListener.java +++ b/src/main/java/net/discordjug/javabot/systems/custom_vc/CustomVCListener.java @@ -7,6 +7,7 @@ import net.discordjug.javabot.util.ExceptionLogger; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; import net.dv8tion.jda.api.entities.channel.middleman.StandardGuildChannel; import net.dv8tion.jda.api.entities.channel.unions.AudioChannelUnion; @@ -62,7 +63,7 @@ private void createCustomVC(GuildVoiceUpdateEvent event, AudioChannelUnion vcJoi """) .build()) .addContent(event.getMember().getAsMention()) - .addActionRow(buttonHandler.createMakePrivateButton()) + .addComponents(ActionRow.of(buttonHandler.createMakePrivateButton())) .queue(); }); } diff --git a/src/main/java/net/discordjug/javabot/systems/custom_vc/commands/CustomVCControlCommand.java b/src/main/java/net/discordjug/javabot/systems/custom_vc/commands/CustomVCControlCommand.java index aac9ffecf..c3b03b288 100644 --- a/src/main/java/net/discordjug/javabot/systems/custom_vc/commands/CustomVCControlCommand.java +++ b/src/main/java/net/discordjug/javabot/systems/custom_vc/commands/CustomVCControlCommand.java @@ -1,5 +1,6 @@ package net.discordjug.javabot.systems.custom_vc.commands; +import net.dv8tion.jda.api.interactions.InteractionContextType; import net.dv8tion.jda.api.interactions.commands.build.Commands; import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; @@ -14,7 +15,7 @@ public class CustomVCControlCommand extends SlashCommand { */ public CustomVCControlCommand(CustomVCAddMemberSubcommand addMemberSubcommand, CustomVCRemoveMemberSubcommand removeMemberSubcommand) { setCommandData(Commands.slash("vc-control", "Manages custom voice channels") - .setGuildOnly(true) + .setContexts(InteractionContextType.GUILD) ); addSubcommands(addMemberSubcommand, removeMemberSubcommand); } diff --git a/src/main/java/net/discordjug/javabot/systems/help/AutoCodeFormatter.java b/src/main/java/net/discordjug/javabot/systems/help/AutoCodeFormatter.java index 64b483ffd..3b2ab37d6 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/AutoCodeFormatter.java +++ b/src/main/java/net/discordjug/javabot/systems/help/AutoCodeFormatter.java @@ -9,6 +9,7 @@ import net.discordjug.javabot.util.InteractionUtils; import net.discordjug.javabot.util.WebhookUtil; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -19,6 +20,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Nonnull; + import java.util.Objects; /** @@ -126,9 +128,9 @@ void handleMessageEvent(@Nonnull MessageReceivedEvent event, boolean isFirstMess private void sendFormatHint(MessageReceivedEvent event) { event.getMessage() .replyEmbeds(formatHintEmbed(event.getGuild())) - .addActionRow( + .addComponents(ActionRow.of( InteractionUtils.createDeleteButton(event.getAuthor().getIdLong()) - ).queue(); + )).queue(); } diff --git a/src/main/java/net/discordjug/javabot/systems/help/HelpForumUpdater.java b/src/main/java/net/discordjug/javabot/systems/help/HelpForumUpdater.java index eef9d7ef2..fe83c77c2 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/HelpForumUpdater.java +++ b/src/main/java/net/discordjug/javabot/systems/help/HelpForumUpdater.java @@ -8,6 +8,7 @@ import net.discordjug.javabot.systems.user_preferences.model.Preference; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; @@ -104,7 +105,7 @@ private MessageEmbed createDMDormantInfo(ThreadChannel post, HelpConfig config) } private boolean isThanksMessage(@NotNull Message m) { - return m.getAuthor().isBot() && !m.getButtons().isEmpty() && - m.getButtons().stream().allMatch(b -> b.getId() != null && b.getId().contains(HelpManager.HELP_THANKS_IDENTIFIER)); + return m.getAuthor().isBot() && !m.getComponents().isEmpty() && + m.getComponents().stream().allMatch(c -> c instanceof Button b && b.getCustomId() != null && b.getCustomId().contains(HelpManager.HELP_THANKS_IDENTIFIER)); } } diff --git a/src/main/java/net/discordjug/javabot/systems/help/HelpListener.java b/src/main/java/net/discordjug/javabot/systems/help/HelpListener.java index 638e0a2cc..889d820a4 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/HelpListener.java +++ b/src/main/java/net/discordjug/javabot/systems/help/HelpListener.java @@ -11,6 +11,8 @@ import net.discordjug.javabot.util.InteractionUtils; import net.discordjug.javabot.util.Responses; import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.UserSnowflake; import net.dv8tion.jda.api.entities.channel.Channel; @@ -22,14 +24,13 @@ import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback; -import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.components.buttons.Button; import org.jetbrains.annotations.NotNull; import xyz.dynxsty.dih4jda.interactions.components.ButtonHandler; import xyz.dynxsty.dih4jda.util.ComponentIdBuilder; import java.util.*; +import java.util.stream.Stream; /** * Listens for all events related to the forum help channel system. @@ -161,10 +162,10 @@ private void replyCloseSuggestionIfPatternMatches(Message msg) { If you are not, please ignore this message. Note that you will not be able to send further messages here after this post have been closed but you will be able to create new posts. """) - .addActionRow( + .addComponents(ActionRow.of( createCloseSuggestionButton(msg.getChannel().asThreadChannel()), InteractionUtils.createDeleteButton(msg.getAuthor().getIdLong()) - ).queue(); + )).queue(); recentlyCloseSuggestedPosts.put( postId, System.currentTimeMillis() + SUGGEST_CLOSE_TIMEOUT @@ -256,16 +257,16 @@ private void handleHelpThanksInteraction(@NotNull ButtonInteractionEvent event, case "done" -> handleThanksCloseButton(event, manager, post, ""); case "cancel" -> event.deferEdit().flatMap(h -> event.getMessage().delete()).queue(); default -> { - List