From 802bbbd8ed26f2b48bc454b46400e25c3c107e76 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:02:26 +0200 Subject: [PATCH 01/21] Update JDA --- .../kotlin/BotCommands-repositories-conventions.gradle.kts | 1 + gradle/libs.versions.toml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts b/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts index e69b970fb..3cfe85f87 100644 --- a/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts @@ -1,4 +1,5 @@ repositories { mavenCentral() mavenLocal() + maven("https://jitpack.io") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 31196d895..5e84a5ba2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ h2 = "2.3.232" hikaricp = "6.2.1" jackson = "2.19.1" java-string-similarity = "2.0.0" -jda = "5.6.1" +jda = "e87771b759" jda-emojis = "3.0.0" jda-ktx = "0.12.0" jemoji = "1.7.4" @@ -54,7 +54,7 @@ jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", ver jackson-dataformat-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" } jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } java-string-similarity = { module = "info.debatty:java-string-similarity", version.ref = "java-string-similarity" } -jda = { module = "net.dv8tion:JDA", version.ref = "jda" } +jda = { module = "io.github.freya022:JDA", version.ref = "jda" } jda-emojis = { module = "dev.freya02:jda-emojis", version.ref = "jda-emojis" } jda-ktx = { module = "club.minnced:jda-ktx", version.ref = "jda-ktx" } jemoji = { module = "net.fellbaum:jemoji", version.ref = "jemoji" } From 0a6b12009799c507545236589765f3129b48f851 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:04:01 +0200 Subject: [PATCH 02/21] Update imports --- .../examples/commands/slash/SlashSayAgainEphemeral.java | 4 ++-- .../examples/commands/slash/SlashSayAgainPersistent.java | 2 +- .../examples/commands/slash/SlashSelectRoleEphemeral.java | 4 ++-- .../examples/commands/slash/SlashSelectRolePersistent.java | 2 +- .../examples/commands/slash/SlashSayAgainEphemeral.kt | 2 +- .../examples/commands/slash/SlashSayAgainPersistent.kt | 2 +- .../examples/commands/slash/SlashSelectRoleEphemeral.kt | 4 ++-- .../examples/commands/slash/SlashSelectRolePersistent.kt | 2 +- .../examples/commands/slash/SlashTypeSafeSelectMenus.kt | 2 +- .../botcommands/api/components/AbstractComponentFactory.kt | 5 ++--- .../io/github/freya022/botcommands/api/components/Button.kt | 4 ++-- .../github/freya022/botcommands/api/components/Buttons.kt | 6 +++--- .../freya022/botcommands/api/components/EntitySelectMenu.kt | 4 ++-- .../botcommands/api/components/IdentifiableComponent.kt | 2 +- .../freya022/botcommands/api/components/SelectMenus.kt | 4 ++-- .../freya022/botcommands/api/components/StringSelectMenu.kt | 4 ++-- .../api/components/builder/button/ButtonFactory.kt | 6 +++--- .../components/builder/select/EntitySelectMenuFactory.kt | 4 ++-- .../select/ephemeral/EphemeralEntitySelectBuilder.kt | 4 ++-- .../select/ephemeral/EphemeralStringSelectBuilder.kt | 4 ++-- .../select/persistent/PersistentEntitySelectBuilder.kt | 4 ++-- .../select/persistent/PersistentStringSelectBuilder.kt | 4 ++-- .../botcommands/api/components/utils/ButtonContent.kt | 2 +- .../botcommands/api/components/utils/SelectContent.kt | 2 +- .../io/github/freya022/botcommands/api/modals/ModalEvent.kt | 2 +- .../io/github/freya022/botcommands/api/modals/Modals.kt | 4 ++-- .../freya022/botcommands/api/modals/TextInputBuilder.kt | 4 ++-- .../freya022/botcommands/api/pagination/UsedComponentSet.kt | 3 +-- .../api/pagination/menu/buttonized/ButtonMenu.kt | 2 +- .../api/pagination/nested/AbstractNestedPaginator.kt | 2 +- .../api/pagination/nested/AbstractNestedPaginatorBuilder.kt | 1 - .../botcommands/api/pagination/paginator/Paginator.kt | 2 +- .../freya022/botcommands/internal/components/ButtonImpl.kt | 4 ++-- .../botcommands/internal/components/EntitySelectMenuImpl.kt | 4 ++-- .../botcommands/internal/components/StringSelectMenuImpl.kt | 4 ++-- .../components/builder/button/AbstractButtonBuilder.kt | 4 ++-- .../components/builder/button/EphemeralButtonBuilderImpl.kt | 4 ++-- .../builder/button/PersistentButtonBuilderImpl.kt | 4 ++-- .../select/ephemeral/EphemeralEntitySelectBuilderImpl.kt | 4 ++-- .../select/ephemeral/EphemeralStringSelectBuilderImpl.kt | 4 ++-- .../select/persistent/PersistentEntitySelectBuilderImpl.kt | 4 ++-- .../select/persistent/PersistentStringSelectBuilderImpl.kt | 4 ++-- .../internal/components/handler/ComponentHandlerExecutor.kt | 2 +- .../freya022/botcommands/internal/modals/ModalsImpl.kt | 2 +- .../botcommands/internal/modals/TextInputBuilderImpl.kt | 4 ++-- .../botcommands/test/commands/slash/SlashEmojis.java | 6 +++--- .../test/commands/message/MessageContextAddReactionRole.kt | 4 ++-- .../botcommands/test/commands/slash/SlashNewSelects.kt | 2 +- .../botcommands/test/commands/slash/SlashPagination.kt | 2 +- .../botcommands/test/commands/slash/userapps/SlashEntity.kt | 2 +- .../freya02/botcommands/jda/ktx/components/SelectMenus.kt | 4 ++-- .../kotlin/dev/freya02/botcommands/jda/ktx/ranges/Ranges.kt | 2 +- 52 files changed, 85 insertions(+), 88 deletions(-) diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java index baeccce3b..d4e8e3f44 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java @@ -8,8 +8,8 @@ import io.github.freya022.botcommands.api.commands.application.slash.annotations.SlashOption; import io.github.freya022.botcommands.api.components.Buttons; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; -import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.utils.TimeFormat; import java.time.Duration; diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java index 0703db3e8..a0976a350 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java @@ -11,7 +11,7 @@ import io.github.freya022.botcommands.api.components.annotations.JDAButtonListener; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; import io.github.freya022.botcommands.api.components.event.ButtonEvent; -import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.components.buttons.Button; @Command @RequiresComponents diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java index 7f9c2bbff..35b8df3aa 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java @@ -7,9 +7,9 @@ import io.github.freya022.botcommands.api.components.EntitySelectMenu; import io.github.freya022.botcommands.api.components.SelectMenus; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget; import net.dv8tion.jda.api.utils.TimeFormat; import java.time.Duration; diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java index 89087dfea..f6bdb6042 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java @@ -10,8 +10,8 @@ import io.github.freya022.botcommands.api.components.annotations.JDASelectMenuListener; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; import io.github.freya022.botcommands.api.components.event.EntitySelectEvent; +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget; import java.util.concurrent.ThreadLocalRandom; diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt index 584fe35d8..9d11ec52e 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt @@ -12,7 +12,7 @@ import io.github.freya022.botcommands.api.commands.application.slash.annotations import io.github.freya022.botcommands.api.commands.application.slash.annotations.SlashOption import io.github.freya022.botcommands.api.components.Buttons import io.github.freya022.botcommands.api.components.annotations.RequiresComponents -import net.dv8tion.jda.api.interactions.components.buttons.Button +import net.dv8tion.jda.api.components.buttons.Button import net.dv8tion.jda.api.utils.TimeFormat import kotlin.time.Duration.Companion.seconds diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt index 94ca60de8..4fce20dd0 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt @@ -15,7 +15,7 @@ import io.github.freya022.botcommands.api.components.annotations.JDAButtonListen import io.github.freya022.botcommands.api.components.annotations.RequiresComponents import io.github.freya022.botcommands.api.components.builder.bindWith import io.github.freya022.botcommands.api.components.event.ButtonEvent -import net.dv8tion.jda.api.interactions.components.buttons.Button +import net.dv8tion.jda.api.components.buttons.Button @Command @RequiresComponents diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt index 7947b1ac2..916fcc65d 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt @@ -9,9 +9,9 @@ import io.github.freya022.botcommands.api.commands.application.slash.annotations import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.SelectMenus import io.github.freya022.botcommands.api.components.annotations.RequiresComponents +import net.dv8tion.jda.api.components.actionrow.ActionRow +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget import net.dv8tion.jda.api.entities.Role -import net.dv8tion.jda.api.interactions.components.ActionRow -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget import net.dv8tion.jda.api.utils.TimeFormat import kotlin.random.Random import kotlin.time.Duration.Companion.seconds diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt index 8fe6a8369..7aa9fa1b2 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt @@ -12,8 +12,8 @@ import io.github.freya022.botcommands.api.components.annotations.JDASelectMenuLi import io.github.freya022.botcommands.api.components.annotations.RequiresComponents import io.github.freya022.botcommands.api.components.builder.bindWith import io.github.freya022.botcommands.api.components.event.EntitySelectEvent +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget import net.dv8tion.jda.api.entities.Role -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget import kotlin.random.Random @Command diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashTypeSafeSelectMenus.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashTypeSafeSelectMenus.kt index 82c888a5f..14bf7f5ee 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashTypeSafeSelectMenus.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashTypeSafeSelectMenus.kt @@ -14,7 +14,7 @@ import io.github.freya022.botcommands.api.components.annotations.JDASelectMenuLi import io.github.freya022.botcommands.api.components.annotations.RequiresComponents import io.github.freya022.botcommands.api.components.builder.bindWith import io.github.freya022.botcommands.api.components.event.EntitySelectEvent -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu @Command @RequiresComponents diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt index d96e710ec..bf0e38154 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt @@ -8,8 +8,7 @@ import io.github.freya022.botcommands.api.components.ratelimit.ComponentRateLimi import io.github.freya022.botcommands.api.core.BContext import io.github.freya022.botcommands.internal.components.controller.ComponentController import kotlinx.coroutines.runBlocking -import net.dv8tion.jda.api.interactions.components.ActionComponent -import net.dv8tion.jda.api.interactions.components.LayoutComponent +import net.dv8tion.jda.api.components.ActionComponent import javax.annotation.CheckReturnValue abstract class AbstractComponentFactory internal constructor( @@ -194,4 +193,4 @@ abstract class AbstractComponentFactory internal constructor( fun getRateLimitReference(group: String, discriminator: String): ComponentRateLimitReference? { return componentController.getRateLimitReference(group, discriminator) } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt index 75ddaeda9..b36cf9f4f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt @@ -1,9 +1,9 @@ package io.github.freya022.botcommands.api.components import io.github.freya022.botcommands.api.components.event.ButtonEvent +import net.dv8tion.jda.api.components.buttons.Button as JDAButton +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.Button as JDAButton -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle interface Button : JDAButton, AwaitableComponent, diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Buttons.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Buttons.kt index e0f3aac07..35b59d9f9 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Buttons.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Buttons.kt @@ -6,9 +6,9 @@ import io.github.freya022.botcommands.api.components.builder.button.ButtonFactor import io.github.freya022.botcommands.api.components.utils.ButtonContent import io.github.freya022.botcommands.api.core.service.annotations.BService import io.github.freya022.botcommands.internal.components.controller.ComponentController +import net.dv8tion.jda.api.components.buttons.Button +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.Button -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle import javax.annotation.CheckReturnValue /** @@ -393,4 +393,4 @@ class Buttons internal constructor(componentController: ComponentController) : A @CheckReturnValue fun link(url: String, label: String?, emoji: Emoji?): Button = Button.of(ButtonStyle.LINK, url, label, emoji) -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt index 18ea449ff..24ba4f08f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt @@ -1,7 +1,7 @@ package io.github.freya022.botcommands.api.components import io.github.freya022.botcommands.api.components.event.EntitySelectEvent -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu interface EntitySelectMenu : JDAEntitySelectMenu, AwaitableComponent, @@ -14,4 +14,4 @@ interface EntitySelectMenu : JDAEntitySelectMenu, override fun withDisabled(disabled: Boolean): EntitySelectMenu override fun getId(): String -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt index 7bb2d55c4..237b4cabd 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt @@ -2,7 +2,7 @@ package io.github.freya022.botcommands.api.components import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwArgument -import net.dv8tion.jda.api.interactions.components.ActionComponent +import net.dv8tion.jda.api.components.ActionComponent interface IdentifiableComponent { val internalId: Int diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/SelectMenus.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/SelectMenus.kt index c406fddf9..ec35908cd 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/SelectMenus.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/SelectMenus.kt @@ -5,7 +5,7 @@ import io.github.freya022.botcommands.api.components.builder.select.EntitySelect import io.github.freya022.botcommands.api.components.builder.select.StringSelectMenuFactory import io.github.freya022.botcommands.api.core.service.annotations.BService import io.github.freya022.botcommands.internal.components.controller.ComponentController -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget import java.util.* import javax.annotation.CheckReturnValue @@ -188,4 +188,4 @@ class SelectMenus internal constructor(componentController: ComponentController) @CheckReturnValue fun entitySelectMenu(targets: Collection): EntitySelectMenuFactory = EntitySelectMenuFactory(componentController, targets) -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt index 879ad5a9b..304ecda08 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt @@ -1,7 +1,7 @@ package io.github.freya022.botcommands.api.components import io.github.freya022.botcommands.api.components.event.StringSelectEvent -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu interface StringSelectMenu : JDAStringSelectMenu, AwaitableComponent, @@ -14,4 +14,4 @@ interface StringSelectMenu : JDAStringSelectMenu, override fun withDisabled(disabled: Boolean): StringSelectMenu override fun getId(): String -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/button/ButtonFactory.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/button/ButtonFactory.kt index aff46a7ad..b6ee2d3f7 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/button/ButtonFactory.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/button/ButtonFactory.kt @@ -8,9 +8,9 @@ import io.github.freya022.botcommands.internal.components.builder.InstanceRetrie import io.github.freya022.botcommands.internal.components.builder.button.EphemeralButtonBuilderImpl import io.github.freya022.botcommands.internal.components.builder.button.PersistentButtonBuilderImpl import io.github.freya022.botcommands.internal.components.controller.ComponentController +import net.dv8tion.jda.api.components.buttons.Button as JDAButton +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.Button as JDAButton -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle import java.util.concurrent.ThreadLocalRandom import javax.annotation.CheckReturnValue @@ -133,4 +133,4 @@ class ButtonFactory internal constructor( @JvmSynthetic suspend inline fun persistent(block: PersistentButtonBuilder.() -> Unit): Button = (persistent().apply(block) as PersistentButtonBuilderImpl).buildSuspend() -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/EntitySelectMenuFactory.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/EntitySelectMenuFactory.kt index 0984654a5..36d16951f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/EntitySelectMenuFactory.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/EntitySelectMenuFactory.kt @@ -9,7 +9,7 @@ import io.github.freya022.botcommands.internal.components.builder.InstanceRetrie import io.github.freya022.botcommands.internal.components.builder.select.ephemeral.EphemeralEntitySelectBuilderImpl import io.github.freya022.botcommands.internal.components.builder.select.persistent.PersistentEntitySelectBuilderImpl import io.github.freya022.botcommands.internal.components.controller.ComponentController -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget import javax.annotation.CheckReturnValue /** @@ -62,4 +62,4 @@ class EntitySelectMenuFactory internal constructor( @JvmSynthetic suspend inline fun persistent(block: PersistentEntitySelectBuilder.() -> Unit): EntitySelectMenu = (persistent().apply(block) as PersistentEntitySelectBuilderImpl).buildSuspend() -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt index 95732cea8..4613de909 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt @@ -3,7 +3,7 @@ package io.github.freya022.botcommands.api.components.builder.select.ephemeral import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.builder.* import io.github.freya022.botcommands.api.components.event.EntitySelectEvent -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu abstract class EphemeralEntitySelectBuilder : JDAEntitySelectMenu.Builder(""), @@ -25,4 +25,4 @@ abstract class EphemeralEntitySelectBuilder : super.setId(id) return super.build() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt index 4f5aa1559..86f240314 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt @@ -3,7 +3,7 @@ package io.github.freya022.botcommands.api.components.builder.select.ephemeral import io.github.freya022.botcommands.api.components.StringSelectMenu import io.github.freya022.botcommands.api.components.builder.* import io.github.freya022.botcommands.api.components.event.StringSelectEvent -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu abstract class EphemeralStringSelectBuilder : JDAStringSelectMenu.Builder(""), @@ -25,4 +25,4 @@ abstract class EphemeralStringSelectBuilder : super.setId(id) return super.build() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt index c5130e4b2..02913a67e 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt @@ -2,7 +2,7 @@ package io.github.freya022.botcommands.api.components.builder.select.persistent import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.builder.* -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu abstract class PersistentEntitySelectBuilder : JDAEntitySelectMenu.Builder(""), @@ -24,4 +24,4 @@ abstract class PersistentEntitySelectBuilder : super.setId(id) return super.build() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt index 17ddfea53..06187ec24 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt @@ -2,7 +2,7 @@ package io.github.freya022.botcommands.api.components.builder.select.persistent import io.github.freya022.botcommands.api.components.StringSelectMenu import io.github.freya022.botcommands.api.components.builder.* -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu abstract class PersistentStringSelectBuilder : JDAStringSelectMenu.Builder(""), @@ -24,4 +24,4 @@ abstract class PersistentStringSelectBuilder : super.setId(id) return super.build() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/ButtonContent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/ButtonContent.kt index dc408763c..5f65aae45 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/ButtonContent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/ButtonContent.kt @@ -2,8 +2,8 @@ package io.github.freya022.botcommands.api.components.utils import io.github.freya022.botcommands.api.components.Button import io.github.freya022.botcommands.api.utils.EmojiUtils +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle import javax.annotation.CheckReturnValue /** diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/SelectContent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/SelectContent.kt index 02cd272ec..0e2d65a49 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/SelectContent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/utils/SelectContent.kt @@ -1,7 +1,7 @@ package io.github.freya022.botcommands.api.components.utils +import net.dv8tion.jda.api.components.selections.SelectOption import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.selections.SelectOption data class SelectContent(val label: String, val description: String?, val emoji: Emoji?) { fun toSelectOption(value: String): SelectOption { diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt index 7e5c6cb39..a664c192d 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt @@ -7,8 +7,8 @@ import io.github.freya022.botcommands.internal.localization.interaction.Localiza import io.github.freya022.botcommands.internal.localization.interaction.LocalizableInteractionImpl import io.github.freya022.botcommands.internal.localization.interaction.LocalizableReplyCallbackImpl import io.github.freya022.botcommands.internal.utils.throwArgument +import net.dv8tion.jda.api.components.ActionComponent import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent -import net.dv8tion.jda.api.interactions.components.ActionComponent import net.dv8tion.jda.api.interactions.modals.ModalMapping import java.util.* diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt index b7c8f3c18..ebdd84689 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt @@ -5,8 +5,8 @@ package io.github.freya022.botcommands.api.modals import io.github.freya022.botcommands.api.core.service.annotations.InterfacedService import io.github.freya022.botcommands.api.modals.Modals.Companion.defaultTimeout import io.github.freya022.botcommands.api.modals.annotations.ModalInput -import net.dv8tion.jda.api.interactions.components.text.TextInput -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle +import net.dv8tion.jda.api.components.textinput.TextInput +import net.dv8tion.jda.api.components.textinput.TextInputStyle import java.time.Duration as JavaDuration import javax.annotation.CheckReturnValue import kotlin.contracts.ExperimentalContracts diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/TextInputBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/TextInputBuilder.kt index b33f8113b..4974db133 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/TextInputBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/TextInputBuilder.kt @@ -1,8 +1,8 @@ package io.github.freya022.botcommands.api.modals import io.github.freya022.botcommands.internal.modals.ModalDSL -import net.dv8tion.jda.api.interactions.components.text.TextInput -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle +import net.dv8tion.jda.api.components.textinput.TextInput +import net.dv8tion.jda.api.components.textinput.TextInputStyle @ModalDSL abstract class TextInputBuilder internal constructor( diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt index f2652f540..7b32b67ea 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt @@ -6,7 +6,6 @@ import io.github.freya022.botcommands.api.components.IdentifiableComponent import io.github.freya022.botcommands.internal.utils.any import io.github.freya022.botcommands.internal.utils.reference import io.github.oshai.kotlinlogging.KotlinLogging -import net.dv8tion.jda.api.interactions.components.LayoutComponent import kotlin.reflect.KProperty private val logger = KotlinLogging.logger { } @@ -57,4 +56,4 @@ class UsedComponentSet(private val componentsService: Components, private val cl suspend fun cleanup() { componentsService.deleteComponentsByIds(*currentIds.toArray()) } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/menu/buttonized/ButtonMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/menu/buttonized/ButtonMenu.kt index fc175de39..deff1ab48 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/menu/buttonized/ButtonMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/menu/buttonized/ButtonMenu.kt @@ -5,7 +5,7 @@ import io.github.freya022.botcommands.api.components.utils.ButtonContent import io.github.freya022.botcommands.api.core.BContext import io.github.freya022.botcommands.api.pagination.Paginators import io.github.freya022.botcommands.api.pagination.menu.AbstractMenu -import net.dv8tion.jda.api.interactions.components.ActionRow +import net.dv8tion.jda.api.components.actionrow.ActionRow import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder /** diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt index 90e9cea3f..934a5e64f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt @@ -7,8 +7,8 @@ import io.github.freya022.botcommands.api.core.utils.toImmutableList import io.github.freya022.botcommands.api.pagination.paginator.AbstractPaginator import io.github.freya022.botcommands.internal.utils.throwArgument import net.dv8tion.jda.api.EmbedBuilder +import net.dv8tion.jda.api.components.selections.StringSelectMenu import net.dv8tion.jda.api.interactions.InteractionHook -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder import net.dv8tion.jda.internal.utils.Checks diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginatorBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginatorBuilder.kt index 417221738..7ee31554b 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginatorBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginatorBuilder.kt @@ -4,7 +4,6 @@ import io.github.freya022.botcommands.api.components.utils.SelectContent import io.github.freya022.botcommands.api.core.BContext import io.github.freya022.botcommands.api.pagination.PageEditor import io.github.freya022.botcommands.api.pagination.paginator.AbstractPaginatorBuilder -import net.dv8tion.jda.api.interactions.components.selections.SelectOption /** * @param T Type of the pagination builder diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/Paginator.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/Paginator.kt index 492c6fca0..ed18a928d 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/Paginator.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/Paginator.kt @@ -8,7 +8,7 @@ import io.github.freya022.botcommands.api.pagination.PageEditor import io.github.freya022.botcommands.api.pagination.Paginators import io.github.freya022.botcommands.internal.utils.lazyWritable import net.dv8tion.jda.api.EmbedBuilder -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder /** diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt index 40baf8b0d..159451c03 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt @@ -4,9 +4,9 @@ import io.github.freya022.botcommands.api.components.Button import io.github.freya022.botcommands.api.components.event.ButtonEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal +import net.dv8tion.jda.api.components.buttons.Button as JDAButton +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.Button as JDAButton -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle internal class ButtonImpl internal constructor( componentController: ComponentController, diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt index 702be32d6..0e348e147 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt @@ -4,7 +4,7 @@ import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.event.EntitySelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu internal class EntitySelectMenuImpl internal constructor( componentController: ComponentController, @@ -36,4 +36,4 @@ internal class EntitySelectMenuImpl internal constructor( override fun toString(): String { return selectMenu.toString() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt index fbc9087ba..3dfc86062 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt @@ -4,7 +4,7 @@ import io.github.freya022.botcommands.api.components.StringSelectMenu import io.github.freya022.botcommands.api.components.event.StringSelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu internal class StringSelectMenuImpl internal constructor( componentController: ComponentController, @@ -36,4 +36,4 @@ internal class StringSelectMenuImpl internal constructor( override fun toString(): String { return selectMenu.toString() } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/AbstractButtonBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/AbstractButtonBuilder.kt index cd24ff78b..06ee59f0c 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/AbstractButtonBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/AbstractButtonBuilder.kt @@ -8,9 +8,9 @@ import io.github.freya022.botcommands.internal.components.builder.AbstractCompon import io.github.freya022.botcommands.internal.components.builder.InstanceRetriever import io.github.freya022.botcommands.internal.components.controller.ComponentController import kotlinx.coroutines.runBlocking +import net.dv8tion.jda.api.components.buttons.Button as JDAButton +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.Button as JDAButton -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle @PublishedApi internal sealed class AbstractButtonBuilder>( diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/EphemeralButtonBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/EphemeralButtonBuilderImpl.kt index d9198a7e1..d0c6e573f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/EphemeralButtonBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/EphemeralButtonBuilderImpl.kt @@ -9,8 +9,8 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.IEphemer import io.github.freya022.botcommands.internal.components.builder.mixin.impl.EphemeralActionableComponentImpl import io.github.freya022.botcommands.internal.components.builder.mixin.impl.EphemeralTimeoutableComponentImpl import io.github.freya022.botcommands.internal.components.controller.ComponentController +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle internal class EphemeralButtonBuilderImpl internal constructor( componentController: ComponentController, @@ -33,4 +33,4 @@ internal class EphemeralButtonBuilderImpl internal constructor( init { instanceRetriever.instance = this } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/PersistentButtonBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/PersistentButtonBuilderImpl.kt index 5ed47dbbf..e12a0a3ae 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/PersistentButtonBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/button/PersistentButtonBuilderImpl.kt @@ -9,8 +9,8 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.IPersist import io.github.freya022.botcommands.internal.components.builder.mixin.impl.PersistentActionableComponentImpl import io.github.freya022.botcommands.internal.components.builder.mixin.impl.PersistentTimeoutableComponentImpl import io.github.freya022.botcommands.internal.components.controller.ComponentController +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle internal class PersistentButtonBuilderImpl internal constructor( componentController: ComponentController, @@ -30,4 +30,4 @@ internal class PersistentButtonBuilderImpl internal constructor( init { instanceRetriever.instance = this } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt index cd0043d97..f15b41f74 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt @@ -15,7 +15,7 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.impl.Uni import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwArgument import kotlinx.coroutines.runBlocking -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu @PublishedApi internal class EphemeralEntitySelectBuilderImpl internal constructor( @@ -63,4 +63,4 @@ internal class EphemeralEntitySelectBuilderImpl internal constructor( return EntitySelectMenuImpl(componentController, internalId, jdaBuild(componentId)) } } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt index fcc722e17..d27057106 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt @@ -15,7 +15,7 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.impl.Uni import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwArgument import kotlinx.coroutines.runBlocking -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu @PublishedApi internal class EphemeralStringSelectBuilderImpl internal constructor( @@ -60,4 +60,4 @@ internal class EphemeralStringSelectBuilderImpl internal constructor( return StringSelectMenuImpl(componentController, internalId, jdaBuild(componentId)) } } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt index f26efdca3..777e0b3e7 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt @@ -14,7 +14,7 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.impl.Uni import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwArgument import kotlinx.coroutines.runBlocking -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu as JDAEntitySelectMenu +import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu @PublishedApi internal class PersistentEntitySelectBuilderImpl internal constructor( @@ -62,4 +62,4 @@ internal class PersistentEntitySelectBuilderImpl internal constructor( return EntitySelectMenuImpl(componentController, internalId, jdaBuild(componentId)) } } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt index f79a4a001..adb5af1a4 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt @@ -14,7 +14,7 @@ import io.github.freya022.botcommands.internal.components.builder.mixin.impl.Uni import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwArgument import kotlinx.coroutines.runBlocking -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu as JDAStringSelectMenu +import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu @PublishedApi internal class PersistentStringSelectBuilderImpl internal constructor( @@ -59,4 +59,4 @@ internal class PersistentStringSelectBuilderImpl internal constructor( return StringSelectMenuImpl(componentController, internalId, jdaBuild(componentId)) } } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/handler/ComponentHandlerExecutor.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/handler/ComponentHandlerExecutor.kt index 682efb3ce..d18774134 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/handler/ComponentHandlerExecutor.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/handler/ComponentHandlerExecutor.kt @@ -135,4 +135,4 @@ internal class ComponentHandlerExecutor internal constructor( return tryInsertNullableOption(value, option, optionMap) } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalsImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalsImpl.kt index 2ddfaa387..ddd1be244 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalsImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalsImpl.kt @@ -4,7 +4,7 @@ import io.github.freya022.botcommands.api.core.service.annotations.BService import io.github.freya022.botcommands.api.modals.Modals import io.github.freya022.botcommands.api.modals.TextInputBuilder import io.github.freya022.botcommands.api.modals.annotations.RequiresModals -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle +import net.dv8tion.jda.api.components.textinput.TextInputStyle @BService @RequiresModals diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/TextInputBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/TextInputBuilderImpl.kt index 0b5dcb742..b18fd90bf 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/TextInputBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/TextInputBuilderImpl.kt @@ -1,8 +1,8 @@ package io.github.freya022.botcommands.internal.modals import io.github.freya022.botcommands.api.modals.TextInputBuilder -import net.dv8tion.jda.api.interactions.components.text.TextInput -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle +import net.dv8tion.jda.api.components.textinput.TextInput +import net.dv8tion.jda.api.components.textinput.TextInputStyle internal class TextInputBuilderImpl internal constructor( private val modalMaps: ModalMaps, diff --git a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java index 96c50cac9..b11d567f3 100644 --- a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java +++ b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java @@ -5,9 +5,9 @@ import io.github.freya022.botcommands.api.commands.application.ApplicationCommand; import io.github.freya022.botcommands.api.commands.application.slash.GuildSlashEvent; import io.github.freya022.botcommands.api.commands.application.slash.annotations.JDASlashCommand; -import net.dv8tion.jda.api.interactions.components.buttons.Button; -import net.dv8tion.jda.api.interactions.components.selections.SelectOption; -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu; +import net.dv8tion.jda.api.components.buttons.Button; +import net.dv8tion.jda.api.components.selections.SelectOption; +import net.dv8tion.jda.api.components.selections.StringSelectMenu; import net.dv8tion.jda.api.utils.messages.MessageCreateBuilder; import net.dv8tion.jda.api.utils.messages.MessageCreateData; diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextAddReactionRole.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextAddReactionRole.kt index 634dd1785..e7bb2ee37 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextAddReactionRole.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextAddReactionRole.kt @@ -16,14 +16,14 @@ import io.github.freya022.botcommands.api.core.service.annotations.BService import io.github.freya022.botcommands.api.core.utils.await import io.github.freya022.botcommands.test.services.Disabled import kotlinx.coroutines.withTimeoutOrNull +import net.dv8tion.jda.api.components.buttons.Button +import net.dv8tion.jda.api.components.selections.EntitySelectMenu import net.dv8tion.jda.api.entities.Message import net.dv8tion.jda.api.entities.Role import net.dv8tion.jda.api.entities.emoji.Emoji import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent import net.dv8tion.jda.api.interactions.callbacks.IDeferrableCallback import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback -import net.dv8tion.jda.api.interactions.components.buttons.Button -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu import net.dv8tion.jda.api.utils.messages.MessageCreateData import net.dv8tion.jda.api.utils.messages.MessageEditData import kotlin.time.Duration.Companion.minutes diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewSelects.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewSelects.kt index 2a38c5611..d451833e1 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewSelects.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewSelects.kt @@ -22,10 +22,10 @@ import io.github.freya022.botcommands.api.components.event.StringSelectEvent import io.github.freya022.botcommands.test.config.Config import io.github.freya022.botcommands.test.filters.InVoiceChannel import net.dv8tion.jda.api.Permission +import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget import net.dv8tion.jda.api.entities.UserSnowflake import net.dv8tion.jda.api.entities.channel.ChannelType import net.dv8tion.jda.api.entities.channel.middleman.AudioChannel -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu.SelectTarget import kotlin.time.Duration.Companion.seconds @Command diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt index f28f2a369..e60512c1d 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt @@ -24,8 +24,8 @@ import io.github.freya022.botcommands.api.pagination.paginator.AbstractPaginator import io.github.freya022.botcommands.api.pagination.paginator.Paginator import io.github.oshai.kotlinlogging.KotlinLogging import kotlinx.coroutines.runBlocking +import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.interactions.callbacks.IDeferrableCallback -import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle import kotlin.random.Random import kotlin.random.nextInt import kotlin.time.Duration.Companion.seconds diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/userapps/SlashEntity.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/userapps/SlashEntity.kt index 63249a8f9..fb467c4bb 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/userapps/SlashEntity.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/userapps/SlashEntity.kt @@ -11,13 +11,13 @@ import io.github.freya022.botcommands.api.components.Buttons import io.github.freya022.botcommands.api.components.SelectMenus import io.github.freya022.botcommands.api.core.utils.enumSetOf import io.github.freya022.botcommands.api.modals.Modals +import net.dv8tion.jda.api.components.selections.EntitySelectMenu 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.entities.channel.concrete.* import net.dv8tion.jda.api.interactions.IntegrationType import net.dv8tion.jda.api.interactions.InteractionContextType -import net.dv8tion.jda.api.interactions.components.selections.EntitySelectMenu // Uses breakpoints to see stuff about the interaction @Command diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/SelectMenus.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/SelectMenus.kt index 44c73421a..40e36e0de 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/SelectMenus.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/SelectMenus.kt @@ -1,9 +1,9 @@ package dev.freya02.botcommands.jda.ktx.components import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx +import net.dv8tion.jda.api.components.selections.SelectOption +import net.dv8tion.jda.api.components.selections.StringSelectMenu import net.dv8tion.jda.api.entities.emoji.Emoji -import net.dv8tion.jda.api.interactions.components.selections.SelectOption -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu @ReplaceJdaKtx fun SelectOption( diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/ranges/Ranges.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/ranges/Ranges.kt index 45407101d..cf19cf0a5 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/ranges/Ranges.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/ranges/Ranges.kt @@ -1,7 +1,7 @@ package dev.freya02.botcommands.jda.ktx.ranges import dev.freya02.botcommands.jda.ktx.DeprecatedInBcCore -import net.dv8tion.jda.api.interactions.components.selections.SelectMenu +import net.dv8tion.jda.api.components.selections.SelectMenu /** * The minimum and maximum amount of values a user can select. From 40d7ba6c247c7a62de97f35e60cd263af7a8bd2a Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 14 Mar 2025 14:19:44 +0100 Subject: [PATCH 03/21] Add unions on components --- .../internal/components/AbstractAwaitableComponent.kt | 4 +++- .../freya022/botcommands/internal/components/ButtonImpl.kt | 6 +++++- .../botcommands/internal/components/EntitySelectMenuImpl.kt | 4 +++- .../botcommands/internal/components/StringSelectMenuImpl.kt | 4 +++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt index d246ea216..06b477c16 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt @@ -4,11 +4,13 @@ import io.github.freya022.botcommands.api.components.AwaitableComponent import io.github.freya022.botcommands.api.components.ComponentGroup import io.github.freya022.botcommands.internal.components.controller.ComponentController import net.dv8tion.jda.api.interactions.components.ComponentInteraction +import net.dv8tion.jda.internal.components.AbstractComponentImpl internal abstract class AbstractAwaitableComponentImpl internal constructor( @get:JvmSynthetic internal val componentController: ComponentController -) : AwaitableComponent, +) : AbstractComponentImpl(), + AwaitableComponent, IGroupHolderMixin { @set:JvmSynthetic diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt index 159451c03..8ff100e47 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt @@ -4,8 +4,10 @@ import io.github.freya022.botcommands.api.components.Button import io.github.freya022.botcommands.api.components.event.ButtonEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.buttons.Button as JDAButton import net.dv8tion.jda.api.components.buttons.ButtonStyle +import net.dv8tion.jda.api.components.section.SectionAccessoryComponentUnion import net.dv8tion.jda.api.entities.emoji.Emoji internal class ButtonImpl internal constructor( @@ -14,7 +16,9 @@ internal class ButtonImpl internal constructor( private val button: JDAButton ) : AbstractAwaitableComponentImpl(componentController), Button, - JDAButton by button { + JDAButton by button, + ActionRowChildComponentUnion, + SectionAccessoryComponentUnion { override fun withDisabled(disabled: Boolean): ButtonImpl { return ButtonImpl(componentController, internalId, super.withDisabled(disabled)) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt index 0e348e147..5e0981de1 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt @@ -4,6 +4,7 @@ import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.event.EntitySelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu internal class EntitySelectMenuImpl internal constructor( @@ -12,7 +13,8 @@ internal class EntitySelectMenuImpl internal constructor( private val selectMenu: JDAEntitySelectMenu ) : AbstractAwaitableComponentImpl(componentController), EntitySelectMenu, - JDAEntitySelectMenu by selectMenu { + JDAEntitySelectMenu by selectMenu, + ActionRowChildComponentUnion { override fun withDisabled(disabled: Boolean): EntitySelectMenuImpl { return EntitySelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt index 3dfc86062..64edf0f91 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt @@ -4,6 +4,7 @@ import io.github.freya022.botcommands.api.components.StringSelectMenu import io.github.freya022.botcommands.api.components.event.StringSelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController import io.github.freya022.botcommands.internal.utils.throwInternal +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu internal class StringSelectMenuImpl internal constructor( @@ -12,7 +13,8 @@ internal class StringSelectMenuImpl internal constructor( private val selectMenu: JDAStringSelectMenu ) : AbstractAwaitableComponentImpl(componentController), StringSelectMenu, - JDAStringSelectMenu by selectMenu { + JDAStringSelectMenu by selectMenu, + ActionRowChildComponentUnion { override fun withDisabled(disabled: Boolean): StringSelectMenuImpl { return StringSelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) From ad74fe7d47e86901323c019c9843b8caf7db7ab4 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:05:03 +0200 Subject: [PATCH 04/21] Add test verifying custom components do implement required JDA unions --- .../ComponentMemberUnionInheritanceTest.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/framework/ComponentMemberUnionInheritanceTest.kt diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/framework/ComponentMemberUnionInheritanceTest.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/framework/ComponentMemberUnionInheritanceTest.kt new file mode 100644 index 000000000..6d14ee2f8 --- /dev/null +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/framework/ComponentMemberUnionInheritanceTest.kt @@ -0,0 +1,54 @@ +package io.github.freya022.botcommands.framework + +import io.github.classgraph.ClassGraph +import net.dv8tion.jda.api.components.Component +import net.dv8tion.jda.internal.components.AbstractComponentImpl +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +/** + * Tests that our custom components inherit the same union interfaces as JDA's + */ +class ComponentMemberUnionInheritanceTest { + + @Test + fun `Component should implement their unions`() { + // 1. Take all non-abstract components BC + // 2. Take all interfaces + // 3. Add "Union" to them + // 4. Check if each of them actually exists in the same package + // 5. If it does, assert BC component has it + ClassGraph() + // This is purposefully not internal.components, as there is text inputs too + .acceptPackages("io.github.freya022.botcommands.internal") + .scan() + .use { scan -> + // 1. + scan.getClassesImplementing(Component::class.java) + .filter { !it.isAbstract } + .forEach { bcComponentClass -> + val missingUnionMessages = arrayListOf() + + if (!bcComponentClass.extendsSuperclass(AbstractComponentImpl::class.java)) { + missingUnionMessages += "${bcComponentClass.name} must extend ${AbstractComponentImpl::class.java.name}" + } + + // 2. + bcComponentClass.interfaces.forEach { superinterface -> + // 3. + val unionName = superinterface.name + "Union" + + // 4. + if (javaClass.getResource("/${unionName.replace(".", "/")}.class") == null) return@forEach + + // 5. + if (!bcComponentClass.implementsInterface(unionName)) { + missingUnionMessages += "${bcComponentClass.name} is missing $unionName" + } + } + + assertTrue(missingUnionMessages.isEmpty(), "Some components are missing unions:\n${missingUnionMessages.joinToString("\n")}") + } + } + } +} From b08a9aae267847688d047bafac9628e2dd0096ca Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 29 Jun 2025 22:37:29 +0200 Subject: [PATCH 05/21] Fix changes - Override new `setCustomId` on select menu builders - Fix addActionRow/setActionRow deprecations - Replace `id` deprecations to `customId`/`uniqueId` - When getting action components, use ComponentTree#findAll - Replace LayoutComponent by MessageTopLevelComponent --- .../freya022/bot/commands/slash/SlashBan.kt | 9 ++++---- .../slash/SlashSayAgainEphemeral.java | 2 +- .../slash/SlashSayAgainPersistent.java | 3 ++- .../slash/SlashSelectRoleEphemeral.java | 2 +- .../slash/SlashSelectRolePersistent.java | 3 ++- .../commands/slash/SlashSayAgainEphemeral.kt | 2 +- .../commands/slash/SlashSayAgainPersistent.kt | 3 ++- .../slash/SlashSelectRoleEphemeral.kt | 3 ++- .../slash/SlashSelectRolePersistent.kt | 3 ++- .../components/AbstractComponentFactory.kt | 14 +++++++----- .../botcommands/api/components/Button.kt | 6 ++++- .../api/components/EntitySelectMenu.kt | 3 ++- .../api/components/IdentifiableComponent.kt | 4 ++-- .../api/components/StringSelectMenu.kt | 3 ++- .../ephemeral/EphemeralEntitySelectBuilder.kt | 5 ++++- .../ephemeral/EphemeralStringSelectBuilder.kt | 5 ++++- .../PersistentEntitySelectBuilder.kt | 5 ++++- .../PersistentStringSelectBuilder.kt | 5 ++++- .../botcommands/api/modals/ModalEvent.kt | 2 +- .../freya022/botcommands/api/modals/Modals.kt | 3 ++- .../api/pagination/AbstractPagination.kt | 2 +- .../api/pagination/UsedComponentSet.kt | 16 +++++++++----- .../nested/AbstractNestedPaginator.kt | 3 ++- .../pagination/paginator/AbstractPaginator.kt | 3 ++- .../components/AbstractAwaitableComponent.kt | 11 ++++++++-- .../internal/components/ButtonImpl.kt | 4 ++-- .../components/EntitySelectMenuImpl.kt | 5 +---- .../components/StringSelectMenuImpl.kt | 5 +---- .../EphemeralEntitySelectBuilderImpl.kt | 6 +++++ .../EphemeralStringSelectBuilderImpl.kt | 6 +++++ .../PersistentEntitySelectBuilderImpl.kt | 6 +++++ .../PersistentStringSelectBuilderImpl.kt | 6 +++++ .../internal/modals/ModalBuilderImpl.kt | 13 ++++++----- .../internal/modals/ModalListener.kt | 4 ++-- .../test/commands/slash/SlashEmojis.java | 7 ++++-- .../test/commands/slash/SlashSayJava.java | 3 ++- .../message/MessageContextDeleteIncluding.kt | 2 +- .../test/commands/slash/SlashNewButtons.kt | 2 +- .../test/commands/slash/SlashPagination.kt | 5 +++-- .../test/commands/slash/SlashSay.kt | 5 +++-- .../test/commands/text/TextDelay.kt | 15 ++++++++----- .../jda/ktx/components/ActionRow.kt | 15 ++++++------- .../jda/ktx/components/IDisableable.kt | 22 +++++++++---------- .../botcommands/jda/ktx/messages/Editing.kt | 10 ++++----- .../botcommands/jda/ktx/messages/Messages.kt | 18 +++++++-------- .../botcommands/jda/ktx/messages/Sending.kt | 10 ++++----- 46 files changed, 179 insertions(+), 110 deletions(-) diff --git a/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt b/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt index 4b90575a0..7519dabd2 100644 --- a/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt +++ b/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt @@ -1,5 +1,6 @@ package io.github.freya022.bot.commands.slash +import dev.freya02.botcommands.jda.ktx.components.row import dev.freya02.botcommands.jda.ktx.messages.deleteDelayed import io.github.freya022.bot.commands.ban.BanService import io.github.freya022.bot.resolvers.localize @@ -79,7 +80,7 @@ class SlashBan(private val buttons: Buttons, private val banService: BanService) } event.replyLocalizedEphemeral(localizationContext, "outputs.confirmationMessage", "userMention" to target.asMention) - .addActionRow(cancelButton, confirmButton) + .addComponents(row(cancelButton, confirmButton)) .queue() val componentEvent: ButtonEvent = try { @@ -90,14 +91,14 @@ class SlashBan(private val buttons: Buttons, private val banService: BanService) .queue() } - when (componentEvent.componentId) { - cancelButton.id -> { + when (componentEvent.uniqueId) { + cancelButton.uniqueId -> { logger.debug { "Ban cancelled for ${target.id}" } componentEvent.replaceLocalized(localizationContext, "outputs.cancelled").queue() //Cancel logic } - confirmButton.id -> { + confirmButton.uniqueId -> { logger.debug { "Ban confirmed for ${target.id}, $timeframe of messages were deleted, reason: '$reason'" } componentEvent.replaceLocalized( diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java index d4e8e3f44..b9b03d6f1 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainEphemeral.java @@ -40,7 +40,7 @@ public void onSlashSayAgain( temporaryButtonRef.set(temporarySaySentenceButton); // We have to do this to get the button in our timeout handler event.reply("This button expires " + TimeFormat.RELATIVE.after(Duration.ofSeconds(10))) - .addActionRow(temporarySaySentenceButton) + .addComponents(ActionRow.of(temporarySaySentenceButton)) .queue(); } } diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java index a0976a350..e46166dbb 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSayAgainPersistent.java @@ -11,6 +11,7 @@ import io.github.freya022.botcommands.api.components.annotations.JDAButtonListener; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; import io.github.freya022.botcommands.api.components.event.ButtonEvent; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.buttons.Button; @Command @@ -35,7 +36,7 @@ public void onSlashSayAgain( .build(); event.reply("This button always works") - .addActionRow(persistentSaySentenceButton) + .addComponents(ActionRow.of(persistentSaySentenceButton)) .queue(); } diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java index 35b8df3aa..e5a432964 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRoleEphemeral.java @@ -47,7 +47,7 @@ public void onSlashSelectRole( temporarySelectMenuRef.set(roleMenu); event.reply("This select menu expires " + TimeFormat.RELATIVE.after(Duration.ofSeconds(10))) - .addActionRow(roleMenu) + .addComponents(ActionRow.of(roleMenu)) .queue(); } } diff --git a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java index f6bdb6042..f0036b0df 100644 --- a/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java +++ b/BotCommands-core/src/javaDocExamples/java/doc/java/examples/commands/slash/SlashSelectRolePersistent.java @@ -10,6 +10,7 @@ import io.github.freya022.botcommands.api.components.annotations.JDASelectMenuListener; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; import io.github.freya022.botcommands.api.components.event.EntitySelectEvent; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.selections.EntitySelectMenu.SelectTarget; import net.dv8tion.jda.api.entities.Role; @@ -36,7 +37,7 @@ public void onSlashSelectRole( .build(); event.reply("This select menu always works") - .addActionRow(roleMenu) + .addComponents(ActionRow.of(roleMenu)) .queue(); } diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt index 9d11ec52e..17dbd724b 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainEphemeral.kt @@ -43,7 +43,7 @@ class SlashSayAgainEphemeral : ApplicationCommand() { } event.reply("This button expires ${TimeFormat.RELATIVE.after(10.seconds)}") - .addActionRow(temporarySaySentenceButton) + .addComponents(row(temporarySaySentenceButton)) .await() } } diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt index 4fce20dd0..897822743 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSayAgainPersistent.kt @@ -1,5 +1,6 @@ package doc.kotlin.examples.commands.slash +import dev.freya02.botcommands.jda.ktx.components.row import dev.freya02.botcommands.jda.ktx.coroutines.await import dev.freya02.botcommands.jda.ktx.messages.reply_ import io.github.freya022.botcommands.api.commands.annotations.Command @@ -38,7 +39,7 @@ class SlashSayAgainPersistent : ApplicationCommand() { } event.reply("This button always works") - .addActionRow(persistentSaySentenceButton) + .addComponents(row(persistentSaySentenceButton)) .await() } diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt index 916fcc65d..bd89e020b 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRoleEphemeral.kt @@ -1,5 +1,6 @@ package doc.kotlin.examples.commands.slash +import dev.freya02.botcommands.jda.ktx.components.row import dev.freya02.botcommands.jda.ktx.coroutines.await import dev.freya02.botcommands.jda.ktx.durations.after import io.github.freya022.botcommands.api.commands.annotations.Command @@ -45,7 +46,7 @@ class SlashSelectRoleEphemeral : ApplicationCommand() { temporarySelectMenu = roleMenu event.reply("This select menu expires ${TimeFormat.RELATIVE.after(10.seconds)}") - .addActionRow(roleMenu) + .addComponents(row(roleMenu)) .await() } } diff --git a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt index 7aa9fa1b2..aa30e7886 100644 --- a/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt +++ b/BotCommands-core/src/kotlinDocExamples/kotlin/doc/kotlin/examples/commands/slash/SlashSelectRolePersistent.kt @@ -1,5 +1,6 @@ package doc.kotlin.examples.commands.slash +import dev.freya02.botcommands.jda.ktx.components.row import dev.freya02.botcommands.jda.ktx.coroutines.await import io.github.freya022.botcommands.api.commands.annotations.Command import io.github.freya022.botcommands.api.commands.application.ApplicationCommand @@ -33,7 +34,7 @@ class SlashSelectRolePersistent : ApplicationCommand() { } event.reply("This select menu always works") - .addActionRow(roleMenu) + .addComponents(row(roleMenu)) .await() } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt index bf0e38154..dffac1790 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt @@ -1,5 +1,7 @@ package io.github.freya022.botcommands.api.components +import dev.freya02.botcommands.jda.ktx.components.findAll +import dev.freya02.botcommands.jda.ktx.components.toDefaultComponentTree import io.github.freya022.botcommands.api.commands.ratelimit.declaration.RateLimitProvider import io.github.freya022.botcommands.api.components.builder.ITimeoutableComponent import io.github.freya022.botcommands.api.components.builder.IUniqueComponent @@ -9,6 +11,7 @@ import io.github.freya022.botcommands.api.core.BContext import io.github.freya022.botcommands.internal.components.controller.ComponentController import kotlinx.coroutines.runBlocking import net.dv8tion.jda.api.components.ActionComponent +import net.dv8tion.jda.api.components.MessageTopLevelComponent import javax.annotation.CheckReturnValue abstract class AbstractComponentFactory internal constructor( @@ -102,7 +105,7 @@ abstract class AbstractComponentFactory internal constructor( @JvmSynthetic suspend fun deleteJdaComponents(components: Collection) = components - .mapNotNull { it.id } + .mapNotNull { it.customId } .mapNotNull { IdentifiableComponent.fromIdOrNull(it) } .let { deleteComponents(it) } @@ -115,7 +118,7 @@ abstract class AbstractComponentFactory internal constructor( * and components from the same group will also be deleted according to the [timeout][ITimeoutableComponent.timeout] documentation. */ @JvmName("deleteRows") - fun deleteRowsJava(components: Collection) = runBlocking { deleteRows(components) } + fun deleteRowsJava(components: Collection) = runBlocking { deleteRows(components) } /** * Removes the component data stored by the framework of the provided components. @@ -124,9 +127,10 @@ abstract class AbstractComponentFactory internal constructor( * and components from the same group will also be deleted according to the [timeout][ITimeoutableComponent.timeout] documentation. */ @JvmSynthetic - suspend fun deleteRows(components: Collection) = - components.flatMap { it.actionComponents } - .mapNotNull { it.id } + suspend fun deleteRows(components: Collection) = + components.toDefaultComponentTree() + .findAll() + .mapNotNull { it.customId } .mapNotNull { IdentifiableComponent.fromIdOrNull(it) } .let { deleteComponents(it) } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt index b36cf9f4f..86d84fefd 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt @@ -19,6 +19,7 @@ interface Button : JDAButton, override fun withLabel(label: String): Button + @Deprecated("Replaced with withCustomId(id)", ReplaceWith("withCustomId(id)")) override fun withId(id: String): Nothing = throw UnsupportedOperationException("This type of button cannot contain custom IDs") @@ -27,5 +28,8 @@ interface Button : JDAButton, override fun withStyle(style: ButtonStyle): Button - override fun getId(): String + @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) + override fun getId(): String = getCustomId() + + override fun getCustomId(): String } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt index 24ba4f08f..f4f77413a 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt @@ -13,5 +13,6 @@ interface EntitySelectMenu : JDAEntitySelectMenu, override fun withDisabled(disabled: Boolean): EntitySelectMenu - override fun getId(): String + @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) + override fun getId(): String = customId } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt index 237b4cabd..f3fd935c4 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/IdentifiableComponent.kt @@ -16,11 +16,11 @@ interface IdentifiableComponent { @JvmStatic fun fromComponent(component: ActionComponent): IdentifiableComponent = - fromId(component.id ?: throwArgument("This component has no ID")) + fromId(component.customId ?: throwArgument("This component has no ID")) @JvmStatic fun fromComponentOrNull(component: ActionComponent): IdentifiableComponent? = - fromIdOrNull(component.id ?: throwArgument("This component has no ID")) + fromIdOrNull(component.customId ?: throwArgument("This component has no ID")) @JvmStatic fun fromId(id: String): IdentifiableComponent { diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt index 304ecda08..b5fbca9b0 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt @@ -13,5 +13,6 @@ interface StringSelectMenu : JDAStringSelectMenu, override fun withDisabled(disabled: Boolean): StringSelectMenu - override fun getId(): String + @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) + override fun getId(): String = customId } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt index 4613de909..279c344b0 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralEntitySelectBuilder.kt @@ -19,10 +19,13 @@ abstract class EphemeralEntitySelectBuilder : @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) abstract override fun setId(customId: String): JDAEntitySelectMenu.Builder + @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) + abstract override fun setCustomId(customId: String): JDAEntitySelectMenu.Builder + abstract override fun build(): EntitySelectMenu protected fun jdaBuild(id: String): JDAEntitySelectMenu { - super.setId(id) + super.setCustomId(id) return super.build() } } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt index 86f240314..a918af04d 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/ephemeral/EphemeralStringSelectBuilder.kt @@ -19,10 +19,13 @@ abstract class EphemeralStringSelectBuilder : @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) abstract override fun setId(customId: String): JDAStringSelectMenu.Builder + @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) + abstract override fun setCustomId(customId: String): JDAStringSelectMenu.Builder + abstract override fun build(): StringSelectMenu protected fun jdaBuild(id: String): JDAStringSelectMenu { - super.setId(id) + super.setCustomId(id) return super.build() } } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt index 02913a67e..22cf2919a 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentEntitySelectBuilder.kt @@ -18,10 +18,13 @@ abstract class PersistentEntitySelectBuilder : @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) abstract override fun setId(customId: String): JDAEntitySelectMenu.Builder + @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) + abstract override fun setCustomId(customId: String): JDAEntitySelectMenu.Builder + abstract override fun build(): EntitySelectMenu protected fun jdaBuild(id: String): JDAEntitySelectMenu { - super.setId(id) + super.setCustomId(id) return super.build() } } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt index 06187ec24..f214581f2 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/builder/select/persistent/PersistentStringSelectBuilder.kt @@ -18,10 +18,13 @@ abstract class PersistentStringSelectBuilder : @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) abstract override fun setId(customId: String): JDAStringSelectMenu.Builder + @Deprecated("Cannot set an ID on components managed by the framework", level = DeprecationLevel.ERROR) + abstract override fun setCustomId(customId: String): JDAStringSelectMenu.Builder + abstract override fun build(): StringSelectMenu protected fun jdaBuild(id: String): JDAStringSelectMenu { - super.setId(id) + super.setCustomId(id) return super.build() } } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt index a664c192d..993cd168a 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt @@ -47,7 +47,7 @@ class ModalEvent internal constructor( "Can only get modal mapping for modal-compatible components, provided: $component" } - return event.values.first { it.id == component.id } + return event.values.first { it.uniqueId == component.uniqueId } ?: throwArgument("No value found, you likely passed an input from another modal, or haven't attached it") } } \ No newline at end of file diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt index ebdd84689..3050ccd74 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modals.kt @@ -2,6 +2,7 @@ package io.github.freya022.botcommands.api.modals +import dev.freya02.botcommands.jda.ktx.components.row import io.github.freya022.botcommands.api.core.service.annotations.InterfacedService import io.github.freya022.botcommands.api.modals.Modals.Companion.defaultTimeout import io.github.freya022.botcommands.api.modals.annotations.ModalInput @@ -71,7 +72,7 @@ fun ModalBuilder.textInput(inputName: String, label: String, inputStyle: TextInp return modals.createTextInput(inputName, label, inputStyle) .apply(block) .build() - .also { addActionRow(it) } + .also { addComponents(row(it)) } } fun ModalBuilder.shortTextInput(inputName: String, label: String, block: TextInputBuilder.() -> Unit = {}): TextInput { diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/AbstractPagination.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/AbstractPagination.kt index 5b98e0203..ef869bf41 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/AbstractPagination.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/AbstractPagination.kt @@ -112,7 +112,7 @@ abstract class AbstractPagination> protected construct protected open fun postProcess(builder: MessageCreateBuilder) { } private fun saveUsedComponents(builder: MessageCreateBuilder) { - usedComponents.setComponents(builder.components) + usedComponents.setComponents(builder.componentTree) } /** diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt index 7b32b67ea..e9533b95e 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt @@ -1,11 +1,15 @@ package io.github.freya022.botcommands.api.pagination +import dev.freya02.botcommands.jda.ktx.components.findAll +import dev.freya02.botcommands.jda.ktx.components.toDefaultComponentTree import gnu.trove.set.hash.TIntHashSet import io.github.freya022.botcommands.api.components.Components import io.github.freya022.botcommands.api.components.IdentifiableComponent import io.github.freya022.botcommands.internal.utils.any import io.github.freya022.botcommands.internal.utils.reference import io.github.oshai.kotlinlogging.KotlinLogging +import net.dv8tion.jda.api.components.ActionComponent +import net.dv8tion.jda.api.components.tree.ComponentTree import kotlin.reflect.KProperty private val logger = KotlinLogging.logger { } @@ -16,18 +20,18 @@ private val logger = KotlinLogging.logger { } class UsedComponentSet(private val componentsService: Components, private val cleanAfterRefresh: Boolean) { private lateinit var currentIds: TIntHashSet - fun setComponents(components: Iterable) { + fun setComponents(componentTree: ComponentTree<*>) { val newIds = TIntHashSet().apply { - for (row in components) { - row.actionComponents.forEach { component -> - if (component.id == null) return@forEach + componentTree + .findAll() + .forEach { component -> + if (component.customId == null) return@forEach val bcComponent = component as? IdentifiableComponent - ?: return@forEach logger.warn { "Attempted to use a non-BC component, id: '${component.id}'" } + ?: return@forEach logger.warn { "Attempted to use a non-BC component, id: '${component.customId}'" } add(bcComponent.internalId) } - } } if (::currentIds.isInitialized.not()) { diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt index 934a5e64f..85344f6fc 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/nested/AbstractNestedPaginator.kt @@ -1,5 +1,6 @@ package io.github.freya022.botcommands.api.pagination.nested +import dev.freya02.botcommands.jda.ktx.components.row import io.github.freya022.botcommands.api.components.event.StringSelectEvent import io.github.freya022.botcommands.api.components.utils.SelectContent import io.github.freya022.botcommands.api.core.BContext @@ -117,6 +118,6 @@ abstract class AbstractNestedPaginator> protected super.putComponents(builder) } - builder.addActionRow(createSelectMenu()) + builder.addComponents(row(createSelectMenu())) } } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/AbstractPaginator.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/AbstractPaginator.kt index 0c1ad202b..a2319317b 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/AbstractPaginator.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/paginator/AbstractPaginator.kt @@ -1,5 +1,6 @@ package io.github.freya022.botcommands.api.pagination.paginator +import dev.freya02.botcommands.jda.ktx.components.row import io.github.freya022.botcommands.api.components.event.ButtonEvent import io.github.freya022.botcommands.api.components.utils.ButtonContent import io.github.freya022.botcommands.api.core.BContext @@ -69,7 +70,7 @@ abstract class AbstractPaginator> protected constructor } } - builder.addActionRow(buttons) + builder.addComponents(buttons.row()) } private fun ButtonContent.toPageButton(targetPage: Int) = diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt index 06b477c16..bda7c4ed2 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/AbstractAwaitableComponent.kt @@ -3,12 +3,15 @@ package io.github.freya022.botcommands.internal.components import io.github.freya022.botcommands.api.components.AwaitableComponent import io.github.freya022.botcommands.api.components.ComponentGroup import io.github.freya022.botcommands.internal.components.controller.ComponentController +import net.dv8tion.jda.api.components.Component import net.dv8tion.jda.api.interactions.components.ComponentInteraction +import net.dv8tion.jda.api.utils.data.DataObject import net.dv8tion.jda.internal.components.AbstractComponentImpl internal abstract class AbstractAwaitableComponentImpl internal constructor( @get:JvmSynthetic - internal val componentController: ComponentController + internal val componentController: ComponentController, + private val originalComponent: Component, ) : AbstractComponentImpl(), AwaitableComponent, IGroupHolderMixin { @@ -16,6 +19,10 @@ internal abstract class AbstractAwaitableComponentImpl @set:JvmSynthetic override var group: ComponentGroup? = null + override fun toData(): DataObject { + return (originalComponent as AbstractComponentImpl).toData() + } + @JvmSynthetic override suspend fun await(): T { check(group == null) { @@ -24,4 +31,4 @@ internal abstract class AbstractAwaitableComponentImpl return componentController.continuationManager.awaitComponent(this) } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt index 8ff100e47..7c97f1ef7 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt @@ -14,7 +14,7 @@ internal class ButtonImpl internal constructor( componentController: ComponentController, override val internalId: Int, private val button: JDAButton -) : AbstractAwaitableComponentImpl(componentController), +) : AbstractAwaitableComponentImpl(componentController, button), Button, JDAButton by button, ActionRowChildComponentUnion, @@ -36,7 +36,7 @@ internal class ButtonImpl internal constructor( return ButtonImpl(componentController, internalId, super.withStyle(style)) } - override fun getId(): String = button.id ?: throwInternal("BC components cannot have null IDs") + override fun getCustomId(): String = button.customId ?: throwInternal("BC components cannot have null IDs") override fun getUrl(): String? = null diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt index 5e0981de1..1fe91c52e 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt @@ -3,7 +3,6 @@ package io.github.freya022.botcommands.internal.components import io.github.freya022.botcommands.api.components.EntitySelectMenu import io.github.freya022.botcommands.api.components.event.EntitySelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController -import io.github.freya022.botcommands.internal.utils.throwInternal import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.selections.EntitySelectMenu as JDAEntitySelectMenu @@ -11,7 +10,7 @@ internal class EntitySelectMenuImpl internal constructor( componentController: ComponentController, override val internalId: Int, private val selectMenu: JDAEntitySelectMenu -) : AbstractAwaitableComponentImpl(componentController), +) : AbstractAwaitableComponentImpl(componentController, selectMenu), EntitySelectMenu, JDAEntitySelectMenu by selectMenu, ActionRowChildComponentUnion { @@ -20,8 +19,6 @@ internal class EntitySelectMenuImpl internal constructor( return EntitySelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) } - override fun getId(): String = selectMenu.id ?: throwInternal("BC components cannot have null IDs") - override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt index 64edf0f91..36ef38c00 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt @@ -3,7 +3,6 @@ package io.github.freya022.botcommands.internal.components import io.github.freya022.botcommands.api.components.StringSelectMenu import io.github.freya022.botcommands.api.components.event.StringSelectEvent import io.github.freya022.botcommands.internal.components.controller.ComponentController -import io.github.freya022.botcommands.internal.utils.throwInternal import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.selections.StringSelectMenu as JDAStringSelectMenu @@ -11,7 +10,7 @@ internal class StringSelectMenuImpl internal constructor( componentController: ComponentController, override val internalId: Int, private val selectMenu: JDAStringSelectMenu -) : AbstractAwaitableComponentImpl(componentController), +) : AbstractAwaitableComponentImpl(componentController, selectMenu), StringSelectMenu, JDAStringSelectMenu by selectMenu, ActionRowChildComponentUnion { @@ -20,8 +19,6 @@ internal class StringSelectMenuImpl internal constructor( return StringSelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) } - override fun getId(): String = selectMenu.id ?: throwInternal("BC components cannot have null IDs") - override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt index f15b41f74..bd0612e26 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralEntitySelectBuilderImpl.kt @@ -52,6 +52,12 @@ internal class EphemeralEntitySelectBuilderImpl internal constructor( throwArgument("Cannot set an ID on components managed by the framework") } + @Suppress("OVERRIDE_DEPRECATION") // yup + override fun setCustomId(customId: String): JDAEntitySelectMenu.Builder { + if (customId.isEmpty()) return this //Empty ID is set by super constructor + throwArgument("Cannot set an ID on components managed by the framework") + } + override fun build(): EntitySelectMenu = runBlocking { buildSuspend() } @PublishedApi diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt index d27057106..a546b9bd8 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/ephemeral/EphemeralStringSelectBuilderImpl.kt @@ -49,6 +49,12 @@ internal class EphemeralStringSelectBuilderImpl internal constructor( throwArgument("Cannot set an ID on components managed by the framework") } + @Suppress("OVERRIDE_DEPRECATION") // yup + override fun setCustomId(customId: String): JDAStringSelectMenu.Builder { + if (customId.isEmpty()) return this //Empty ID is set by super constructor + throwArgument("Cannot set an ID on components managed by the framework") + } + override fun build(): StringSelectMenu = runBlocking { buildSuspend() } @PublishedApi diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt index 777e0b3e7..d2784894a 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentEntitySelectBuilderImpl.kt @@ -51,6 +51,12 @@ internal class PersistentEntitySelectBuilderImpl internal constructor( throwArgument("Cannot set an ID on components managed by the framework") } + @Suppress("OVERRIDE_DEPRECATION") + override fun setCustomId(customId: String): JDAEntitySelectMenu.Builder { + if (customId.isEmpty()) return this //Empty ID is set by super constructor + throwArgument("Cannot set an ID on components managed by the framework") + } + override fun build(): EntitySelectMenu = runBlocking { buildSuspend() } @PublishedApi diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt index adb5af1a4..f349c3e24 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/builder/select/persistent/PersistentStringSelectBuilderImpl.kt @@ -48,6 +48,12 @@ internal class PersistentStringSelectBuilderImpl internal constructor( throwArgument("Cannot set an ID on components managed by the framework") } + @Suppress("OVERRIDE_DEPRECATION") + override fun setCustomId(customId: String): JDAStringSelectMenu.Builder { + if (customId.isEmpty()) return this //Empty ID is set by super constructor + throwArgument("Cannot set an ID on components managed by the framework") + } + override fun build(): StringSelectMenu = runBlocking { buildSuspend() } @PublishedApi diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalBuilderImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalBuilderImpl.kt index 7ccbc0e37..8180fea77 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalBuilderImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalBuilderImpl.kt @@ -1,5 +1,7 @@ package io.github.freya022.botcommands.internal.modals +import dev.freya02.botcommands.jda.ktx.components.findAll +import dev.freya02.botcommands.jda.ktx.components.toDefaultComponentTree import gnu.trove.map.TLongObjectMap import gnu.trove.map.hash.TLongObjectHashMap import io.github.freya022.botcommands.api.modals.Modal @@ -8,8 +10,8 @@ import io.github.freya022.botcommands.api.modals.ModalEvent import io.github.freya022.botcommands.api.modals.Modals import io.github.freya022.botcommands.internal.utils.classRef import io.github.freya022.botcommands.internal.utils.takeIfFinite -import io.github.freya022.botcommands.internal.utils.throwInternal import io.github.freya022.botcommands.internal.utils.throwState +import net.dv8tion.jda.api.components.ActionComponent import kotlin.time.Duration internal class ModalBuilderImpl internal constructor( @@ -44,11 +46,10 @@ internal class ModalBuilderImpl internal constructor( override fun build(): Modal { //Extract input data into this map val inputDataMap: TLongObjectMap = TLongObjectHashMap() - components - .flatMap { it.actionComponents } - .filter { it.id != null } + components.toDefaultComponentTree() + .findAll() .forEach { actionComponent -> - val id = actionComponent.id ?: throwInternal("Non identifiable components should have been filtered") + val id = actionComponent.customId ?: return@forEach val internalId = ModalMaps.parseInputId(id) val data = modalMaps.consumeInput(internalId) @@ -64,4 +65,4 @@ internal class ModalBuilderImpl internal constructor( return Modal(jdaBuild(), modalMaps) } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalListener.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalListener.kt index 58eb24d35..7b153ae57 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalListener.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/modals/ModalListener.kt @@ -33,7 +33,7 @@ internal class ModalListener( @BEventListener suspend fun onModalEvent(jdaEvent: ModalInteractionEvent) { - logger.trace { "Received modal interaction '${jdaEvent.modalId}' with ${jdaEvent.values.associate { it.id to it.asString }}" } + logger.trace { "Received modal interaction '${jdaEvent.modalId}' with ${jdaEvent.values.associate { it.uniqueId to it.asString }}" } scope.launchCatching({ handleException(it, jdaEvent) }) launch@{ if (!ModalMaps.isCompatibleModal(jdaEvent.modalId)) { @@ -69,7 +69,7 @@ internal class ModalListener( private suspend fun handleException(e: Throwable, event: ModalInteractionEvent) { exceptionHandler.handleException(event, e, "modal handler, ID: '${event.modalId}'", buildMap(2) { event.message?.let { put("Message", it.jumpUrl) } - put("Modal values", event.values.associate { it.id to it.asString }) + put("Modal values", event.values.associate { it.uniqueId to it.asString }) }) if (e is InsufficientPermissionException) { event.replyExceptionMessage(messagesFactory.get(event).missingBotPermissions(event, setOf(e.permission))) diff --git a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java index b11d567f3..1aecb3c94 100644 --- a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java +++ b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashEmojis.java @@ -5,6 +5,7 @@ import io.github.freya022.botcommands.api.commands.application.ApplicationCommand; import io.github.freya022.botcommands.api.commands.application.slash.GuildSlashEvent; import io.github.freya022.botcommands.api.commands.application.slash.annotations.JDASlashCommand; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.components.buttons.Button; import net.dv8tion.jda.api.components.selections.SelectOption; import net.dv8tion.jda.api.components.selections.StringSelectMenu; @@ -26,8 +27,10 @@ public void onSlashEmojis(GuildSlashEvent event) { .build(); MessageCreateData messageData = new MessageCreateBuilder() - .addActionRow(approve) - .addActionRow(choices) + .addComponents( + ActionRow.of(approve), + ActionRow.of(choices) + ) .build(); event.reply(messageData) diff --git a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashSayJava.java b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashSayJava.java index 7b31e6f23..984719c00 100644 --- a/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashSayJava.java +++ b/BotCommands-core/src/test/java/io/github/freya022/botcommands/test/commands/slash/SlashSayJava.java @@ -9,6 +9,7 @@ import io.github.freya022.botcommands.api.components.Button; import io.github.freya022.botcommands.api.components.Buttons; import io.github.freya022.botcommands.api.components.annotations.RequiresComponents; +import net.dv8tion.jda.api.components.actionrow.ActionRow; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.interactions.InteractionHook; @@ -45,7 +46,7 @@ public void onSlashSay( .queue(); channel.sendMessage(content) - .addActionRow(deleteButton) + .addComponents(ActionRow.of(deleteButton)) .queue(); } } diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt index fb1afaab0..6a88eaf78 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt @@ -1,6 +1,5 @@ package io.github.freya022.botcommands.test.commands.message -import dev.freya02.botcommands.jda.ktx.components.row import dev.freya02.botcommands.jda.ktx.coroutines.await import dev.freya02.botcommands.jda.ktx.messages.deleteDelayed import dev.freya02.botcommands.jda.ktx.messages.editMessage @@ -14,6 +13,7 @@ import io.github.freya022.botcommands.api.commands.application.context.annotatio import io.github.freya022.botcommands.api.commands.application.context.annotations.JDAMessageCommand import io.github.freya022.botcommands.api.commands.application.context.message.GuildMessageEvent import io.github.freya022.botcommands.api.components.Buttons +import io.github.freya022.botcommands.test.commands.slash.ActionRow import kotlinx.coroutines.future.await import kotlinx.datetime.Clock import kotlinx.datetime.toJavaInstant diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewButtons.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewButtons.kt index 5dfea473f..71fe2be09 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewButtons.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashNewButtons.kt @@ -47,7 +47,7 @@ class SlashNewButtons( } }.into() - event.reply("OK, button ID: ${persistentButton.id}").setComponents(row).queue() + event.reply("OK, button ID: ${persistentButton.customId}").setComponents(row).queue() try { // withTimeout(5.seconds) { diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt index e60512c1d..8e60cfc6b 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashPagination.kt @@ -1,5 +1,6 @@ package io.github.freya022.botcommands.test.commands.slash +import dev.freya02.botcommands.jda.ktx.components.into import dev.freya02.botcommands.jda.ktx.coroutines.await import dev.freya02.botcommands.jda.ktx.messages.reply_ import io.github.freya022.botcommands.api.commands.annotations.Command @@ -78,13 +79,13 @@ class SlashPagination(private val paginators: Paginators, private val buttons: B // Certified java callback moment runBlocking { - builder.addActionRow(buttons.primary("Random page").ephemeral { + builder.addComponents(buttons.primary("Random page").ephemeral { constraints(paginator.constraints) bindTo { paginator.page = Random.nextInt(0...row() = ActionRow.of(this) +fun Collection.row() = ActionRow.of(this) @ReplaceJdaKtx("dev.minn.jda.ktx.messages") @JvmName("intoComponents") -fun Collection.into(): List = listOf(this.row()) +fun Collection.into(): List = listOf(this.row()) @ReplaceJdaKtx("dev.minn.jda.ktx.messages") -fun ItemComponent.into(): List = row(this).into() +fun ActionRowChildComponent.into(): List = row(this).into() @ReplaceJdaKtx("dev.minn.jda.ktx.messages") -fun T.into(): List = listOf(this) +fun T.into(): List = listOf(this) diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/IDisableable.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/IDisableable.kt index 678beb52f..08ad09e61 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/IDisableable.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/IDisableable.kt @@ -1,27 +1,28 @@ package dev.freya02.botcommands.jda.ktx.components import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx -import net.dv8tion.jda.api.interactions.components.LayoutComponent +import net.dv8tion.jda.api.components.Component +import net.dv8tion.jda.api.components.tree.ComponentTree /** * Returns a list containing the results of disabling/enabling each component in the original collection. */ @ReplaceJdaKtx -fun Iterable.withDisabled(disabled: Boolean) = map { - it.withDisabled(disabled) -} +@Suppress("UNCHECKED_CAST") +fun Iterable.withDisabled(disabled: Boolean): List = + ComponentTree.of(this.toList()).withDisabled(disabled).components as List /** * Returns a list containing the results of disabling each component in the original collection. */ @ReplaceJdaKtx -fun Iterable.asDisabled() = withDisabled(true) +fun Iterable.asDisabled() = withDisabled(true) /** * Returns a list containing the results of enabling each component in the original collection. */ @ReplaceJdaKtx -fun Iterable.asEnabled() = withDisabled(false) +fun Iterable.asEnabled() = withDisabled(false) /** * Returns a sequence containing the results of disabling/enabling each component in the original sequence. @@ -29,9 +30,8 @@ fun Iterable.asEnabled() = withDisabled(false) * The operation is _intermediate_ and _stateless_. */ @ReplaceJdaKtx -fun Sequence.withDisabled(disabled: Boolean) = map { - it.withDisabled(disabled) -} +fun Sequence.withDisabled(disabled: Boolean) = + asIterable().withDisabled(disabled).asSequence() /** * Returns a sequence containing the results of disabling each component in the original sequence. @@ -39,7 +39,7 @@ fun Sequence.withDisabled(disabled: Boolean) = map { * The operation is _intermediate_ and _stateless_. */ @ReplaceJdaKtx -fun Sequence.asDisabled() = withDisabled(true) +fun Sequence.asDisabled() = withDisabled(true) /** * Returns a sequence containing the results of enabling each component in the original sequence. @@ -47,4 +47,4 @@ fun Sequence.asDisabled() = withDisabled(true) * The operation is _intermediate_ and _stateless_. */ @ReplaceJdaKtx -fun Sequence.asEnabled() = withDisabled(false) +fun Sequence.asEnabled() = withDisabled(false) diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt index 4fa23bca4..84ecc0e86 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt @@ -1,12 +1,12 @@ package dev.freya02.botcommands.jda.ktx.messages import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx +import net.dv8tion.jda.api.components.MessageTopLevelComponent import net.dv8tion.jda.api.entities.Message import net.dv8tion.jda.api.entities.MessageEmbed import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel import net.dv8tion.jda.api.interactions.InteractionHook import net.dv8tion.jda.api.interactions.callbacks.IMessageEditCallback -import net.dv8tion.jda.api.interactions.components.LayoutComponent import net.dv8tion.jda.api.requests.restaction.MessageEditAction import net.dv8tion.jda.api.requests.restaction.WebhookMessageEditAction import net.dv8tion.jda.api.requests.restaction.interactions.MessageEditCallbackAction @@ -29,7 +29,7 @@ import net.dv8tion.jda.api.utils.AttachedFile inline fun IMessageEditCallback.editMessage_( content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, @@ -53,7 +53,7 @@ inline fun InteractionHook.editMessage( id: String = "@original", content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, @@ -77,7 +77,7 @@ inline fun MessageChannel.editMessage( id: String, content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, @@ -99,7 +99,7 @@ inline fun MessageChannel.editMessage( inline fun Message.edit( content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt index 13186715e..dc6234b13 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt @@ -5,12 +5,12 @@ package dev.freya02.botcommands.jda.ktx.messages import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx import dev.freya02.botcommands.jda.ktx.components.row import net.dv8tion.jda.api.EmbedBuilder +import net.dv8tion.jda.api.components.MessageTopLevelComponent +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent import net.dv8tion.jda.api.entities.Message.MentionType import net.dv8tion.jda.api.entities.MessageEmbed import net.dv8tion.jda.api.entities.Role import net.dv8tion.jda.api.entities.UserSnowflake -import net.dv8tion.jda.api.interactions.components.ItemComponent -import net.dv8tion.jda.api.interactions.components.LayoutComponent import net.dv8tion.jda.api.utils.AttachedFile import net.dv8tion.jda.api.utils.FileUpload import net.dv8tion.jda.api.utils.messages.AbstractMessageBuilder @@ -39,7 +39,7 @@ inline fun MessageCreateBuilder( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, // TODO useComponentsV2 tts: Boolean = false, mentions: Mentions = Mentions.default(), @@ -65,7 +65,7 @@ inline fun MessageCreate( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, // TODO useComponentsV2 tts: Boolean = false, mentions: Mentions = Mentions.default(), @@ -97,7 +97,7 @@ inline fun MessageCreate( inline fun MessageEditBuilder( content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, mentions: Mentions? = null, replace: Boolean = false, @@ -127,7 +127,7 @@ inline fun MessageEditBuilder( inline fun MessageEdit( content: String? = null, embeds: Collection? = null, - components: Collection? = null, + components: Collection? = null, files: Collection? = null, mentions: Mentions? = null, replace: Boolean = false, @@ -182,13 +182,13 @@ class InlineMessage(val builder: AbstractMessageBuilder) { embeds += InlineEmbed(EmbedBuilder(embed)).apply(builder).build() } - val components = Accumulator() // TODO TopLevelMessageComponent + val components = Accumulator() // TODO TopLevelMessageComponent - fun actionRow(vararg components: ItemComponent) { + fun actionRow(vararg components: ActionRowChildComponent) { this.components += row(*components) } - fun actionRow(components: Collection) { + fun actionRow(components: Collection) { this.components += components.row() } diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt index ad4ad5b64..f90a39444 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt @@ -1,12 +1,12 @@ package dev.freya02.botcommands.jda.ktx.messages import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx +import net.dv8tion.jda.api.components.MessageTopLevelComponent import net.dv8tion.jda.api.entities.Message import net.dv8tion.jda.api.entities.MessageEmbed import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel import net.dv8tion.jda.api.interactions.InteractionHook import net.dv8tion.jda.api.interactions.callbacks.IReplyCallback -import net.dv8tion.jda.api.interactions.components.LayoutComponent import net.dv8tion.jda.api.requests.restaction.MessageCreateAction import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction @@ -20,7 +20,7 @@ inline fun IReplyCallback.reply_( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, tts: Boolean = false, mentions: Mentions = Mentions.default(), ephemeral: Boolean = false, @@ -35,7 +35,7 @@ inline fun InteractionHook.send( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, tts: Boolean = false, mentions: Mentions = Mentions.default(), ephemeral: Boolean = false, @@ -50,7 +50,7 @@ inline fun MessageChannel.send( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, @@ -65,7 +65,7 @@ inline fun Message.reply_( content: String? = null, embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, - components: Collection = NO_CONTENT, + components: Collection = NO_CONTENT, tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, From 80bbc561f9ef3d633da2b779e2c4a7163157b0de Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:37:24 +0100 Subject: [PATCH 06/21] Add compatibility method for UsedComponentSet#setComponents --- .../botcommands/api/pagination/UsedComponentSet.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt index e9533b95e..d9e5fe5b1 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt @@ -9,6 +9,7 @@ import io.github.freya022.botcommands.internal.utils.any import io.github.freya022.botcommands.internal.utils.reference import io.github.oshai.kotlinlogging.KotlinLogging import net.dv8tion.jda.api.components.ActionComponent +import net.dv8tion.jda.api.components.Component import net.dv8tion.jda.api.components.tree.ComponentTree import kotlin.reflect.KProperty @@ -20,6 +21,17 @@ private val logger = KotlinLogging.logger { } class UsedComponentSet(private val componentsService: Components, private val cleanAfterRefresh: Boolean) { private lateinit var currentIds: TIntHashSet + @Deprecated( + message = "Replaced with setComponent(ComponentTree), if you have a message, you should get the ComponentTree directly from it", + replaceWith = ReplaceWith( + expression = "setComponents(components.toList().toDefaultComponentTree())", + imports = arrayOf("dev.minn.jda.ktx.interactions.components.toDefaultComponentTree") + ) + ) + fun setComponents(components: Iterable) { + return setComponents(components.toList().toDefaultComponentTree()) + } + fun setComponents(componentTree: ComponentTree<*>) { val newIds = TIntHashSet().apply { componentTree From 69b8d0fcb1ba3a001f0874855ff2bf31b2a591e9 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:07:55 +0200 Subject: [PATCH 07/21] Add CV2 test command --- .../test/commands/slash/SlashComponentsV2.kt | 331 ++++++++++++++++++ BotCommands-core/src/test/resources/rust.webp | Bin 0 -> 350000 bytes 2 files changed, 331 insertions(+) create mode 100644 BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt create mode 100644 BotCommands-core/src/test/resources/rust.webp diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt new file mode 100644 index 000000000..e10969e04 --- /dev/null +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt @@ -0,0 +1,331 @@ +package io.github.freya022.botcommands.test.commands.slash + +import dev.freya02.botcommands.jda.ktx.components.SelectOption +import dev.freya02.botcommands.jda.ktx.coroutines.await +import dev.freya02.botcommands.jda.ktx.messages.Embed +import dev.freya02.botcommands.jda.ktx.messages.reply_ +import dev.freya02.botcommands.jda.ktx.rgb +import io.github.freya022.botcommands.api.commands.annotations.Command +import io.github.freya022.botcommands.api.commands.application.ApplicationCommand +import io.github.freya022.botcommands.api.commands.application.slash.GuildSlashEvent +import io.github.freya022.botcommands.api.commands.application.slash.annotations.JDASlashCommand +import io.github.freya022.botcommands.api.commands.application.slash.annotations.TopLevelSlashCommandData +import io.github.freya022.botcommands.api.components.Buttons +import io.github.freya022.botcommands.api.components.SelectMenus +import io.github.freya022.botcommands.api.core.utils.readResource +import net.dv8tion.jda.api.components.actionrow.ActionRow +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent +import net.dv8tion.jda.api.components.container.Container +import net.dv8tion.jda.api.components.container.ContainerChildComponent +import net.dv8tion.jda.api.components.filedisplay.FileDisplay +import net.dv8tion.jda.api.components.mediagallery.MediaGallery +import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem +import net.dv8tion.jda.api.components.section.Section +import net.dv8tion.jda.api.components.section.SectionAccessoryComponent +import net.dv8tion.jda.api.components.section.SectionContentComponent +import net.dv8tion.jda.api.components.separator.Separator +import net.dv8tion.jda.api.components.textdisplay.TextDisplay +import net.dv8tion.jda.api.components.thumbnail.Thumbnail +import net.dv8tion.jda.api.interactions.IntegrationType +import net.dv8tion.jda.api.interactions.InteractionContextType +import net.dv8tion.jda.api.utils.FileUpload + +@Command +class SlashComponentsV2( + private val buttons: Buttons, + private val selectMenus: SelectMenus, +) : ApplicationCommand() { + + private val kotlinIcon = FileUpload.fromData(readResource("/emojis/kotlin.png"), "kotlin.png") + private val rustAnimation = FileUpload.fromData(readResource("/rust.webp"), "rust.webp") + + @TopLevelSlashCommandData( + contexts = [InteractionContextType.GUILD], + integrationTypes = [IntegrationType.USER_INSTALL], + ) + @JDASlashCommand(name = "components_v2", description = "Yippie") + suspend fun onSlashComponentsV2(event: GuildSlashEvent) { + val ephemeral = true + +// event.reply_("ok", ephemeral = true) +// .await() +// .retrieveOriginal() +// .await() +// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) +// .setContent(null) +// .useComponentsV2() +// .await() +// +// event.messageChannel.sendMessage("CV1") +// .awaitAndLog() +// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) +// .setContent(null) +// .useComponentsV2() +// .awaitAndLogCatching() + +// event.messageChannel.sendMessageComponents(MediaGallery { +// +item(rustAnimation) +// }).useComponentsV2().awaitAndLog() + +// event.messageChannel.sendMessage("CV1 (will be fully replaced)") +// .awaitAndLog() +// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) +// .useComponentsV2() +// .setReplace(true) +// .awaitAndLogCatching() + +// event.messageChannel.sendMessageComponents(TextDisplay("CV2")) +// .useComponentsV2() +// .awaitAndLog() +// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) +// .useComponentsV2() +// .awaitAndLogCatching() +// +// event.messageChannel.sendMessageComponents(TextDisplay("CV2 (will be fully replaced)")) +// .useComponentsV2() +// .awaitAndLog() +// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) +// .useComponentsV2() +// .setAttachments() +// .awaitAndLogCatching() + +// return + + event.replyComponents( + Container(accentColor = rgb(0, 255, 0)) { + +MediaGallery { + +url("https://cdn.discordapp.com/attachments/964253122547552349/1336440069892083712/7Q3S.gif") + +file(rustAnimation) + } + + +Section( + accessory = Thumbnail(kotlinIcon) + ) { + +TextDisplay("kotlin") + } + + +FileDisplay(FileUpload.fromData("abc".encodeToByteArray(), "abc.txt")) + + +Section( + accessory = buttons.success("Button in a section").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_( + components = listOf(TextDisplay("My reference ID is ${buttonEvent.component.uniqueId}")), + useComponentsV2 = true, + ephemeral = true + ).await() + } + } + ) { + +TextDisplay(""" + # Yippie + This container is built using some very fancy (not rly) abstraction and extension methods. + """.trimIndent()) + } + + +Separator(isDivider = true, spacing = Separator.Spacing.LARGE) + + +Section( + accessory = Thumbnail("https://cdn.discordapp.com/attachments/556235929443106828/1339901053813919764/wires.png") + ) { + +TextDisplay(""" + And another section with a totally-not-a-rickroll [link](https://www.youtube.com/watch?v=dQw4w9WgXcQ) + -# *and a thumbnail from attachments* + """.trimIndent()) + } + + +ActionRow { + +buttons.link("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Link? ain't no way") + } + +ActionRow { + +selectMenus.stringSelectMenu().ephemeral { + options += SelectOption("foo", "bar") + } + } + +ActionRow { + +buttons.danger("Button").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}") + } + } + +buttons.success("No way... A second one").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}", ephemeral = true).await() + } + } + } + } + ).useComponentsV2().setEphemeral(ephemeral).queue() + + event.hook.sendFiles(rustAnimation).setEphemeral(ephemeral).queue() + event.hook.sendMessageEmbeds(Embed { + image = "attachment://rust.webp" + }).addFiles(rustAnimation).setEphemeral(ephemeral).queue() + } +} + +// TODO remove all of those +abstract class InlineComponentWithChildren { + var components = arrayListOf() + + operator fun T.unaryPlus() { + components += this + } + + operator fun Collection.unaryPlus() { + components += this + } +} + +class InlineThumbnail( + private val factory: () -> Thumbnail, + var uniqueId: Int?, + var description: String?, + var spoiler: Boolean, +) { + + fun build(): Thumbnail { + var thumbnail = factory() + .withSpoiler(spoiler) + .withDescription(description) + if (uniqueId != null) + thumbnail = thumbnail.withUniqueId(uniqueId!!) + return thumbnail + } +} + +fun Thumbnail(url: String, uniqueId: Int? = null, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = + InlineThumbnail({ Thumbnail.fromUrl(url) }, uniqueId, description, spoiler).apply(block).build() + +fun Thumbnail(file: FileUpload, uniqueId: Int? = null, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = + InlineThumbnail({ Thumbnail.fromFile(file) }, uniqueId, description, spoiler).apply(block).build() + +class InlineFileDisplay( + private val factory: () -> FileDisplay, + var uniqueId: Int?, + var spoiler: Boolean, +) { + + fun build(): FileDisplay { + var fileDisplay = factory() + .withSpoiler(spoiler) + if (uniqueId != null) + fileDisplay = fileDisplay.withUniqueId(uniqueId!!) + return fileDisplay + } +} + +fun FileDisplay(file: FileUpload, uniqueId: Int? = null, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = + InlineFileDisplay({ FileDisplay.fromFile(file) }, uniqueId, spoiler).apply(block).build() + +interface InlineActionRowChildComponentContainer + +class InlineActionRow( + var uniqueId: Int?, +) : InlineComponentWithChildren(), InlineActionRowChildComponentContainer { + + fun build(): ActionRow { + var row = ActionRow.of(components) + if (uniqueId != null) + row = row.withUniqueId(uniqueId!!) + return row + } +} + +inline fun ActionRow(uniqueId: Int? = null, block: InlineActionRow.() -> Unit): ActionRow = + InlineActionRow(uniqueId).apply(block).build() + +class InlineSeparator( + var isDivider: Boolean, + var spacing: Separator.Spacing, + var uniqueId: Int?, +) { + + fun build(): Separator { + var separator = Separator.create(isDivider, spacing) + if (uniqueId != null) + separator = separator.withUniqueId(uniqueId!!) + return separator + } +} + +inline fun Separator(isDivider: Boolean, spacing: Separator.Spacing, uniqueId: Int? = null, block: InlineSeparator.() -> Unit = {}): Separator = + InlineSeparator(isDivider, spacing, uniqueId).apply(block).build() + +class InlineTextDisplay( + var content: String, + var uniqueId: Int?, +) { + + fun build(): TextDisplay { + var textDisplay = TextDisplay.of(content) + if (uniqueId != null) + textDisplay = textDisplay.withUniqueId(uniqueId!!) + return textDisplay + } +} + +inline fun TextDisplay(content: String, uniqueId: Int? = null, block: InlineTextDisplay.() -> Unit = {}): TextDisplay = + InlineTextDisplay(content, uniqueId).apply(block).build() + +interface InlineSectionComponentContainer { + +} + +class InlineSection( + var uniqueId: Int?, + var accessory: SectionAccessoryComponent, +) : InlineComponentWithChildren(), InlineSectionComponentContainer { + + fun build(): Section { + var section = Section.of(accessory, components) + if (uniqueId != null) + section = section.withUniqueId(uniqueId!!) + return section + } +} + +inline fun Section(accessory: SectionAccessoryComponent, uniqueId: Int? = null, block: InlineSection.() -> Unit): Section = + InlineSection(uniqueId, accessory).apply(block).build() + +interface InlineMediaGalleryComponentContainer { + fun url(url: String): MediaGalleryItem = MediaGalleryItem.fromUrl(url) + + fun file(file: FileUpload): MediaGalleryItem = MediaGalleryItem.fromFile(file) +} + +class InlineMediaGallery( + var uniqueId: Int?, +) : InlineComponentWithChildren(), InlineMediaGalleryComponentContainer { + + fun build(): MediaGallery { + var gallery = MediaGallery.of(components) + if (uniqueId != null) + gallery = gallery.withUniqueId(uniqueId!!) + return gallery + } +} + +inline fun MediaGallery(uniqueId: Int? = null, block: InlineMediaGallery.() -> Unit): MediaGallery { + return InlineMediaGallery(uniqueId).apply(block).build() +} + +class InlineContainer( + var uniqueId: Int?, + var accentColor: Int?, + var spoiler: Boolean, +) : InlineComponentWithChildren() { + + fun build(): Container { + var container = Container.of(components) + if (uniqueId != null) + container = container.withUniqueId(uniqueId!!) + if (accentColor != null) + container = container.withAccentColor(accentColor!!) + container.withSpoiler(spoiler) + return container + } +} + +inline fun Container(uniqueId: Int? = null, accentColor: Int? = null, spoiler: Boolean = false, block: InlineContainer.() -> Unit): Container = + InlineContainer(uniqueId, accentColor, spoiler).apply(block).build() diff --git a/BotCommands-core/src/test/resources/rust.webp b/BotCommands-core/src/test/resources/rust.webp new file mode 100644 index 0000000000000000000000000000000000000000..f7b70a3743c0d8679dbc88aa36004280aaf37ceb GIT binary patch literal 350000 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�N%acO-lYP8-Go)(!$iX~Tgx>i|U z_{v}YDs&0@lr4ZbZO%*&|w zqbms#>jBzg45}k>dAA!3DVwcbIQC9Z@JxE`l zpQ=Pcae;A8;OiYAR*;|OwjQrw59|B|t7*~TjZZrd8 zXs@I$WEUHjWuE}6Np$fPJtK{&G7c%K_;PSGd5)VD_b@{1#cM?U@e?Qq1A2Ce>M-f= zFO~c}0=jyVEDgA9KN@p7ol?XgE6&THJ(c=u+dpf0X2ZaDK|2{@#%;}Qe@uP%Tz*rK znmsr_?T0Fn*?cfZVtK_zGHWBUmCRx+~!{24__AVuVrQq))PWZ(P~Asr7C9TN5-!l-Jqz7e$1FrFZ#BWmO>3=6NG) zvF^E2f>OF@DXSxdND}Yg53{uN_Qh>SQV&fKgkvN^BF{3UwE9-60HK$g^uMC{=hJPc ze?+ZZijnhwTa#4EYn7nzAT^{yz|e-6Al8P&MOPGx-6iKJuPCJA%HH7|p_1k3SHgR| zyV88xCl9dXnX|@wusG8gJ|pwAm-bqh>H2G9^%u4S=yHA1$=3|UE>nYy+d|o2W8K#F zYDE+iTbHipg^6wWl!`oF*7nQP%BxQ|*Bl^vT0psLX;*yOqVM3JqHKNu6ChCaFM|iu zKeTODQVb%l`;Ew9Sk3!INP^lZSf)8?iZxV3QfT&qKi7uf6*H?wOWCgo*Ek67<4E+K zjE{=LbyjPUAAuD;E<2VX>9LXYOFBFP+jUYber#H9T>F`XNgJiZ!cOuJeAh4DJ^e@{ zH%1>1(>$^W&wf*uLs7x}8{6X|&rh6<`LdU(qg2Yn|MP8r$LGXLgP~pXG=8WUkYB>+ z(loWVzEiS?eA!|aaqeOzo7n$p4E}QbB=jj21;(No_#20NeTe~ zj1T%P<|nOJ!Qgbbm@Y2N*TPI-wnXv7!r^Y`*~-L#^Zao$$nR-Leo+%yM|=;UqV1q> zhwIc`!>#2lz&Un1ek=}_>{80$(GUv{F^>tr*!0E4Fq6#CxM-THWDn7|0)~Vj9HHDr zsobQ~@Bx#e!wxqHVdep5VZhxs-4Ve5=a4Yk?

6VB_o-bpba(=m|D9$@cipoN*~g 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%0DDQK!gHCPuf$-~rYdTCX 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 Date: Fri, 23 May 2025 14:57:37 +0200 Subject: [PATCH 08/21] Update MessageContextDeleteIncluding to use CV2 DSL --- .../test/commands/message/MessageContextDeleteIncluding.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt index 6a88eaf78..bd20a32f3 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt @@ -44,9 +44,8 @@ class MessageContextDeleteIncluding( event.hook.send { content = "This will delete ${messagesToDelete.size} messages up until ${messagesToDelete.last().jumpUrl}" - // TODO use CV2 DSL for the ActionRow - components += row( - buttons.danger("Delete").ephemeral { + components += ActionRow { + +buttons.danger("Delete").ephemeral { singleUse = true bindTo { buttonEvent -> @@ -65,7 +64,7 @@ class MessageContextDeleteIncluding( .await() } } - ) + } }.queue() } } From f3a13e39d30af0c829ff0d6f296d10efc6ae3846 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 23:23:24 +0200 Subject: [PATCH 09/21] Add missing component overrides --- .../freya022/botcommands/api/components/Button.kt | 8 ++++++++ .../botcommands/api/components/EntitySelectMenu.kt | 2 ++ .../botcommands/api/components/StringSelectMenu.kt | 2 ++ .../botcommands/internal/components/ButtonImpl.kt | 11 +++++++++++ .../internal/components/EntitySelectMenuImpl.kt | 4 ++++ .../internal/components/StringSelectMenuImpl.kt | 4 ++++ 6 files changed, 31 insertions(+) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt index 86d84fefd..2b213c691 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/Button.kt @@ -3,6 +3,7 @@ package io.github.freya022.botcommands.api.components import io.github.freya022.botcommands.api.components.event.ButtonEvent import net.dv8tion.jda.api.components.buttons.Button as JDAButton import net.dv8tion.jda.api.components.buttons.ButtonStyle +import net.dv8tion.jda.api.entities.SkuSnowflake import net.dv8tion.jda.api.entities.emoji.Emoji interface Button : JDAButton, @@ -13,12 +14,19 @@ interface Button : JDAButton, override fun asEnabled(): Button = withDisabled(false) + override fun withUniqueId(uniqueId: Int): Button + + override fun withCustomId(customId: String): Button + override fun withDisabled(disabled: Boolean): Button override fun withEmoji(emoji: Emoji?): Button override fun withLabel(label: String): Button + override fun withSku(sku: SkuSnowflake): Nothing = + throw UnsupportedOperationException("This type of button cannot contain SKUs") + @Deprecated("Replaced with withCustomId(id)", ReplaceWith("withCustomId(id)")) override fun withId(id: String): Nothing = throw UnsupportedOperationException("This type of button cannot contain custom IDs") diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt index f4f77413a..952a536a0 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt @@ -11,6 +11,8 @@ interface EntitySelectMenu : JDAEntitySelectMenu, override fun asDisabled(): EntitySelectMenu = withDisabled(true) + override fun withUniqueId(uniqueId: Int): EntitySelectMenu + override fun withDisabled(disabled: Boolean): EntitySelectMenu @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt index b5fbca9b0..fd3591b63 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt @@ -11,6 +11,8 @@ interface StringSelectMenu : JDAStringSelectMenu, override fun asDisabled(): StringSelectMenu = withDisabled(true) + override fun withUniqueId(uniqueId: Int): StringSelectMenu + override fun withDisabled(disabled: Boolean): StringSelectMenu @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt index 7c97f1ef7..37f1f4cde 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/ButtonImpl.kt @@ -8,6 +8,7 @@ import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponentUnion import net.dv8tion.jda.api.components.buttons.Button as JDAButton import net.dv8tion.jda.api.components.buttons.ButtonStyle import net.dv8tion.jda.api.components.section.SectionAccessoryComponentUnion +import net.dv8tion.jda.api.entities.SkuSnowflake import net.dv8tion.jda.api.entities.emoji.Emoji internal class ButtonImpl internal constructor( @@ -20,6 +21,14 @@ internal class ButtonImpl internal constructor( ActionRowChildComponentUnion, SectionAccessoryComponentUnion { + override fun withUniqueId(uniqueId: Int): ButtonImpl { + return ButtonImpl(componentController, internalId, super.withUniqueId(uniqueId)) + } + + override fun withCustomId(customId: String): ButtonImpl { + return ButtonImpl(componentController, internalId, super.withCustomId(customId)) + } + override fun withDisabled(disabled: Boolean): ButtonImpl { return ButtonImpl(componentController, internalId, super.withDisabled(disabled)) } @@ -40,6 +49,8 @@ internal class ButtonImpl internal constructor( override fun getUrl(): String? = null + override fun getSku(): SkuSnowflake? = null + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt index 1fe91c52e..050e43c2e 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/EntitySelectMenuImpl.kt @@ -15,6 +15,10 @@ internal class EntitySelectMenuImpl internal constructor( JDAEntitySelectMenu by selectMenu, ActionRowChildComponentUnion { + override fun withUniqueId(uniqueId: Int): EntitySelectMenuImpl { + return EntitySelectMenuImpl(componentController, internalId, selectMenu.withUniqueId(uniqueId)) + } + override fun withDisabled(disabled: Boolean): EntitySelectMenuImpl { return EntitySelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt index 36ef38c00..e633d939a 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/internal/components/StringSelectMenuImpl.kt @@ -15,6 +15,10 @@ internal class StringSelectMenuImpl internal constructor( JDAStringSelectMenu by selectMenu, ActionRowChildComponentUnion { + override fun withUniqueId(uniqueId: Int): StringSelectMenuImpl { + return StringSelectMenuImpl(componentController, internalId, selectMenu.withUniqueId(uniqueId)) + } + override fun withDisabled(disabled: Boolean): StringSelectMenuImpl { return StringSelectMenuImpl(componentController, internalId, super.withDisabled(disabled)) } From 17de0e9290744408b3d454605bcefbcc1ed86e21 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 20 Jul 2025 23:27:26 +0200 Subject: [PATCH 10/21] Test components override super methods that returns their declaring class --- .../arch/ComponentConsistencyTest.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/arch/ComponentConsistencyTest.kt diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/arch/ComponentConsistencyTest.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/arch/ComponentConsistencyTest.kt new file mode 100644 index 000000000..a3939ab71 --- /dev/null +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/arch/ComponentConsistencyTest.kt @@ -0,0 +1,66 @@ +package io.github.freya022.botcommands.arch + +import io.github.classgraph.* +import net.dv8tion.jda.api.components.Component +import kotlin.test.Test +import kotlin.test.fail + +class ComponentConsistencyTest { + + @Test + fun `Test components override super methods if they return their declaring class`() { + val messages = arrayListOf() + + ClassGraph() + .acceptPackages("io.github.freya022.botcommands", "dev.freya02.botcommands") + .rejectPackages("*.internal.*") + .enableMethodInfo() + .scan() + .use { scan -> + for (componentInfo in scan.getClassesImplementing(Component::class.java)) { + val supertypeMethodsReturningDeclClass = componentInfo.allSupertypes + .flatMap { it.methodInfo } + .filter { !it.isStatic } + .filter { it.isRootDeclaration() } + .filter { (it.typeSignatureOrTypeDescriptor.resultType as? ClassRefTypeSignature)?.classInfo == it.classInfo } + + for (supertypeMethodReturningDeclClass in supertypeMethodsReturningDeclClass) { + val declaredMethod = componentInfo.getDeclaredMethodInfo(supertypeMethodReturningDeclClass.name) + .find { it.getParameterTypes() == supertypeMethodReturningDeclClass.getParameterTypes() } + + if (declaredMethod == null) { + messages += "${componentInfo.name} does not override ${supertypeMethodReturningDeclClass.className}#${supertypeMethodReturningDeclClass.name}" + continue + } + + val resultType = declaredMethod.typeSignatureOrTypeDescriptor.resultType as? ClassRefTypeSignature + if (resultType?.isClassOrNothing(componentInfo) != true) { + messages += "${declaredMethod.className}#${declaredMethod.name} must override return type with ${declaredMethod.className}" + continue + } + } + } + } + + if (messages.isNotEmpty()) { + fail(messages.joinToString("\n")) + } + } + + private val ClassInfo.allSupertypes: List + get() = superclasses + interfaces + + private fun MethodInfo.isRootDeclaration(): Boolean { + return classInfo.allSupertypes + .flatMap { it.methodInfo } + .none { it.name == this.name && it.getParameterTypes() == this.getParameterTypes() } + } + + private fun MethodInfo.getParameterTypes(): List { + return parameterInfo.map { it.typeSignatureOrTypeDescriptor } + } + + private fun ClassRefTypeSignature.isClassOrNothing(classInfo: ClassInfo): Boolean { + return this.classInfo == classInfo || this.baseClassName == "java.lang.Void" + } +} From dc4d4d0f38835bb754f52a4c10bb4b78dfee99a8 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 27 Jul 2025 15:17:25 +0200 Subject: [PATCH 11/21] Add ComponentTree extensions --- .../jda/ktx/components/ComponentTree.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ComponentTree.kt diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ComponentTree.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ComponentTree.kt new file mode 100644 index 000000000..76bd50c61 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ComponentTree.kt @@ -0,0 +1,33 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.Component +import net.dv8tion.jda.api.components.IComponentUnion +import net.dv8tion.jda.api.components.tree.ComponentTree +import kotlin.jvm.optionals.getOrNull + +inline fun Collection.toComponentTree(): ComponentTree = + ComponentTree.of(T::class.java, this) + +/** + * Creates a [ComponentTree] of [IComponentUnion] from this collection. + */ +fun Collection.toDefaultComponentTree(): ComponentTree = + ComponentTree.of(this) + +/** + * Finds all components of type [T], recursively. + */ +inline fun ComponentTree<*>.findAll(): List = + findAll(T::class.java) + +/** + * Finds all components of type [T] satisfying the [filter], recursively. + */ +inline fun ComponentTree.findAll(crossinline filter: (T) -> Boolean): List = + findAll(T::class.java) { filter(it) } + +/** + * Finds the first component of type [T] satisfying the [filter], recursively. + */ +inline fun ComponentTree<*>.find(crossinline filter: (T) -> Boolean): T? = + find(T::class.java) { filter(it) }.getOrNull() From 047f0ac06425594464ff5e9d1ca0afff870e905d Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 27 Jul 2025 15:21:59 +0200 Subject: [PATCH 12/21] Add DSLs for new components --- .../message/MessageContextDeleteIncluding.kt | 3 +- .../test/commands/slash/SlashComponentsV2.kt | 334 +++--------------- .../jda/ktx/components/ActionRow.kt | 39 +- .../jda/ktx/components/Container.kt | 183 ++++++++++ .../jda/ktx/components/FileDisplay.kt | 64 ++++ .../jda/ktx/components/InlineComponent.kt | 25 ++ .../jda/ktx/components/MediaGallery.kt | 78 ++++ .../jda/ktx/components/MediaGalleryItem.kt | 66 ++++ .../botcommands/jda/ktx/components/Section.kt | 70 ++++ .../jda/ktx/components/Separator.kt | 57 +++ .../jda/ktx/components/TextDisplay.kt | 53 +++ .../jda/ktx/components/Thumbnail.kt | 79 +++++ .../jda/ktx/components/utils/InitChecks.kt | 11 + .../botcommands/jda/ktx/messages/Editing.kt | 13 +- .../botcommands/jda/ktx/messages/Messages.kt | 152 +++++++- .../botcommands/jda/ktx/messages/Sending.kt | 13 +- 16 files changed, 943 insertions(+), 297 deletions(-) create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/InlineComponent.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGalleryItem.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Separator.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/TextDisplay.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Thumbnail.kt create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/utils/InitChecks.kt diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt index bd20a32f3..a7456b786 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextDeleteIncluding.kt @@ -13,7 +13,6 @@ import io.github.freya022.botcommands.api.commands.application.context.annotatio import io.github.freya022.botcommands.api.commands.application.context.annotations.JDAMessageCommand import io.github.freya022.botcommands.api.commands.application.context.message.GuildMessageEvent import io.github.freya022.botcommands.api.components.Buttons -import io.github.freya022.botcommands.test.commands.slash.ActionRow import kotlinx.coroutines.future.await import kotlinx.datetime.Clock import kotlinx.datetime.toJavaInstant @@ -44,7 +43,7 @@ class MessageContextDeleteIncluding( event.hook.send { content = "This will delete ${messagesToDelete.size} messages up until ${messagesToDelete.last().jumpUrl}" - components += ActionRow { + actionRow { +buttons.danger("Delete").ephemeral { singleUse = true diff --git a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt index e10969e04..4e6fa6b28 100644 --- a/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt +++ b/BotCommands-core/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashComponentsV2.kt @@ -1,10 +1,12 @@ package io.github.freya022.botcommands.test.commands.slash +import dev.freya02.botcommands.jda.ktx.components.Container import dev.freya02.botcommands.jda.ktx.components.SelectOption +import dev.freya02.botcommands.jda.ktx.components.TextDisplay +import dev.freya02.botcommands.jda.ktx.components.Thumbnail import dev.freya02.botcommands.jda.ktx.coroutines.await -import dev.freya02.botcommands.jda.ktx.messages.Embed +import dev.freya02.botcommands.jda.ktx.hex import dev.freya02.botcommands.jda.ktx.messages.reply_ -import dev.freya02.botcommands.jda.ktx.rgb import io.github.freya022.botcommands.api.commands.annotations.Command import io.github.freya022.botcommands.api.commands.application.ApplicationCommand import io.github.freya022.botcommands.api.commands.application.slash.GuildSlashEvent @@ -13,19 +15,7 @@ import io.github.freya022.botcommands.api.commands.application.slash.annotations import io.github.freya022.botcommands.api.components.Buttons import io.github.freya022.botcommands.api.components.SelectMenus import io.github.freya022.botcommands.api.core.utils.readResource -import net.dv8tion.jda.api.components.actionrow.ActionRow -import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent -import net.dv8tion.jda.api.components.container.Container -import net.dv8tion.jda.api.components.container.ContainerChildComponent -import net.dv8tion.jda.api.components.filedisplay.FileDisplay -import net.dv8tion.jda.api.components.mediagallery.MediaGallery -import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem -import net.dv8tion.jda.api.components.section.Section -import net.dv8tion.jda.api.components.section.SectionAccessoryComponent -import net.dv8tion.jda.api.components.section.SectionContentComponent import net.dv8tion.jda.api.components.separator.Separator -import net.dv8tion.jda.api.components.textdisplay.TextDisplay -import net.dv8tion.jda.api.components.thumbnail.Thumbnail import net.dv8tion.jda.api.interactions.IntegrationType import net.dv8tion.jda.api.interactions.InteractionContextType import net.dv8tion.jda.api.utils.FileUpload @@ -47,285 +37,77 @@ class SlashComponentsV2( suspend fun onSlashComponentsV2(event: GuildSlashEvent) { val ephemeral = true -// event.reply_("ok", ephemeral = true) -// .await() -// .retrieveOriginal() -// .await() -// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) -// .setContent(null) -// .useComponentsV2() -// .await() -// -// event.messageChannel.sendMessage("CV1") -// .awaitAndLog() -// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) -// .setContent(null) -// .useComponentsV2() -// .awaitAndLogCatching() - -// event.messageChannel.sendMessageComponents(MediaGallery { -// +item(rustAnimation) -// }).useComponentsV2().awaitAndLog() - -// event.messageChannel.sendMessage("CV1 (will be fully replaced)") -// .awaitAndLog() -// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) -// .useComponentsV2() -// .setReplace(true) -// .awaitAndLogCatching() - -// event.messageChannel.sendMessageComponents(TextDisplay("CV2")) -// .useComponentsV2() -// .awaitAndLog() -// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) -// .useComponentsV2() -// .awaitAndLogCatching() -// -// event.messageChannel.sendMessageComponents(TextDisplay("CV2 (will be fully replaced)")) -// .useComponentsV2() -// .awaitAndLog() -// .editMessageComponents(MediaGallery.of(MediaGalleryItem.fromFile(rustAnimation))) -// .useComponentsV2() -// .setAttachments() -// .awaitAndLogCatching() - -// return - - event.replyComponents( - Container(accentColor = rgb(0, 255, 0)) { - +MediaGallery { - +url("https://cdn.discordapp.com/attachments/964253122547552349/1336440069892083712/7Q3S.gif") - +file(rustAnimation) - } + val container = Container(accentColor = hex("00FF00")) { + mediaGallery { + item("https://cdn.discordapp.com/attachments/964253122547552349/1336440069892083712/7Q3S.gif") + item(rustAnimation) + } - +Section( - accessory = Thumbnail(kotlinIcon) - ) { - +TextDisplay("kotlin") - } + section( + accessory = Thumbnail(kotlinIcon) + ) { + textDisplay("kotlin") + } - +FileDisplay(FileUpload.fromData("abc".encodeToByteArray(), "abc.txt")) + fileDisplay(FileUpload.fromData("abc".encodeToByteArray(), "abc.txt")) - +Section( - accessory = buttons.success("Button in a section").ephemeral { - bindTo { buttonEvent -> - buttonEvent.reply_( - components = listOf(TextDisplay("My reference ID is ${buttonEvent.component.uniqueId}")), - useComponentsV2 = true, - ephemeral = true - ).await() - } + section( + accessory = buttons.success("Button in a section").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_( + components = listOf(TextDisplay("My reference ID is ${buttonEvent.component.uniqueId}")), + useComponentsV2 = true, + ephemeral = true, + ).await() } - ) { - +TextDisplay(""" + } + ) { + textDisplay(""" # Yippie - This container is built using some very fancy (not rly) abstraction and extension methods. + This container is fancy. """.trimIndent()) - } + } - +Separator(isDivider = true, spacing = Separator.Spacing.LARGE) + separator(spacing = Separator.Spacing.LARGE) - +Section( - accessory = Thumbnail("https://cdn.discordapp.com/attachments/556235929443106828/1339901053813919764/wires.png") - ) { - +TextDisplay(""" + section( + accessory = Thumbnail("https://cdn.discordapp.com/attachments/556235929443106828/1339901053813919764/wires.png") + ) { + textDisplay(""" And another section with a totally-not-a-rickroll [link](https://www.youtube.com/watch?v=dQw4w9WgXcQ) -# *and a thumbnail from attachments* """.trimIndent()) - } + } - +ActionRow { - +buttons.link("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Link? ain't no way") + actionRow { + +buttons.link("https://www.youtube.com/watch?v=dQw4w9WgXcQ", "Link? ain't no way") + } + actionRow { + +selectMenus.stringSelectMenu().ephemeral { + options += SelectOption("foo", "bar") } - +ActionRow { - +selectMenus.stringSelectMenu().ephemeral { - options += SelectOption("foo", "bar") + } + actionRow { + +buttons.danger("Button").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}") } } - +ActionRow { - +buttons.danger("Button").ephemeral { - bindTo { buttonEvent -> - buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}") - } - } - +buttons.success("No way... A second one").ephemeral { - bindTo { buttonEvent -> - buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}", ephemeral = true).await() - } + +buttons.success("No way... A second one").ephemeral { + bindTo { buttonEvent -> + buttonEvent.reply_("My reference ID is ${buttonEvent.component.uniqueId}", ephemeral = true).await() } } } - ).useComponentsV2().setEphemeral(ephemeral).queue() - - event.hook.sendFiles(rustAnimation).setEphemeral(ephemeral).queue() - event.hook.sendMessageEmbeds(Embed { - image = "attachment://rust.webp" - }).addFiles(rustAnimation).setEphemeral(ephemeral).queue() + } + event.replyComponents(container) + .useComponentsV2() + .setEphemeral(ephemeral) + .queue() + +// event.hook.sendFiles(rustAnimation).setEphemeral(ephemeral).queue() +// event.hook.sendMessageEmbeds(Embed { +// image = "attachment://rust.webp" +// }).addFiles(rustAnimation).setEphemeral(ephemeral).queue() } } - -// TODO remove all of those -abstract class InlineComponentWithChildren { - var components = arrayListOf() - - operator fun T.unaryPlus() { - components += this - } - - operator fun Collection.unaryPlus() { - components += this - } -} - -class InlineThumbnail( - private val factory: () -> Thumbnail, - var uniqueId: Int?, - var description: String?, - var spoiler: Boolean, -) { - - fun build(): Thumbnail { - var thumbnail = factory() - .withSpoiler(spoiler) - .withDescription(description) - if (uniqueId != null) - thumbnail = thumbnail.withUniqueId(uniqueId!!) - return thumbnail - } -} - -fun Thumbnail(url: String, uniqueId: Int? = null, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = - InlineThumbnail({ Thumbnail.fromUrl(url) }, uniqueId, description, spoiler).apply(block).build() - -fun Thumbnail(file: FileUpload, uniqueId: Int? = null, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = - InlineThumbnail({ Thumbnail.fromFile(file) }, uniqueId, description, spoiler).apply(block).build() - -class InlineFileDisplay( - private val factory: () -> FileDisplay, - var uniqueId: Int?, - var spoiler: Boolean, -) { - - fun build(): FileDisplay { - var fileDisplay = factory() - .withSpoiler(spoiler) - if (uniqueId != null) - fileDisplay = fileDisplay.withUniqueId(uniqueId!!) - return fileDisplay - } -} - -fun FileDisplay(file: FileUpload, uniqueId: Int? = null, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = - InlineFileDisplay({ FileDisplay.fromFile(file) }, uniqueId, spoiler).apply(block).build() - -interface InlineActionRowChildComponentContainer - -class InlineActionRow( - var uniqueId: Int?, -) : InlineComponentWithChildren(), InlineActionRowChildComponentContainer { - - fun build(): ActionRow { - var row = ActionRow.of(components) - if (uniqueId != null) - row = row.withUniqueId(uniqueId!!) - return row - } -} - -inline fun ActionRow(uniqueId: Int? = null, block: InlineActionRow.() -> Unit): ActionRow = - InlineActionRow(uniqueId).apply(block).build() - -class InlineSeparator( - var isDivider: Boolean, - var spacing: Separator.Spacing, - var uniqueId: Int?, -) { - - fun build(): Separator { - var separator = Separator.create(isDivider, spacing) - if (uniqueId != null) - separator = separator.withUniqueId(uniqueId!!) - return separator - } -} - -inline fun Separator(isDivider: Boolean, spacing: Separator.Spacing, uniqueId: Int? = null, block: InlineSeparator.() -> Unit = {}): Separator = - InlineSeparator(isDivider, spacing, uniqueId).apply(block).build() - -class InlineTextDisplay( - var content: String, - var uniqueId: Int?, -) { - - fun build(): TextDisplay { - var textDisplay = TextDisplay.of(content) - if (uniqueId != null) - textDisplay = textDisplay.withUniqueId(uniqueId!!) - return textDisplay - } -} - -inline fun TextDisplay(content: String, uniqueId: Int? = null, block: InlineTextDisplay.() -> Unit = {}): TextDisplay = - InlineTextDisplay(content, uniqueId).apply(block).build() - -interface InlineSectionComponentContainer { - -} - -class InlineSection( - var uniqueId: Int?, - var accessory: SectionAccessoryComponent, -) : InlineComponentWithChildren(), InlineSectionComponentContainer { - - fun build(): Section { - var section = Section.of(accessory, components) - if (uniqueId != null) - section = section.withUniqueId(uniqueId!!) - return section - } -} - -inline fun Section(accessory: SectionAccessoryComponent, uniqueId: Int? = null, block: InlineSection.() -> Unit): Section = - InlineSection(uniqueId, accessory).apply(block).build() - -interface InlineMediaGalleryComponentContainer { - fun url(url: String): MediaGalleryItem = MediaGalleryItem.fromUrl(url) - - fun file(file: FileUpload): MediaGalleryItem = MediaGalleryItem.fromFile(file) -} - -class InlineMediaGallery( - var uniqueId: Int?, -) : InlineComponentWithChildren(), InlineMediaGalleryComponentContainer { - - fun build(): MediaGallery { - var gallery = MediaGallery.of(components) - if (uniqueId != null) - gallery = gallery.withUniqueId(uniqueId!!) - return gallery - } -} - -inline fun MediaGallery(uniqueId: Int? = null, block: InlineMediaGallery.() -> Unit): MediaGallery { - return InlineMediaGallery(uniqueId).apply(block).build() -} - -class InlineContainer( - var uniqueId: Int?, - var accentColor: Int?, - var spoiler: Boolean, -) : InlineComponentWithChildren() { - - fun build(): Container { - var container = Container.of(components) - if (uniqueId != null) - container = container.withUniqueId(uniqueId!!) - if (accentColor != null) - container = container.withAccentColor(accentColor!!) - container.withSpoiler(spoiler) - return container - } -} - -inline fun Container(uniqueId: Int? = null, accentColor: Int? = null, spoiler: Boolean = false, block: InlineContainer.() -> Unit): Container = - InlineContainer(uniqueId, accentColor, spoiler).apply(block).build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt index a3f85d649..0fb466881 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt @@ -3,12 +3,49 @@ package dev.freya02.botcommands.jda.ktx.components import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx import net.dv8tion.jda.api.components.actionrow.ActionRow import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent +import net.dv8tion.jda.api.components.buttons.Button + +private val DUMMY_ROW = ActionRow.of(Button.success("id", "label")) + +class InlineActionRow : InlineComponentWithChildren { + + private var row = DUMMY_ROW + + override var uniqueId: Int + get() = row.uniqueId + set(value) { + row = row.withUniqueId(value) + } + + override val components = mutableListOf() + + fun build(): ActionRow { + return row.withComponents(components) + } +} + +/** + * See [ActionRow][net.dv8tion.jda.api.components.actionrow.ActionRow]. + * + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see ActionRowChildComponent + */ +inline fun ActionRow(uniqueId: Int = -1, block: InlineActionRow.() -> Unit): ActionRow = + InlineActionRow() + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + block() + } + .build() /** * Construct an [ActionRow] from the provided components */ @ReplaceJdaKtx -fun row(vararg components: ActionRowChildComponent) = ActionRow.of(*components) +fun row(component: ActionRowChildComponent, vararg components: ActionRowChildComponent) = ActionRow.of(component, *components) /** * Construct an [ActionRow] from the provided components diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt new file mode 100644 index 000000000..ef20d4859 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt @@ -0,0 +1,183 @@ +package dev.freya02.botcommands.jda.ktx.components + +import dev.freya02.botcommands.jda.ktx.hex +import dev.freya02.botcommands.jda.ktx.hsb +import dev.freya02.botcommands.jda.ktx.rgb +import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent +import net.dv8tion.jda.api.components.container.Container +import net.dv8tion.jda.api.components.container.ContainerChildComponent +import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem +import net.dv8tion.jda.api.components.section.SectionAccessoryComponent +import net.dv8tion.jda.api.components.section.SectionContentComponent +import net.dv8tion.jda.api.components.separator.Separator +import net.dv8tion.jda.api.components.textdisplay.TextDisplay +import net.dv8tion.jda.api.utils.FileUpload +import java.awt.Color + +private val DUMMY_CONTAINER = Container.of(TextDisplay.of("a")) + +class InlineContainer : InlineComponentWithChildren { + + private var container = DUMMY_CONTAINER + + override var uniqueId: Int + get() = container.uniqueId + set(value) { + container = container.withUniqueId(value) + } + + /** Color of the container's left side, you can use [rgb], [hsb] or [hex] for it */ + var accentColorRaw: Int? + get() = container.accentColorRaw + set(value) { + container = container.withAccentColor(value) + } + + /** Color of the container's left side, you can use [rgb], [hsb] or [hex] for it */ + var accentColor: Color? + get() = container.accentColor + set(value) { + container = container.withAccentColor(value) + } + + /** Hides the file until the user clicks on it */ + var spoiler: Boolean + get() = container.isSpoiler + set(value) { + container = container.withSpoiler(value) + } + + override val components = mutableListOf() + + inline fun actionRow( + vararg components: ActionRowChildComponent, + uniqueId: Int = -1, + block: InlineActionRow.() -> Unit = {}, + ) { + this.components += ActionRow(uniqueId) { + this.components += components + block() + } + } + + inline fun actionRow( + components: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineActionRow.() -> Unit = {}, + ) { + this.components += ActionRow(uniqueId) { + this.components += components + block() + } + } + + inline fun section( + accessory: SectionAccessoryComponent? = null, + vararg components: SectionContentComponent, + uniqueId: Int = -1, + block: InlineSection.() -> Unit = {}, + ) { + this.components += Section(accessory, uniqueId) { + this.components += components + block() + } + } + + inline fun section( + accessory: SectionAccessoryComponent? = null, + components: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineSection.() -> Unit = {}, + ) { + this.components += Section(accessory, uniqueId) { + this.components += components + block() + } + } + + inline fun textDisplay( + content: String? = null, + uniqueId: Int = -1, + block: InlineTextDisplay.() -> Unit = {}, + ) { + this.components += TextDisplay(content, uniqueId, block) + } + + inline fun mediaGallery( + vararg items: MediaGalleryItem, + uniqueId: Int = -1, + block: InlineMediaGallery.() -> Unit = {}, + ) { + this.components += MediaGallery(uniqueId) { + this.items += items + block() + } + } + + inline fun mediaGallery( + items: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineMediaGallery.() -> Unit = {}, + ) { + this.components += MediaGallery(uniqueId) { + this.items += items + block() + } + } + + inline fun separator( + uniqueId: Int = -1, + isDivider: Boolean = true, + spacing: Separator.Spacing = Separator.Spacing.SMALL, + block: InlineSeparator.() -> Unit = {}, + ) { + this.components += Separator(uniqueId, isDivider, spacing, block) + } + + fun fileDisplay( + file: FileUpload, + uniqueId: Int = -1, + spoiler: Boolean = false, + block: InlineFileDisplay.() -> Unit = {}, + ) { + this.components += FileDisplay(file, uniqueId, spoiler, block) + } + + fun fileDisplay( + fileName: String, + uniqueId: Int = -1, + spoiler: Boolean = false, + block: InlineFileDisplay.() -> Unit = {}, + ) { + this.components += FileDisplay(fileName, uniqueId, spoiler, block) + } + + fun build(): Container { + return container.withComponents(components) + } +} + +/** + * See [Container][net.dv8tion.jda.api.components.container.Container]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param accentColor Color of the container's left side, you can use [rgb], [hsb] or [hex] for it + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + * + * @see ContainerChildComponent + */ +inline fun Container(uniqueId: Int = -1, accentColor: Int? = null, spoiler: Boolean = false, block: InlineContainer.() -> Unit): Container = + InlineContainer() + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (accentColor != null) + this.accentColorRaw = accentColor + if (spoiler) + this.spoiler = true + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt new file mode 100644 index 000000000..02df473f7 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt @@ -0,0 +1,64 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.filedisplay.FileDisplay +import net.dv8tion.jda.api.utils.FileUpload + +class InlineFileDisplay( + private var fileDisplay: FileDisplay, +) : InlineComponent { + + override var uniqueId: Int + get() = fileDisplay.uniqueId + set(value) { + fileDisplay = fileDisplay.withUniqueId(value) + } + + /** Hides the file until the user clicks on it */ + var spoiler: Boolean + get() = fileDisplay.isSpoiler + set(value) { + fileDisplay = fileDisplay.withSpoiler(value) + } + + fun build(): FileDisplay = fileDisplay +} + +/** + * See [FileDisplay.fromFile]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ +fun FileDisplay(file: FileUpload, uniqueId: Int = -1, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = + InlineFileDisplay(FileDisplay.fromFile(file)) + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (spoiler) + this.spoiler = true + block() + } + .build() + +/** + * See [FileDisplay.fromFileName]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ +fun FileDisplay(fileName: String, uniqueId: Int = -1, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = + InlineFileDisplay(FileDisplay.fromFileName(fileName)) + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (spoiler) + this.spoiler = true + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/InlineComponent.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/InlineComponent.kt new file mode 100644 index 000000000..87c9d7b6b --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/InlineComponent.kt @@ -0,0 +1,25 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.Component + +@DslMarker +internal annotation class InlineComponentDSL + +@InlineComponentDSL +internal interface InlineComponent { + /** Unique identifier of this component, see [Component.withUniqueId] */ + var uniqueId: Int +} + +internal interface InlineComponentWithChildren : InlineComponent { + + val components: MutableList + + operator fun T.unaryPlus() { + components += this + } + + operator fun Collection.unaryPlus() { + components += this + } +} diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt new file mode 100644 index 000000000..2272b4546 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt @@ -0,0 +1,78 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.mediagallery.MediaGallery +import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem +import net.dv8tion.jda.api.utils.FileUpload + +private val DUMMY_MEDIA_GALLERY = MediaGallery.of(MediaGalleryItem.fromUrl("https://github.com")) + +class InlineMediaGallery : InlineComponent { + + private var mediaGallery = DUMMY_MEDIA_GALLERY + + override var uniqueId: Int + get() = mediaGallery.uniqueId + set(value) { + mediaGallery = mediaGallery.withUniqueId(value) + } + + val items = mutableListOf() + + operator fun MediaGalleryItem.unaryPlus() { + this@InlineMediaGallery.items += this + } + + operator fun plusAssign(item: MediaGalleryItem) { + this.items += item + } + + operator fun plusAssign(items: Collection) { + this.items += items + } + + /** + * Add an item to this gallery, see [MediaGalleryItem.fromUrl]. + * + * @param url The URL of the image to display + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][MediaGalleryItem.MAX_DESCRIPTION_LENGTH] characters + * @param spoiler Hides the item until the user clicks on it + * @param block Lambda allowing further configuration + */ + inline fun item(url: String, description: String? = null, spoiler: Boolean = false, block: InlineMediaGalleryItem.() -> Unit = {}) { + items += MediaGalleryItem(url, description, spoiler, block) + } + + /** + * Add an item to this gallery, see [MediaGalleryItem.fromFile]. + * + * @param file The image to display + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][MediaGalleryItem.MAX_DESCRIPTION_LENGTH] characters + * @param spoiler Hides the item until the user clicks on it + * @param block Lambda allowing further configuration + */ + inline fun item(file: FileUpload, description: String? = null, spoiler: Boolean = false, block: InlineMediaGalleryItem.() -> Unit = {}) { + items += MediaGalleryItem(file, description, spoiler, block) + } + + fun build(): MediaGallery { + return mediaGallery.withItems(items) + } +} + +/** + * See [MediaGallery][net.dv8tion.jda.api.components.mediagallery.MediaGallery]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ +inline fun MediaGallery(uniqueId: Int = -1, block: InlineMediaGallery.() -> Unit): MediaGallery { + return InlineMediaGallery() + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + block() + } + .build() +} diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGalleryItem.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGalleryItem.kt new file mode 100644 index 000000000..bb6516448 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGalleryItem.kt @@ -0,0 +1,66 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem +import net.dv8tion.jda.api.utils.FileUpload + +@InlineComponentDSL +class InlineMediaGalleryItem( + private var item: MediaGalleryItem, +) { + + /** Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][MediaGalleryItem.MAX_DESCRIPTION_LENGTH] characters */ + var description: String? + get() = item.description + set(value) { + item = item.withDescription(value) + } + + /** Hides the item until the user clicks on it */ + var spoiler: Boolean + get() = item.isSpoiler + set(value) { + item = item.withSpoiler(value) + } + + fun build(): MediaGalleryItem = item +} + +/** + * See [MediaGalleryItem.fromUrl]. + * + * @param url The URL of the image to display + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][MediaGalleryItem.MAX_DESCRIPTION_LENGTH] characters + * @param spoiler Hides the item until the user clicks on it + * @param block Lambda allowing further configuration + */ +inline fun MediaGalleryItem(url: String, description: String? = null, spoiler: Boolean = false, block: InlineMediaGalleryItem.() -> Unit = {}): MediaGalleryItem { + return InlineMediaGalleryItem(MediaGalleryItem.fromUrl(url)) + .apply { + if (description != null) + this.description = description + if (spoiler) + this.spoiler = true + block() + } + .build() +} + +/** + * See [MediaGalleryItem.fromFile]. + * + * @param file The image to display + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][MediaGalleryItem.MAX_DESCRIPTION_LENGTH] characters + * @param spoiler Hides the item until the user clicks on it + * @param block Lambda allowing further configuration + */ +inline fun MediaGalleryItem(file: FileUpload, description: String? = null, spoiler: Boolean = false, block: InlineMediaGalleryItem.() -> Unit = {}): MediaGalleryItem { + return InlineMediaGalleryItem(MediaGalleryItem.fromFile(file)) + .apply { + if (description != null) + this.description = description + if (spoiler) + this.spoiler = true + block() + } + .build() +} diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt new file mode 100644 index 000000000..507117e00 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt @@ -0,0 +1,70 @@ +package dev.freya02.botcommands.jda.ktx.components + +import dev.freya02.botcommands.jda.ktx.components.utils.checkInit +import net.dv8tion.jda.api.components.buttons.Button +import net.dv8tion.jda.api.components.section.Section +import net.dv8tion.jda.api.components.section.SectionAccessoryComponent +import net.dv8tion.jda.api.components.section.SectionContentComponent +import net.dv8tion.jda.api.components.textdisplay.TextDisplay + +private val DUMMY_SECTION = Section.of(Button.success("id", "label"), TextDisplay.of("a")) + +class InlineSection : InlineComponentWithChildren { + + private var section = DUMMY_SECTION + + override var uniqueId: Int + get() = section.uniqueId + set(value) { + section = section.withUniqueId(value) + } + + private var _accessory: SectionAccessoryComponent? = null + /** The accessory of this section */ + var accessory: SectionAccessoryComponent + get() = _accessory.checkInit("accessory") + set(value) { + _accessory = value + section = section.withAccessory(value) + } + + val hasAccessory: Boolean get() = _accessory != null + + override val components = mutableListOf() + + inline fun textDisplay( + content: String? = null, + uniqueId: Int = -1, + block: InlineTextDisplay.() -> Unit = {}, + ) { + this.components += TextDisplay(content, uniqueId, block) + } + + fun build(): Section { + accessory.checkInit() + return section.withContentComponents(components) + } +} + +/** + * See [Section][net.dv8tion.jda.api.components.section.Section]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param accessory The accessory of this section + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see SectionContentComponent + * @see SectionAccessoryComponent + */ +inline fun Section(accessory: SectionAccessoryComponent? = null, uniqueId: Int = -1, block: InlineSection.() -> Unit): Section = + InlineSection() + .apply { + if (accessory != null) + this.accessory = accessory + if (uniqueId != -1) + this.uniqueId = uniqueId + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Separator.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Separator.kt new file mode 100644 index 000000000..72cb499a1 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Separator.kt @@ -0,0 +1,57 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.separator.Separator +import net.dv8tion.jda.api.components.separator.Separator.Spacing + +// Use default values of factory function +private val DUMMY_SEPARATOR = Separator.create(true, Spacing.SMALL) + +class InlineSeparator : InlineComponent { + + private var separator = DUMMY_SEPARATOR + + override var uniqueId: Int + get() = separator.uniqueId + set(value) { + separator = separator.withUniqueId(value) + } + + /** `true` if the separator should be visible */ + var isDivider: Boolean + get() = separator.isDivider + set(value) { + separator = separator.withDivider(value) + } + + /** The amount of spacing this separator should provide */ + var spacing: Spacing + get() = separator.spacing + set(value) { + separator = separator.withSpacing(value) + } + + fun build(): Separator = separator +} + +/** + * See [Separator][net.dv8tion.jda.api.components.separator.Separator]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param isDivider `true` if the separator should be visible + * @param spacing The amount of spacing this separator should provide + * @param block Lambda allowing further configuration + */ +inline fun Separator(uniqueId: Int = -1, isDivider: Boolean = true, spacing: Spacing = Spacing.SMALL, block: InlineSeparator.() -> Unit = {}): Separator = + InlineSeparator() + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (!isDivider) + this.isDivider = false + if (spacing != Spacing.SMALL) + this.spacing = spacing + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/TextDisplay.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/TextDisplay.kt new file mode 100644 index 000000000..c43218e51 --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/TextDisplay.kt @@ -0,0 +1,53 @@ +package dev.freya02.botcommands.jda.ktx.components + +import dev.freya02.botcommands.jda.ktx.components.utils.checkInit +import net.dv8tion.jda.api.components.textdisplay.TextDisplay + +private val DUMMY_TEXT_DISPLAY = TextDisplay.of("a") + +class InlineTextDisplay : InlineComponent { + + private var textDisplay = DUMMY_TEXT_DISPLAY + + override var uniqueId: Int + get() = textDisplay.uniqueId + set(value) { + textDisplay = textDisplay.withUniqueId(value) + } + + private var _content: String? = null + /** The content displayed by this component */ + var content: String + get() = _content.checkInit("content") + set(value) { + textDisplay = textDisplay.withContent(value) + _content = value + } + + val hasContent: Boolean get() = _content != null + + fun build(): TextDisplay { + content.checkInit() + return textDisplay + } +} + +/** + * See [TextDisplay][net.dv8tion.jda.api.components.textdisplay.TextDisplay]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param content The content displayed by this component + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ +inline fun TextDisplay(content: String? = null, uniqueId: Int = -1, block: InlineTextDisplay.() -> Unit = {}): TextDisplay = + InlineTextDisplay() + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (content != null) + this.content = content + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Thumbnail.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Thumbnail.kt new file mode 100644 index 000000000..712937e9a --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Thumbnail.kt @@ -0,0 +1,79 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.thumbnail.Thumbnail +import net.dv8tion.jda.api.utils.FileUpload + +class InlineThumbnail( + private var thumbnail: Thumbnail, +) : InlineComponent { + + override var uniqueId: Int + get() = thumbnail.uniqueId + set(value) { + thumbnail = thumbnail.withUniqueId(value) + } + + /** Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][net.dv8tion.jda.api.components.thumbnail.Thumbnail.MAX_DESCRIPTION_LENGTH] characters */ + var description: String? + get() = thumbnail.description + set(value) { + thumbnail = thumbnail.withDescription(value) + } + + /** Hides the thumbnail until the user clicks on it */ + var spoiler: Boolean + get() = thumbnail.isSpoiler + set(value) { + thumbnail = thumbnail.withSpoiler(value) + } + + fun build(): Thumbnail = thumbnail +} + +/** + * See [Thumbnail.fromUrl]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param url The URL of the image to display + * @param uniqueId Unique identifier of this component + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][net.dv8tion.jda.api.components.thumbnail.Thumbnail.MAX_DESCRIPTION_LENGTH] characters + * @param spoiler Hides the thumbnail until the user clicks on it + * @param block Lambda allowing further configuration + */ +fun Thumbnail(url: String, uniqueId: Int = -1, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = + InlineThumbnail(Thumbnail.fromUrl(url)) + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (description != null) + this.description = description + if (spoiler) + this.spoiler = true + block() + } + .build() + +/** + * See [Thumbnail.fromFile]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param file The image to display + * @param uniqueId Unique identifier of this component + * @param description Known as an "alternative text", must not exceed [MAX_DESCRIPTION_LENGTH][net.dv8tion.jda.api.components.thumbnail.Thumbnail.MAX_DESCRIPTION_LENGTH] characters. + * @param spoiler Hides the thumbnail until the user clicks on it + * @param block Lambda allowing further configuration + */ +fun Thumbnail(file: FileUpload, uniqueId: Int = -1, description: String? = null, spoiler: Boolean = false, block: InlineThumbnail.() -> Unit = {}): Thumbnail = + InlineThumbnail(Thumbnail.fromFile(file)) + .apply { + if (uniqueId != -1) + this.uniqueId = uniqueId + if (description != null) + this.description = description + if (spoiler) + this.spoiler = true + block() + } + .build() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/utils/InitChecks.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/utils/InitChecks.kt new file mode 100644 index 000000000..5b1950a2c --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/utils/InitChecks.kt @@ -0,0 +1,11 @@ +package dev.freya02.botcommands.jda.ktx.components.utils + +internal fun T?.checkInit(name: String): T { + if (this == null) throw UninitializedPropertyAccessException("$name is not initialized") + return this +} + +@Suppress("UnusedReceiverParameter") +internal fun Any.checkInit() { + // Nothing, supposed to be used on non-backing properties with lateinit/nullable backers +} diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt index 84ecc0e86..5a9ee2707 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Editing.kt @@ -11,6 +11,7 @@ import net.dv8tion.jda.api.requests.restaction.MessageEditAction import net.dv8tion.jda.api.requests.restaction.WebhookMessageEditAction import net.dv8tion.jda.api.requests.restaction.interactions.MessageEditCallbackAction import net.dv8tion.jda.api.utils.AttachedFile +import net.dv8tion.jda.api.utils.messages.MessageRequest /** * Same as [IMessageEditCallback.editMessage]. @@ -31,9 +32,10 @@ inline fun IMessageEditCallback.editMessage_( embeds: Collection? = null, components: Collection? = null, files: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, -): MessageEditCallbackAction = editMessage(MessageEdit(content, embeds, components, files, mentions = null, replace, block)) +): MessageEditCallbackAction = editMessage(MessageEdit(content, embeds, components, useComponentsV2, files, mentions = null, replace, block)) /** * Same as [InteractionHook.editMessageById]. @@ -55,9 +57,10 @@ inline fun InteractionHook.editMessage( embeds: Collection? = null, components: Collection? = null, files: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, -): WebhookMessageEditAction = editMessageById(id, MessageEdit(content, embeds, components, files, mentions = null, replace, block)) +): WebhookMessageEditAction = editMessageById(id, MessageEdit(content, embeds, components, useComponentsV2, files, mentions = null, replace, block)) /** * Same as [MessageChannel.editMessageById]. @@ -79,9 +82,10 @@ inline fun MessageChannel.editMessage( embeds: Collection? = null, components: Collection? = null, files: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, -): MessageEditAction = editMessageById(id, MessageEdit(content, embeds, components, files, mentions = null, replace, block)) +): MessageEditAction = editMessageById(id, MessageEdit(content, embeds, components, useComponentsV2, files, mentions = null, replace, block)) /** * Same as [Message.editMessage]. @@ -101,6 +105,7 @@ inline fun Message.edit( embeds: Collection? = null, components: Collection? = null, files: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), replace: Boolean = false, block: InlineMessageEdit.() -> Unit = {}, -): MessageEditAction = editMessage(MessageEdit(content, embeds, components, files, mentions = null, replace, block)) +): MessageEditAction = editMessage(MessageEdit(content, embeds, components, useComponentsV2, files, mentions = null, replace, block)) diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt index dc6234b13..60b889d89 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt @@ -3,10 +3,15 @@ package dev.freya02.botcommands.jda.ktx.messages import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx -import dev.freya02.botcommands.jda.ktx.components.row +import dev.freya02.botcommands.jda.ktx.components.* import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.components.MessageTopLevelComponent import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent +import net.dv8tion.jda.api.components.container.ContainerChildComponent +import net.dv8tion.jda.api.components.mediagallery.MediaGalleryItem +import net.dv8tion.jda.api.components.section.SectionAccessoryComponent +import net.dv8tion.jda.api.components.section.SectionContentComponent +import net.dv8tion.jda.api.components.separator.Separator import net.dv8tion.jda.api.entities.Message.MentionType import net.dv8tion.jda.api.entities.MessageEmbed import net.dv8tion.jda.api.entities.Role @@ -40,7 +45,7 @@ inline fun MessageCreateBuilder( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, - // TODO useComponentsV2 + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, @@ -55,6 +60,7 @@ inline fun MessageCreateBuilder( setComponents(components) if (tts) setTTS(true) + useComponentsV2(useComponentsV2) mentions.applyOn(this) InlineMessage(this).apply(builder) @@ -66,7 +72,7 @@ inline fun MessageCreate( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, - // TODO useComponentsV2 + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, @@ -75,6 +81,7 @@ inline fun MessageCreate( embeds, files, components, + useComponentsV2, tts, mentions, builder @@ -98,6 +105,7 @@ inline fun MessageEditBuilder( content: String? = null, embeds: Collection? = null, components: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), files: Collection? = null, mentions: Mentions? = null, replace: Boolean = false, @@ -107,6 +115,7 @@ inline fun MessageEditBuilder( if (embeds != null) setEmbeds(embeds) if (components != null) setComponents(components) if (files != null) setAttachments(files) + useComponentsV2(useComponentsV2) mentions?.applyOn(this) isReplace = replace InlineMessage(this).apply(builder) @@ -128,6 +137,7 @@ inline fun MessageEdit( content: String? = null, embeds: Collection? = null, components: Collection? = null, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), files: Collection? = null, mentions: Mentions? = null, replace: Boolean = false, @@ -136,6 +146,7 @@ inline fun MessageEdit( content, embeds, components, + useComponentsV2, files, mentions, replace, @@ -182,14 +193,135 @@ class InlineMessage(val builder: AbstractMessageBuilder) { embeds += InlineEmbed(EmbedBuilder(embed)).apply(builder).build() } - val components = Accumulator() // TODO TopLevelMessageComponent + val components = Accumulator() - fun actionRow(vararg components: ActionRowChildComponent) { - this.components += row(*components) + inline fun actionRow( + vararg components: ActionRowChildComponent, + uniqueId: Int = -1, + block: InlineActionRow.() -> Unit = {}, + ) { + this.components += ActionRow(uniqueId) { + this.components += components + block() + } + } + + inline fun actionRow( + components: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineActionRow.() -> Unit = {}, + ) { + this.components += ActionRow(uniqueId) { + this.components += components + block() + } + } + + inline fun section( + accessory: SectionAccessoryComponent? = null, + vararg components: SectionContentComponent, + uniqueId: Int = -1, + block: InlineSection.() -> Unit = {}, + ) { + this.components += Section(accessory, uniqueId) { + this.components += components + block() + } + } + + inline fun section( + accessory: SectionAccessoryComponent? = null, + components: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineSection.() -> Unit = {}, + ) { + this.components += Section(accessory, uniqueId) { + this.components += components + block() + } + } + + inline fun textDisplay( + content: String? = null, + uniqueId: Int = -1, + block: InlineTextDisplay.() -> Unit = {}, + ) { + this.components += TextDisplay(content, uniqueId, block) + } + + inline fun mediaGallery( + vararg items: MediaGalleryItem, + uniqueId: Int = -1, + block: InlineMediaGallery.() -> Unit = {}, + ) { + this.components += MediaGallery(uniqueId) { + this.items += items + block() + } + } + + inline fun mediaGallery( + items: Collection = emptyList(), + uniqueId: Int = -1, + block: InlineMediaGallery.() -> Unit = {}, + ) { + this.components += MediaGallery(uniqueId) { + this.items += items + block() + } + } + + inline fun separator( + uniqueId: Int = -1, + isDivider: Boolean = true, + spacing: Separator.Spacing = Separator.Spacing.SMALL, + block: InlineSeparator.() -> Unit = {}, + ) { + this.components += Separator(uniqueId, isDivider, spacing, block) + } + + fun fileDisplay( + file: FileUpload, + uniqueId: Int = -1, + spoiler: Boolean = false, + block: InlineFileDisplay.() -> Unit = {}, + ) { + this.components += FileDisplay(file, uniqueId, spoiler, block) + } + + fun fileDisplay( + fileName: String, + uniqueId: Int = -1, + spoiler: Boolean = false, + block: InlineFileDisplay.() -> Unit = {}, + ) { + this.components += FileDisplay(fileName, uniqueId, spoiler, block) + } + + inline fun container( + vararg components: ContainerChildComponent, + uniqueId: Int = -1, + accentColor: Int? = null, + spoiler: Boolean = false, + block: InlineContainer.() -> Unit = {}, + ) { + this.components += Container(uniqueId, accentColor, spoiler) { + this.components += components + block() + } } - fun actionRow(components: Collection) { - this.components += components.row() + inline fun container( + components: Collection = emptyList(), + uniqueId: Int = -1, + accentColor: Int? = null, + spoiler: Boolean = false, + block: InlineContainer.() -> Unit = {}, + ) { + this.components += Container(uniqueId, accentColor, spoiler) { + this.components += components + block() + } } var allowedMentionTypes: Set = MessageRequest.getDefaultMentions() @@ -360,7 +492,7 @@ class Accumulator internal constructor() { internal var hasItems: Boolean = false private set - operator fun plusAssign(items: Collection) { + operator fun plusAssign(items: Iterable) { hasItems = true _items += items } @@ -370,7 +502,7 @@ class Accumulator internal constructor() { _items += item } - operator fun minusAssign(items: Collection) { + operator fun minusAssign(items: Iterable) { hasItems = true _items -= items } diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt index f90a39444..ef451b3ed 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Sending.kt @@ -11,6 +11,7 @@ import net.dv8tion.jda.api.requests.restaction.MessageCreateAction import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction import net.dv8tion.jda.api.utils.FileUpload +import net.dv8tion.jda.api.utils.messages.MessageRequest /** * @see IReplyCallback.reply @@ -21,11 +22,12 @@ inline fun IReplyCallback.reply_( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), ephemeral: Boolean = false, builder: InlineMessageCreate.() -> Unit = {}, -): ReplyCallbackAction = reply(MessageCreate(content, embeds, files, components, tts, mentions, builder)).setEphemeral(ephemeral) +): ReplyCallbackAction = reply(MessageCreate(content, embeds, files, components, useComponentsV2, tts, mentions, builder)).setEphemeral(ephemeral) /** * @see InteractionHook.sendMessage @@ -36,11 +38,12 @@ inline fun InteractionHook.send( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), ephemeral: Boolean = false, builder: InlineMessageCreate.() -> Unit = {}, -): WebhookMessageCreateAction = sendMessage(MessageCreate(content, embeds, files, components, tts, mentions, builder)).setEphemeral(ephemeral) +): WebhookMessageCreateAction = sendMessage(MessageCreate(content, embeds, files, components, useComponentsV2, tts, mentions, builder)).setEphemeral(ephemeral) /** * @see MessageChannel.sendMessage @@ -51,10 +54,11 @@ inline fun MessageChannel.send( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, -): MessageCreateAction = sendMessage(MessageCreate(content, embeds, files, components, tts, mentions, builder)) +): MessageCreateAction = sendMessage(MessageCreate(content, embeds, files, components, useComponentsV2, tts, mentions, builder)) /** * @see MessageChannel.sendMessage @@ -66,7 +70,8 @@ inline fun Message.reply_( embeds: Collection = NO_CONTENT, files: Collection = NO_CONTENT, components: Collection = NO_CONTENT, + useComponentsV2: Boolean = MessageRequest.isDefaultUseComponentsV2(), tts: Boolean = false, mentions: Mentions = Mentions.default(), builder: InlineMessageCreate.() -> Unit = {}, -): MessageCreateAction = channel.sendMessage(MessageCreate(content, embeds, files, components, tts, mentions, builder)).setMessageReference(this) +): MessageCreateAction = channel.sendMessage(MessageCreate(content, embeds, files, components, useComponentsV2, tts, mentions, builder)).setMessageReference(this) From 0d38193345d5b2c3e9726242c652a5ed099bc571 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sun, 27 Jul 2025 17:45:40 +0200 Subject: [PATCH 13/21] Update KSP snapshot 'RangesCompat.kt' changed due to JDA 6 package changes --- .../src/test/resources/ksp_snapshot.zip | Bin 17452 -> 17446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/BotCommands-jda-ktx/src/test/resources/ksp_snapshot.zip b/BotCommands-jda-ktx/src/test/resources/ksp_snapshot.zip index 93f555853a186174f4ab8ef2503053b1404092df..0a3b1dbe34643c4af030063a9894e99244608d9b 100644 GIT binary patch delta 1343 zcmZ3}!MLo0kte{LnMH&F1d?Y=h}>ljBEP$Xi_zjpr{3$}ktRR|G zf(fjiSMoSBZ}N;kQCE&^wvAGIYB>HUkQ9yBkrl)F5&Z0WQ~nt7VpEV^4AU(H>itLS8Q%Oc=~M*jLa7rOQp zTUE2AsyF4w2xh!4yJE2Q7~c`y4_CRHYc7U1ME;1Z zR!fDFRawu4N}s=*tkdmjGPaVF2OBE+b@ z#zCQlr>&GN*4gN~Zc%|$jDqHt-7iJ?n;#_x@B|gdKc1ZF^}yzxoKoc#yP{B~4lCwn z-?Lt4{LkHMo%ttU+_LDU%7;bif7gHI^z?ix>ce&7VL@P2MPRYX4K7COS5Jpx8P&Em{5zGXsOS)8vB&YMYnn@PlJ}tHDWdY&RJ5 zfef8I!Nic&UCXQH;p7jF@*sidCKjyk7kVHBTurS}1(umQp$hPsd7}!{n}wqa{4tA0 z6{s~&VEu6d$rfgdG*|~hwBZQfs?WzvZ;<@-jJA-M@@hxeey&07LpmE0MEW@)VPZ26+1<{-mOknlA zlE;~Ok2L;?de6wOoXp6;@N)7)nV|ZEeoTe}d%tU|RU0$}@u+WhbP7v;)W}_7XlR&f z%{?`D_qO0B!+*Q)I;n8UZJF-3-1z<8J?1MzdVkuO^g6${jx;#9_{^>z(?v1es!f|} zR%VEb?J4@9rq}MgZ$n7b+SZBly4^lrvU<`O@>Vi<*T%jB3WYm&Dy8z)PgLsFbbjGd zfAd?-oz7-9-pY3ykJXmXJEb}6L#s;R=JbDVa{{h!dFnSqb(@08;p+=zPDS2keE2Z^ z{mhMy>yIyB=htRg+jGg$*@anm+wQ2_2^=}B(t+$>6cm0vTp+?$W>gs?zu}~=+hH$9 z4Qrl97ccI;wl@33va)8O6HKm?4qZAMS7@*G&i!cpg0(!Rb~Aa-U4Hj4rQb|totJB1 z`hyKCT|0lCyt&(A@_*fV%G3Rr&VO6;f2&<`Y#1x^Vx}Ssl~dgdvO4pw>~2W1`S-QD$X3?yo-%+e6H%~wp`fHxXx?3OOHhGX^J1uHhRpr)$T?Q7=wyZ=IIAvMJ z>Ysz8BF(A-ZY)>}i**I6ibdA7taZDPw7A-ouy%4FS$p563)LO{wnYd5v>ak&mxVA+ z0WHLtP*b(lSX|=fr6y1_lmZ1_oaSWGz!CH`>Rr z&VGojT4;ueG`I9AXfj0XxV3AZyn>U}|~}Oiey0X4h&0ontfkyr$4( zK1Uw7lc320mp1jdnYVu8>HZ)moCmALU9iXhzWN#-P zRxZbli0G>Y%B4Z%=IKZZa)ASdfq{`hg5mimqzK?}mSI|H05-$JS(Wv>B-9LWSn0CH oe%lTVOk<#*EK&SZGI@iu2i!(c5mq)(*vkUp6n+MVCKC`30Kxqr`2YX_ From 4820350aa821ccc87e1aa3d99cd48c55528b295a Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:50:16 +0200 Subject: [PATCH 14/21] Add link buttons --- .../freya02/botcommands/jda/ktx/components/ActionRow.kt | 6 ++++++ .../dev/freya02/botcommands/jda/ktx/components/Button.kt | 9 +++++++++ 2 files changed, 15 insertions(+) create mode 100644 BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Button.kt diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt index 0fb466881..fbdb4a7bc 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/ActionRow.kt @@ -4,6 +4,8 @@ import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx import net.dv8tion.jda.api.components.actionrow.ActionRow import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent import net.dv8tion.jda.api.components.buttons.Button +import net.dv8tion.jda.api.components.buttons.ButtonStyle +import net.dv8tion.jda.api.entities.emoji.Emoji private val DUMMY_ROW = ActionRow.of(Button.success("id", "label")) @@ -19,6 +21,10 @@ class InlineActionRow : InlineComponentWithChildren { override val components = mutableListOf() + fun link(url: String, label: String? = null, emoji: Emoji? = null, disabled: Boolean = false) { + components += Button.of(ButtonStyle.LINK, url, label, emoji).withDisabled(disabled) + } + fun build(): ActionRow { return row.withComponents(components) } diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Button.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Button.kt new file mode 100644 index 000000000..ac31789fc --- /dev/null +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Button.kt @@ -0,0 +1,9 @@ +package dev.freya02.botcommands.jda.ktx.components + +import net.dv8tion.jda.api.components.buttons.Button +import net.dv8tion.jda.api.components.buttons.ButtonStyle +import net.dv8tion.jda.api.entities.emoji.Emoji + +fun link(url: String, label: String? = null, emoji: Emoji? = null, disabled: Boolean = false): Button { + return Button.of(ButtonStyle.LINK, url, label, emoji).withDisabled(disabled) +} From 8758b34af10ca36a5e063f214e69f651382cf5d8 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:11:28 +0200 Subject: [PATCH 15/21] Fix ModalEvent#get --- .../io/github/freya022/botcommands/api/modals/ModalEvent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt index 993cd168a..cc739c550 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalEvent.kt @@ -47,7 +47,7 @@ class ModalEvent internal constructor( "Can only get modal mapping for modal-compatible components, provided: $component" } - return event.values.first { it.uniqueId == component.uniqueId } + return event.values.first { it.customId == component.customId } ?: throwArgument("No value found, you likely passed an input from another modal, or haven't attached it") } -} \ No newline at end of file +} From aa774f054ce1c9052f9f9d14a6e15cf3ad9be85f Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Mon, 28 Jul 2025 19:29:23 +0200 Subject: [PATCH 16/21] Add AbstractComponentFactory#deleteTree --- .../api/components/AbstractComponentFactory.kt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt index dffac1790..5e5c7d71f 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/AbstractComponentFactory.kt @@ -12,6 +12,7 @@ import io.github.freya022.botcommands.internal.components.controller.ComponentCo import kotlinx.coroutines.runBlocking import net.dv8tion.jda.api.components.ActionComponent import net.dv8tion.jda.api.components.MessageTopLevelComponent +import net.dv8tion.jda.api.components.tree.ComponentTree import javax.annotation.CheckReturnValue abstract class AbstractComponentFactory internal constructor( @@ -128,8 +129,21 @@ abstract class AbstractComponentFactory internal constructor( */ @JvmSynthetic suspend fun deleteRows(components: Collection) = - components.toDefaultComponentTree() - .findAll() + deleteTree(components.toDefaultComponentTree()) + + + @JvmSynthetic + @JvmName("deleteRows") + suspend fun deleteTreeJava(tree: ComponentTree<*>) = + tree.findAll() + .mapNotNull { it.customId } + .mapNotNull { IdentifiableComponent.fromIdOrNull(it) } + .let { deleteComponents(it) } + + + @JvmSynthetic + suspend fun deleteTree(tree: ComponentTree<*>) = + tree.findAll() .mapNotNull { it.customId } .mapNotNull { IdentifiableComponent.fromIdOrNull(it) } .let { deleteComponents(it) } From 4abe6e52efe55cbaf210dd6be726d01f15a595c4 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Sat, 23 Aug 2025 20:15:09 +0200 Subject: [PATCH 17/21] Update to JDA 6.0.0-rc.3 --- .../kotlin/io/github/freya022/botcommands/api/modals/Modal.kt | 4 ++-- .../io/github/freya022/botcommands/api/modals/ModalBuilder.kt | 2 +- .../kotlin/BotCommands-repositories-conventions.gradle.kts | 1 - gradle/libs.versions.toml | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modal.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modal.kt index 68db03720..43521cdae 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modal.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/Modal.kt @@ -3,7 +3,7 @@ package io.github.freya022.botcommands.api.modals import io.github.freya022.botcommands.internal.modals.ModalMaps import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.suspendCancellableCoroutine -import net.dv8tion.jda.api.interactions.modals.Modal as JDAModal +import net.dv8tion.jda.api.modals.Modal as JDAModal class Modal internal constructor(modal: JDAModal, private val modalMaps: ModalMaps) : JDAModal by modal { /** @@ -33,4 +33,4 @@ class Modal internal constructor(modal: JDAModal, private val modalMaps: ModalMa } catch (e: TimeoutCancellationException) { null } -} \ No newline at end of file +} diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalBuilder.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalBuilder.kt index 37359fc70..6e230903e 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalBuilder.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/modals/ModalBuilder.kt @@ -3,7 +3,7 @@ package io.github.freya022.botcommands.api.modals import io.github.freya022.botcommands.api.modals.annotations.ModalData import io.github.freya022.botcommands.api.modals.annotations.ModalHandler import io.github.freya022.botcommands.internal.modals.ModalDSL -import net.dv8tion.jda.api.interactions.modals.Modal as JDAModal +import net.dv8tion.jda.api.modals.Modal as JDAModal import java.time.Duration as JavaDuration import java.util.concurrent.TimeUnit import java.util.function.Consumer diff --git a/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts b/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts index 3cfe85f87..e69b970fb 100644 --- a/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/BotCommands-repositories-conventions.gradle.kts @@ -1,5 +1,4 @@ repositories { mavenCentral() mavenLocal() - maven("https://jitpack.io") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5e84a5ba2..aaa2e3c94 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ h2 = "2.3.232" hikaricp = "6.2.1" jackson = "2.19.1" java-string-similarity = "2.0.0" -jda = "e87771b759" +jda = "6.0.0-rc.3" jda-emojis = "3.0.0" jda-ktx = "0.12.0" jemoji = "1.7.4" @@ -54,7 +54,7 @@ jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", ver jackson-dataformat-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" } jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } java-string-similarity = { module = "info.debatty:java-string-similarity", version.ref = "java-string-similarity" } -jda = { module = "io.github.freya022:JDA", version.ref = "jda" } +jda = { module = "net.dv8tion:JDA", version.ref = "jda" } jda-emojis = { module = "dev.freya02:jda-emojis", version.ref = "jda-emojis" } jda-ktx = { module = "club.minnced:jda-ktx", version.ref = "jda-ktx" } jemoji = { module = "net.fellbaum:jemoji", version.ref = "jemoji" } From 532b74bf50480dcc6c8f6bd67aff3858a2808773 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Tue, 2 Sep 2025 19:32:07 +0200 Subject: [PATCH 18/21] Remove override of `getId()` for select menus Not necessary --- .../freya022/botcommands/api/components/EntitySelectMenu.kt | 3 --- .../freya022/botcommands/api/components/StringSelectMenu.kt | 3 --- 2 files changed, 6 deletions(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt index 952a536a0..10a2a92e5 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/EntitySelectMenu.kt @@ -14,7 +14,4 @@ interface EntitySelectMenu : JDAEntitySelectMenu, override fun withUniqueId(uniqueId: Int): EntitySelectMenu override fun withDisabled(disabled: Boolean): EntitySelectMenu - - @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) - override fun getId(): String = customId } diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt index fd3591b63..9c61d6d8b 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/components/StringSelectMenu.kt @@ -14,7 +14,4 @@ interface StringSelectMenu : JDAStringSelectMenu, override fun withUniqueId(uniqueId: Int): StringSelectMenu override fun withDisabled(disabled: Boolean): StringSelectMenu - - @Deprecated("Replaced with getCustomId()", ReplaceWith("getCustomId()")) - override fun getId(): String = customId } From 0af16dd590ac5aa96112eaa9db132f8b517fbeb6 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Tue, 2 Sep 2025 19:32:23 +0200 Subject: [PATCH 19/21] Migrate jda-ktx import in `ReplaceWith` --- .../freya022/botcommands/api/pagination/UsedComponentSet.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt index d9e5fe5b1..81cb88e34 100644 --- a/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt +++ b/BotCommands-core/src/main/kotlin/io/github/freya022/botcommands/api/pagination/UsedComponentSet.kt @@ -25,7 +25,7 @@ class UsedComponentSet(private val componentsService: Components, private val cl message = "Replaced with setComponent(ComponentTree), if you have a message, you should get the ComponentTree directly from it", replaceWith = ReplaceWith( expression = "setComponents(components.toList().toDefaultComponentTree())", - imports = arrayOf("dev.minn.jda.ktx.interactions.components.toDefaultComponentTree") + imports = arrayOf("dev.freya02.botcommands.jda.ktx.components.toDefaultComponentTree") ) ) fun setComponents(components: Iterable) { From ed9920ec9c4d2dd47719f201f17315e119271b24 Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Tue, 2 Sep 2025 19:32:54 +0200 Subject: [PATCH 20/21] examples: Compare which component was used by custom ID Unique IDs must not be used unless the user has hardcoded one --- .../io/github/freya022/bot/commands/slash/SlashBan.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt b/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt index 7519dabd2..92ac16095 100644 --- a/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt +++ b/BotCommands-core/src/examples/kotlin/io/github/freya022/bot/commands/slash/SlashBan.kt @@ -91,14 +91,14 @@ class SlashBan(private val buttons: Buttons, private val banService: BanService) .queue() } - when (componentEvent.uniqueId) { - cancelButton.uniqueId -> { + when (componentEvent.componentId) { + cancelButton.customId -> { logger.debug { "Ban cancelled for ${target.id}" } componentEvent.replaceLocalized(localizationContext, "outputs.cancelled").queue() //Cancel logic } - confirmButton.uniqueId -> { + confirmButton.customId -> { logger.debug { "Ban confirmed for ${target.id}, $timeframe of messages were deleted, reason: '$reason'" } componentEvent.replaceLocalized( From e825db8c7596fb0983d031340cf3a6432204c74a Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:09:48 +0200 Subject: [PATCH 21/21] Copy docs of component factories to their "inline add" variants --- .../jda/ktx/components/Container.kt | 83 +++++++++++ .../jda/ktx/components/FileDisplay.kt | 14 +- .../jda/ktx/components/MediaGallery.kt | 4 +- .../botcommands/jda/ktx/components/Section.kt | 9 ++ .../botcommands/jda/ktx/messages/Messages.kt | 130 ++++++++++++++++++ 5 files changed, 232 insertions(+), 8 deletions(-) diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt index ef20d4859..f4bbb23ff 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Container.kt @@ -71,6 +71,19 @@ class InlineContainer : InlineComponentWithChildren { } } + /** + * See [Section][net.dv8tion.jda.api.components.section.Section]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param accessory The accessory of this section + * @param components The components of this section + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see SectionContentComponent + * @see SectionAccessoryComponent + */ inline fun section( accessory: SectionAccessoryComponent? = null, vararg components: SectionContentComponent, @@ -83,6 +96,19 @@ class InlineContainer : InlineComponentWithChildren { } } + /** + * See [Section][net.dv8tion.jda.api.components.section.Section]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param accessory The accessory of this section + * @param components The components of this section + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see SectionContentComponent + * @see SectionAccessoryComponent + */ inline fun section( accessory: SectionAccessoryComponent? = null, components: Collection = emptyList(), @@ -95,6 +121,15 @@ class InlineContainer : InlineComponentWithChildren { } } + /** + * See [TextDisplay][net.dv8tion.jda.api.components.textdisplay.TextDisplay]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param content The content displayed by this component + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun textDisplay( content: String? = null, uniqueId: Int = -1, @@ -103,6 +138,15 @@ class InlineContainer : InlineComponentWithChildren { this.components += TextDisplay(content, uniqueId, block) } + /** + * See [MediaGallery][net.dv8tion.jda.api.components.mediagallery.MediaGallery]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param items Items of this media gallery + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun mediaGallery( vararg items: MediaGalleryItem, uniqueId: Int = -1, @@ -114,6 +158,15 @@ class InlineContainer : InlineComponentWithChildren { } } + /** + * See [MediaGallery][net.dv8tion.jda.api.components.mediagallery.MediaGallery]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param items Items of this media gallery + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun mediaGallery( items: Collection = emptyList(), uniqueId: Int = -1, @@ -125,6 +178,16 @@ class InlineContainer : InlineComponentWithChildren { } } + /** + * See [Separator][net.dv8tion.jda.api.components.separator.Separator]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param isDivider `true` if the separator should be visible + * @param spacing The amount of spacing this separator should provide + * @param block Lambda allowing further configuration + */ inline fun separator( uniqueId: Int = -1, isDivider: Boolean = true, @@ -134,6 +197,16 @@ class InlineContainer : InlineComponentWithChildren { this.components += Separator(uniqueId, isDivider, spacing, block) } + /** + * See [FileDisplay.fromFile][net.dv8tion.jda.api.components.filedisplay.FileDisplay.fromFile]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param file The file to attach + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ fun fileDisplay( file: FileUpload, uniqueId: Int = -1, @@ -143,6 +216,16 @@ class InlineContainer : InlineComponentWithChildren { this.components += FileDisplay(file, uniqueId, spoiler, block) } + /** + * See [FileDisplay.fromFileName][net.dv8tion.jda.api.components.filedisplay.FileDisplay.fromFileName]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param fileName Name of the file, you later have to add the file data with a matching name + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ fun fileDisplay( fileName: String, uniqueId: Int = -1, diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt index 02df473f7..f6dfee805 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/FileDisplay.kt @@ -28,9 +28,10 @@ class InlineFileDisplay( * * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. * - * @param uniqueId Unique identifier of this component - * @param spoiler Hides the file until the user clicks on it - * @param block Lambda allowing further configuration + * @param file The file to attach + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration */ fun FileDisplay(file: FileUpload, uniqueId: Int = -1, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = InlineFileDisplay(FileDisplay.fromFile(file)) @@ -48,9 +49,10 @@ fun FileDisplay(file: FileUpload, uniqueId: Int = -1, spoiler: Boolean = false, * * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. * - * @param uniqueId Unique identifier of this component - * @param spoiler Hides the file until the user clicks on it - * @param block Lambda allowing further configuration + * @param fileName Name of the file, you later have to add the file data with a matching name + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration */ fun FileDisplay(fileName: String, uniqueId: Int = -1, spoiler: Boolean = false, block: InlineFileDisplay.() -> Unit = {}): FileDisplay = InlineFileDisplay(FileDisplay.fromFileName(fileName)) diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt index 2272b4546..5eeb54cd6 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/MediaGallery.kt @@ -64,8 +64,8 @@ class InlineMediaGallery : InlineComponent { * * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. * - * @param uniqueId Unique identifier of this component - * @param block Lambda allowing further configuration + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration */ inline fun MediaGallery(uniqueId: Int = -1, block: InlineMediaGallery.() -> Unit): MediaGallery { return InlineMediaGallery() diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt index 507117e00..96d0cec8f 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/components/Section.kt @@ -32,6 +32,15 @@ class InlineSection : InlineComponentWithChildren { override val components = mutableListOf() + /** + * See [TextDisplay][net.dv8tion.jda.api.components.textdisplay.TextDisplay]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param content The content displayed by this component + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun textDisplay( content: String? = null, uniqueId: Int = -1, diff --git a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt index 60b889d89..98bfedb59 100644 --- a/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt +++ b/BotCommands-jda-ktx/src/main/kotlin/dev/freya02/botcommands/jda/ktx/messages/Messages.kt @@ -4,6 +4,9 @@ package dev.freya02.botcommands.jda.ktx.messages import dev.freya02.botcommands.jda.ktx.ReplaceJdaKtx import dev.freya02.botcommands.jda.ktx.components.* +import dev.freya02.botcommands.jda.ktx.hex +import dev.freya02.botcommands.jda.ktx.hsb +import dev.freya02.botcommands.jda.ktx.rgb import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.components.MessageTopLevelComponent import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent @@ -195,6 +198,15 @@ class InlineMessage(val builder: AbstractMessageBuilder) { val components = Accumulator() + /** + * See [ActionRow][net.dv8tion.jda.api.components.actionrow.ActionRow]. + * + * @param components Components of this row + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see ActionRowChildComponent + */ inline fun actionRow( vararg components: ActionRowChildComponent, uniqueId: Int = -1, @@ -206,6 +218,15 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [ActionRow][net.dv8tion.jda.api.components.actionrow.ActionRow]. + * + * @param components Components of this row + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see ActionRowChildComponent + */ inline fun actionRow( components: Collection = emptyList(), uniqueId: Int = -1, @@ -217,6 +238,19 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [Section][net.dv8tion.jda.api.components.section.Section]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param accessory The accessory of this section + * @param components The components of this section + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see SectionContentComponent + * @see SectionAccessoryComponent + */ inline fun section( accessory: SectionAccessoryComponent? = null, vararg components: SectionContentComponent, @@ -229,6 +263,19 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [Section][net.dv8tion.jda.api.components.section.Section]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param accessory The accessory of this section + * @param components The components of this section + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + * + * @see SectionContentComponent + * @see SectionAccessoryComponent + */ inline fun section( accessory: SectionAccessoryComponent? = null, components: Collection = emptyList(), @@ -241,6 +288,15 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [TextDisplay][net.dv8tion.jda.api.components.textdisplay.TextDisplay]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param content The content displayed by this component + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun textDisplay( content: String? = null, uniqueId: Int = -1, @@ -249,6 +305,15 @@ class InlineMessage(val builder: AbstractMessageBuilder) { this.components += TextDisplay(content, uniqueId, block) } + /** + * See [MediaGallery][net.dv8tion.jda.api.components.mediagallery.MediaGallery]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param items Items of this media gallery + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun mediaGallery( vararg items: MediaGalleryItem, uniqueId: Int = -1, @@ -260,6 +325,15 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [MediaGallery][net.dv8tion.jda.api.components.mediagallery.MediaGallery]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param items Items of this media gallery + * @param uniqueId Unique identifier of this component + * @param block Lambda allowing further configuration + */ inline fun mediaGallery( items: Collection = emptyList(), uniqueId: Int = -1, @@ -271,6 +345,16 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [Separator][net.dv8tion.jda.api.components.separator.Separator]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param uniqueId Unique identifier of this component + * @param isDivider `true` if the separator should be visible + * @param spacing The amount of spacing this separator should provide + * @param block Lambda allowing further configuration + */ inline fun separator( uniqueId: Int = -1, isDivider: Boolean = true, @@ -280,6 +364,16 @@ class InlineMessage(val builder: AbstractMessageBuilder) { this.components += Separator(uniqueId, isDivider, spacing, block) } + /** + * See [FileDisplay.fromFile][net.dv8tion.jda.api.components.filedisplay.FileDisplay.fromFile]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param file The file to attach + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ fun fileDisplay( file: FileUpload, uniqueId: Int = -1, @@ -289,6 +383,16 @@ class InlineMessage(val builder: AbstractMessageBuilder) { this.components += FileDisplay(file, uniqueId, spoiler, block) } + /** + * See [FileDisplay.fromFileName][net.dv8tion.jda.api.components.filedisplay.FileDisplay.fromFileName]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param fileName Name of the file, you later have to add the file data with a matching name + * @param uniqueId Unique identifier of this component + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + */ fun fileDisplay( fileName: String, uniqueId: Int = -1, @@ -298,6 +402,19 @@ class InlineMessage(val builder: AbstractMessageBuilder) { this.components += FileDisplay(fileName, uniqueId, spoiler, block) } + /** + * See [Container][net.dv8tion.jda.api.components.container.Container]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param components The components of this container + * @param uniqueId Unique identifier of this component + * @param accentColor Color of the container's left side, you can use [rgb], [hsb] or [hex] for it + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + * + * @see ContainerChildComponent + */ inline fun container( vararg components: ContainerChildComponent, uniqueId: Int = -1, @@ -311,6 +428,19 @@ class InlineMessage(val builder: AbstractMessageBuilder) { } } + /** + * See [Container][net.dv8tion.jda.api.components.container.Container]. + * + * This requires [Components V2][net.dv8tion.jda.api.utils.messages.MessageRequest.useComponentsV2] to be enabled. + * + * @param components The components of this container + * @param uniqueId Unique identifier of this component + * @param accentColor Color of the container's left side, you can use [rgb], [hsb] or [hex] for it + * @param spoiler Hides the file until the user clicks on it + * @param block Lambda allowing further configuration + * + * @see ContainerChildComponent + */ inline fun container( components: Collection = emptyList(), uniqueId: Int = -1,