From 91eee275473c619dbaabb50f897873eedb90f59a Mon Sep 17 00:00:00 2001 From: freya02 <41875020+freya022@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:16:30 +0200 Subject: [PATCH] Add test commands --- .../commands/message/MessageContextTest.kt | 41 ++++++ .../slash/SlashDetachedPermissions.kt | 51 +++++++ .../test/commands/slash/SlashEntity.kt | 131 ++++++++++++++++++ .../slash/SlashIntegrationContexts.kt | 39 ++++++ .../commands/slash/SlashIntegrationOwners.kt | 47 +++++++ .../test/commands/user/UserContextInfo.kt | 2 +- .../test/commands/user/UserContextTest.kt | 41 ++++++ 7 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextTest.kt create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashDetachedPermissions.kt create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashEntity.kt create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationContexts.kt create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationOwners.kt create mode 100644 src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextTest.kt diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextTest.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextTest.kt new file mode 100644 index 000000000..5d38bbb23 --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/message/MessageContextTest.kt @@ -0,0 +1,41 @@ +package io.github.freya022.botcommands.test.commands.message + +import dev.minn.jda.ktx.coroutines.await +import dev.minn.jda.ktx.messages.reply_ +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.context.annotations.JDAMessageCommand +import io.github.freya022.botcommands.api.commands.application.context.message.GlobalMessageEvent +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +import net.dv8tion.jda.api.entities.Message +import net.dv8tion.jda.api.interactions.IntegrationType +import net.dv8tion.jda.api.interactions.IntegrationType.GUILD_INSTALL +import net.dv8tion.jda.api.interactions.IntegrationType.USER_INSTALL +import net.dv8tion.jda.api.interactions.InteractionContextType +import net.dv8tion.jda.api.interactions.InteractionContextType.* + +@Command +class MessageContextTest : ApplicationCommand(), GlobalApplicationCommandProvider { + @JDAMessageCommand( + name = "test message (annotated)", + contexts = [GUILD, BOT_DM, PRIVATE_CHANNEL], + integrationTypes = [GUILD_INSTALL, USER_INSTALL] + ) + suspend fun onMessageContextTest(event: GlobalMessageEvent) { + event.reply_("Reply", ephemeral = true).await() + + println() + + event.hook.editOriginal("test") + .flatMap(Message::delete) + .await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.messageCommand("test message", ::onMessageContextTest) { + contexts = InteractionContextType.ALL + integrationTypes = IntegrationType.ALL + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashDetachedPermissions.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashDetachedPermissions.kt new file mode 100644 index 000000000..298fb0e50 --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashDetachedPermissions.kt @@ -0,0 +1,51 @@ +package io.github.freya022.botcommands.test.commands.slash + +import dev.minn.jda.ktx.coroutines.await +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.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +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.SlashOption +import io.github.freya022.botcommands.api.commands.application.slash.annotations.TopLevelSlashCommandData +import io.github.freya022.botcommands.api.core.utils.enumSetOf +import net.dv8tion.jda.api.entities.Member +import net.dv8tion.jda.api.entities.Role +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel +import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel +import net.dv8tion.jda.api.interactions.IntegrationType.* +import net.dv8tion.jda.api.interactions.InteractionContextType.GUILD + +@Command +class SlashDetachedPermissions : ApplicationCommand(), GlobalApplicationCommandProvider { + @JDASlashCommand("detached_permissions_annotated") + @TopLevelSlashCommandData( + contexts = [GUILD], + integrationTypes = [GUILD_INSTALL, USER_INSTALL] + ) + suspend fun onSlashDetachedPermissions(event: GuildSlashEvent, @SlashOption member: Member, @SlashOption role: Role, @SlashOption channel: TextChannel, @SlashOption channel2: TextChannel, @SlashOption thread: ThreadChannel?) { + event.deferReply(true).await() + + event.hook.sendMessage(""" + $member + $role + $channel + $channel2 + $thread + """.trimIndent()).await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.slashCommand("detached_permissions", ::onSlashDetachedPermissions) { + contexts = enumSetOf(GUILD) + integrationTypes = ALL + + option("member") + option("role") + option("channel") + option("channel2") + option("thread") + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashEntity.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashEntity.kt new file mode 100644 index 000000000..74fa2ba3b --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashEntity.kt @@ -0,0 +1,131 @@ +package io.github.freya022.botcommands.test.commands.slash + +import dev.minn.jda.ktx.coroutines.await +import dev.minn.jda.ktx.messages.MessageCreate +import dev.minn.jda.ktx.messages.into +import io.github.freya022.botcommands.api.commands.annotations.Command +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +import io.github.freya022.botcommands.api.commands.application.slash.GlobalSlashEvent +import io.github.freya022.botcommands.api.components.Buttons +import io.github.freya022.botcommands.api.components.SelectMenus +import io.github.freya022.botcommands.api.modals.Modals +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 +class SlashEntity(private val buttons: Buttons, private val modals: Modals, private val selectMenus: SelectMenus) : GlobalApplicationCommandProvider { + data class AllEntities( + val user: User, + val member: Member, + val role: Role, + val textChannel: TextChannel, + val newsChannel: NewsChannel, + val stageChannel: StageChannel, + val voiceChannel: VoiceChannel, + val category: Category, + val forumChannel: ForumChannel, + val threadChannel: ThreadChannel +// val mediaChannel: MediaChannel + ) + + suspend fun onSlashEntityNothing(event: GlobalSlashEvent) { + reply(event, null) + } + + suspend fun onSlashEntityMember(event: GlobalSlashEvent, member: Member) { + reply(event, member) + } + + suspend fun onSlashEntityRole(event: GlobalSlashEvent, role: Role) { + reply(event, role) + } + + suspend fun onSlashEntityTextChannel(event: GlobalSlashEvent, textChannel: TextChannel) { + reply(event, textChannel) + } + + suspend fun onSlashEntityAll(event: GlobalSlashEvent, allEntities: AllEntities) { + reply(event, allEntities) + } + + private suspend fun reply(event: GlobalSlashEvent, arg: Any?) { + event.deferReply(false).await() + + println(arg) + + val message = MessageCreate { + content = "It works! <@222046562543468545>" + + components += buttons.primary("Click me").ephemeral { + bindTo { + it.editMessage("Boo").await() + it.hook.sendMessage("ye").await() +// it.reply_("Ye", ephemeral = true).await() + } + }.into() + + components += selectMenus.entitySelectMenu(EntitySelectMenu.SelectTarget.CHANNEL).ephemeral { + bindTo { + it.editMessage("Foo ${it.values}").await() + it.hook.sendMessage("bar").await() + } + }.into() + + components += selectMenus.entitySelectMenu(EntitySelectMenu.SelectTarget.USER).ephemeral { + bindTo { + it.editMessage("Foo ${it.values}").await() + it.hook.sendMessage("bar").await() + } + }.into() + + components += selectMenus.entitySelectMenu(EntitySelectMenu.SelectTarget.ROLE).ephemeral { + bindTo { + it.editMessage("Foo ${it.values}").await() + it.hook.sendMessage("bar").await() + } + }.into() + } + + event.hook.sendMessage(message).await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.slashCommand("entities", function = null) { + contexts = InteractionContextType.ALL + integrationTypes = IntegrationType.ALL + + subcommand("nothing", ::onSlashEntityNothing) + subcommand("all", ::onSlashEntityAll) { + aggregate("allEntities", SlashEntity::AllEntities) { + option("user") + option("member") + option("role") + option("textChannel") + option("newsChannel") + option("stageChannel") + option("voiceChannel") + option("category") + option("forumChannel") + option("threadChannel") +// option("mediaChannel") + } + } + subcommand("member", ::onSlashEntityMember) { + option("member") + } + subcommand("role", ::onSlashEntityRole) { + option("role") + } + subcommand("text_channel", ::onSlashEntityTextChannel) { + option("textChannel") + } + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationContexts.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationContexts.kt new file mode 100644 index 000000000..365fbca6a --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationContexts.kt @@ -0,0 +1,39 @@ +package io.github.freya022.botcommands.test.commands.slash + +import dev.minn.jda.ktx.coroutines.await +import dev.minn.jda.ktx.messages.reply_ +import io.github.freya022.botcommands.api.commands.annotations.Command +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +import io.github.freya022.botcommands.api.commands.application.provider.GuildApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GuildApplicationCommandProvider +import io.github.freya022.botcommands.api.commands.application.slash.GlobalSlashEvent +import io.github.freya022.botcommands.api.commands.application.slash.GuildSlashEvent +import io.github.freya022.botcommands.api.core.utils.enumSetOf +import net.dv8tion.jda.api.interactions.IntegrationType +import net.dv8tion.jda.api.interactions.InteractionContextType + +// Uses breakpoints to see stuff about the interaction +@Command +class SlashIntegrationContexts : GlobalApplicationCommandProvider, GuildApplicationCommandProvider { + suspend fun onIntegrationContextsTestGuildCommand(event: GuildSlashEvent) { + event.reply_("ok", ephemeral = true).await() + } + + suspend fun onIntegrationContextsTestGlobalGuildCommand(event: GlobalSlashEvent) { + event.reply_("ok", ephemeral = true).await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.slashCommand("global_integration_contexts", ::onIntegrationContextsTestGlobalGuildCommand) { + contexts = enumSetOf(InteractionContextType.GUILD, InteractionContextType.BOT_DM) + integrationTypes = enumSetOf(IntegrationType.GUILD_INSTALL) + } + } + + override fun declareGuildApplicationCommands(manager: GuildApplicationCommandManager) { + manager.slashCommand("guild_integration_contexts", ::onIntegrationContextsTestGuildCommand) { + + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationOwners.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationOwners.kt new file mode 100644 index 000000000..56c7b3337 --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/slash/SlashIntegrationOwners.kt @@ -0,0 +1,47 @@ +package io.github.freya022.botcommands.test.commands.slash + +import dev.minn.jda.ktx.coroutines.await +import dev.minn.jda.ktx.messages.into +import io.github.freya022.botcommands.api.commands.annotations.Command +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +import io.github.freya022.botcommands.api.commands.application.provider.GuildApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GuildApplicationCommandProvider +import io.github.freya022.botcommands.api.commands.application.slash.GlobalSlashEvent +import io.github.freya022.botcommands.api.components.Buttons +import io.github.freya022.botcommands.api.core.utils.enumSetOf +import net.dv8tion.jda.api.interactions.IntegrationType +import net.dv8tion.jda.api.interactions.InteractionContextType + +@Command +class SlashIntegrationOwners(private val buttons: Buttons) : GlobalApplicationCommandProvider, GuildApplicationCommandProvider { + suspend fun run(event: GlobalSlashEvent) { + val button = buttons.primary("click me").ephemeral { + bindTo { it.deferEdit().await() } + } + event.replyComponents(button.into()).setEphemeral(true).await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.slashCommand("global_owners", ::run) { + integrationTypes = IntegrationType.ALL + contexts = InteractionContextType.ALL + } + + manager.slashCommand("global_owners_only_user", ::run) { + integrationTypes = enumSetOf(IntegrationType.USER_INSTALL) + contexts = InteractionContextType.ALL + } + + manager.slashCommand("global_owners_only_guild", ::run) { + integrationTypes = enumSetOf(IntegrationType.GUILD_INSTALL) + contexts = InteractionContextType.ALL + } + } + + override fun declareGuildApplicationCommands(manager: GuildApplicationCommandManager) { + manager.slashCommand("guild_owners", ::run) { + + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextInfo.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextInfo.kt index ceea6d056..54cb1eb01 100644 --- a/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextInfo.kt +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextInfo.kt @@ -47,7 +47,7 @@ class UserContextInfo : ApplicationCommand(), GlobalApplicationCommandProvider { } override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { - manager.userCommand("User info", CommandScope.GLOBAL, ::onUserContextInfo) { + manager.userCommand("User info", ::onUserContextInfo) { option("user") generatedOption("userTag") { diff --git a/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextTest.kt b/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextTest.kt new file mode 100644 index 000000000..c7a4c2a14 --- /dev/null +++ b/src/test/kotlin/io/github/freya022/botcommands/test/commands/user/UserContextTest.kt @@ -0,0 +1,41 @@ +package io.github.freya022.botcommands.test.commands.user + +import dev.minn.jda.ktx.coroutines.await +import dev.minn.jda.ktx.messages.reply_ +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.context.annotations.JDAUserCommand +import io.github.freya022.botcommands.api.commands.application.context.user.GlobalUserEvent +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandManager +import io.github.freya022.botcommands.api.commands.application.provider.GlobalApplicationCommandProvider +import net.dv8tion.jda.api.entities.Message +import net.dv8tion.jda.api.interactions.IntegrationType +import net.dv8tion.jda.api.interactions.IntegrationType.GUILD_INSTALL +import net.dv8tion.jda.api.interactions.IntegrationType.USER_INSTALL +import net.dv8tion.jda.api.interactions.InteractionContextType +import net.dv8tion.jda.api.interactions.InteractionContextType.* + +@Command +class UserContextTest : ApplicationCommand(), GlobalApplicationCommandProvider { + @JDAUserCommand( + name = "test user (annotated)", + contexts = [GUILD, BOT_DM, PRIVATE_CHANNEL], + integrationTypes = [GUILD_INSTALL, USER_INSTALL] + ) + suspend fun onUserContextTest(event: GlobalUserEvent) { + event.reply_("Reply", ephemeral = true).await() + + println() + + event.hook.editOriginal("test") + .flatMap(Message::delete) + .await() + } + + override fun declareGlobalApplicationCommands(manager: GlobalApplicationCommandManager) { + manager.userCommand("test user", ::onUserContextTest) { + contexts = InteractionContextType.ALL + integrationTypes = IntegrationType.ALL + } + } +} \ No newline at end of file