From e299ae214f501a659134c05b5e7be1dfff7feb91 Mon Sep 17 00:00:00 2001 From: RTAkland Date: Sat, 14 Dec 2024 15:46:50 +0800 Subject: [PATCH] feat[onebot11]: introduce brigadier: create command using mojang's brigadier lib --- build.gradle.kts | 1 + gradle.properties | 2 +- gradle/libs.versions.toml | 4 ++- ronebot-common/build.gradle.kts | 1 + .../rob/command/BrigadierCommandManager.kt | 35 +++++++++++++++++++ .../rob/{util => command}/CommandManager.kt | 2 +- .../cn/rtast/rob/command/IBrigadierCommand.kt | 18 ++++++++++ .../kotlin/cn/rtast/rob/ROneBotFactory.kt | 6 ++++ .../cn/rtast/rob/util/BrigadierCommand.kt | 13 +++++++ .../rob/util/BrigadierCommandManagerImpl.kt | 27 ++++++++++++++ .../cn/rtast/rob/util/CommandManagerImpl.kt | 1 + .../cn/rtast/rob/util/MessageHandler.kt | 1 + .../src/test/kotlin/test/TestClient.kt | 33 +++++++++++------ 13 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 ronebot-common/src/main/kotlin/cn/rtast/rob/command/BrigadierCommandManager.kt rename ronebot-common/src/main/kotlin/cn/rtast/rob/{util => command}/CommandManager.kt (96%) create mode 100644 ronebot-common/src/main/kotlin/cn/rtast/rob/command/IBrigadierCommand.kt create mode 100644 ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommand.kt create mode 100644 ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommandManagerImpl.kt diff --git a/build.gradle.kts b/build.gradle.kts index 58db7a1..c6eeb07 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -61,6 +61,7 @@ allprojects { repositories { mavenCentral() maven("https://jitpack.io") + maven("https://libraries.minecraft.net") } tasks.compileKotlin { diff --git a/gradle.properties b/gradle.properties index c752990..392b6cc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ kotlin.code.style=official -libVersion=2.5.2 +libVersion=2.6.0 #systemProp.http.proxyHost=127.0.0.1 #systemProp.http.proxyPort=7890 #systemProp.https.proxyHost=127.0.0.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b6e7a4a..dae5332 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] protobufVersion = "0.9.4" -kotlinVersion = "2.0.21" +kotlinVersion = "2.1.0" gsonVersion = "2.11.0" kotlinCoroutineVersion = "1.9.0" javaWebsocketVersion = "1.5.7" @@ -16,6 +16,7 @@ bcprovVersion = "1.70" silk-codec = "0.0.5" jlayer = "1.0.3" jflac = "1.5.2" +brigadier = "1.0.18" [libraries] gson = { group = "com.google.code.gson", name = "gson", version.ref = "gsonVersion" } @@ -39,6 +40,7 @@ bcpg = { group = "org.bouncycastle", name = "bcpg-jdk15on", version.ref = "bcpro silk-codec = { group = "io.github.kasukusakura", name = "silk-codec", version.ref = "silk-codec" } jlayer = { group = "com.github.umjammer", name = "jlayer", version.ref = "jlayer" } jflac = { group = "org.jflac", name = "jflac-codec", version.ref = "jflac" } +brigadier = { group = "com.mojang", name = "brigadier", version.ref = "brigadier" } [bundles] diff --git a/ronebot-common/build.gradle.kts b/ronebot-common/build.gradle.kts index 3fd8a2c..b2649d1 100644 --- a/ronebot-common/build.gradle.kts +++ b/ronebot-common/build.gradle.kts @@ -5,4 +5,5 @@ dependencies { api(libs.slf4j.api) api(libs.logback.classic) api(libs.kotlin.reflect) + api(libs.brigadier) } diff --git a/ronebot-common/src/main/kotlin/cn/rtast/rob/command/BrigadierCommandManager.kt b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/BrigadierCommandManager.kt new file mode 100644 index 0000000..68371ec --- /dev/null +++ b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/BrigadierCommandManager.kt @@ -0,0 +1,35 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/12/14 + */ + + +package cn.rtast.rob.command + +import cn.rtast.rob.BaseBotInstance +import com.mojang.brigadier.CommandDispatcher + +interface BrigadierCommandManager { + /** + * 命令分发器 + */ + val dispatcher: CommandDispatcher + + /** + * 所有Bot实例 + */ + val botInstances: List + + /** + * 注册命令 + */ + fun register(command: IBrigadierCommand) { + command.register(dispatcher) + } + + /** + * 执行命令 + */ + fun execute(command: String) +} \ No newline at end of file diff --git a/ronebot-common/src/main/kotlin/cn/rtast/rob/util/CommandManager.kt b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/CommandManager.kt similarity index 96% rename from ronebot-common/src/main/kotlin/cn/rtast/rob/util/CommandManager.kt rename to ronebot-common/src/main/kotlin/cn/rtast/rob/command/CommandManager.kt index 2638cbe..1e044b1 100644 --- a/ronebot-common/src/main/kotlin/cn/rtast/rob/util/CommandManager.kt +++ b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/CommandManager.kt @@ -5,7 +5,7 @@ */ -package cn.rtast.rob.util +package cn.rtast.rob.command import cn.rtast.rob.entity.IBaseCommand import cn.rtast.rob.entity.IGroupMessage diff --git a/ronebot-common/src/main/kotlin/cn/rtast/rob/command/IBrigadierCommand.kt b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/IBrigadierCommand.kt new file mode 100644 index 0000000..dadb1d2 --- /dev/null +++ b/ronebot-common/src/main/kotlin/cn/rtast/rob/command/IBrigadierCommand.kt @@ -0,0 +1,18 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/12/14 + */ + + +package cn.rtast.rob.command + +import cn.rtast.rob.BaseBotInstance +import com.mojang.brigadier.CommandDispatcher + +interface IBrigadierCommand { + /** + * 注册指令 + */ + fun register(dispatcher: CommandDispatcher) +} \ No newline at end of file diff --git a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/ROneBotFactory.kt b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/ROneBotFactory.kt index 4b61260..4aa3425 100644 --- a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/ROneBotFactory.kt +++ b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/ROneBotFactory.kt @@ -15,6 +15,7 @@ import cn.rtast.rob.interceptor.IExecutionInterceptor import cn.rtast.rob.onebot.OneBotListener import cn.rtast.rob.scheduler.GlobalCoroutineScheduler import cn.rtast.rob.util.BaseCommand +import cn.rtast.rob.util.BrigadierCommandManagerImpl import cn.rtast.rob.util.CommandManagerImpl import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -46,6 +47,11 @@ object ROneBotFactory : BotFactory { */ val commandManager = CommandManagerImpl() + /** + * 使用Brigadier来管理的指令 + */ + val brigadierCommandManager = BrigadierCommandManagerImpl(botInstances) + /** * 获取所有的Bot实例数量 */ diff --git a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommand.kt b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommand.kt new file mode 100644 index 0000000..623c9d2 --- /dev/null +++ b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommand.kt @@ -0,0 +1,13 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/12/14 + */ + + +package cn.rtast.rob.util + +import cn.rtast.rob.BotInstance +import cn.rtast.rob.command.IBrigadierCommand + +abstract class BrigadierCommand: IBrigadierCommand \ No newline at end of file diff --git a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommandManagerImpl.kt b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommandManagerImpl.kt new file mode 100644 index 0000000..8d41ac5 --- /dev/null +++ b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/BrigadierCommandManagerImpl.kt @@ -0,0 +1,27 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/12/14 + */ + + +package cn.rtast.rob.util + +import cn.rtast.rob.BotInstance +import cn.rtast.rob.command.BrigadierCommandManager +import com.mojang.brigadier.CommandDispatcher + +class BrigadierCommandManagerImpl internal constructor( + override val botInstances: List +) : BrigadierCommandManager { + + override val dispatcher = CommandDispatcher() + override fun execute(command: String) { + try { + botInstances.forEach { + dispatcher.execute(command, it) + } + } catch (_: Exception) { + } + } +} \ No newline at end of file diff --git a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/CommandManagerImpl.kt b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/CommandManagerImpl.kt index 46aac19..0f74e13 100644 --- a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/CommandManagerImpl.kt +++ b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/CommandManagerImpl.kt @@ -9,6 +9,7 @@ package cn.rtast.rob.util import cn.rtast.rob.ROneBotFactory import cn.rtast.rob.annotations.CommandMatchingStrategy +import cn.rtast.rob.command.CommandManager import cn.rtast.rob.entity.* import cn.rtast.rob.enums.MatchingStrategy import cn.rtast.rob.interceptor.defaultInterceptor diff --git a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/MessageHandler.kt b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/MessageHandler.kt index 04b11ac..a19f4eb 100644 --- a/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/MessageHandler.kt +++ b/ronebot-onebot-v11/src/main/kotlin/cn/rtast/rob/util/MessageHandler.kt @@ -85,6 +85,7 @@ class MessageHandler( } listener.onGroupMessage(msg, message) ROneBotFactory.commandManager.handleGroup(msg) + ROneBotFactory.brigadierCommandManager.execute(msg.text) } MessageType.private -> { diff --git a/ronebot-onebot-v11/src/test/kotlin/test/TestClient.kt b/ronebot-onebot-v11/src/test/kotlin/test/TestClient.kt index b3ba659..051b4bb 100644 --- a/ronebot-onebot-v11/src/test/kotlin/test/TestClient.kt +++ b/ronebot-onebot-v11/src/test/kotlin/test/TestClient.kt @@ -6,12 +6,14 @@ package test +import cn.rtast.rob.BotInstance import cn.rtast.rob.ROneBotFactory import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.entity.custom.ErrorEvent import cn.rtast.rob.onebot.OneBotListener -import kotlin.time.Duration.Companion.minutes -import kotlin.time.Duration.Companion.seconds +import cn.rtast.rob.util.BrigadierCommand +import com.mojang.brigadier.CommandDispatcher +import com.mojang.brigadier.builder.LiteralArgumentBuilder class TestClient : OneBotListener { @@ -27,19 +29,28 @@ val commands = listOf( EchoCommand(), DelayCommand(), MatchedCommand(), ) +class TestBrigadierCommand : BrigadierCommand() { + override fun register(dispatcher: CommandDispatcher) { + dispatcher.register( + LiteralArgumentBuilder.literal("test") + .executes { context -> + println("executed") + 0 + }.then( + LiteralArgumentBuilder.literal("test") + .executes { context -> + println("sub command executed") + 0 + } + )) + } +} + suspend fun main() { val client = TestClient() // val wsAddress = "ws://127.0.0.1:4646" val wsAddress = System.getenv("WS_ADDRESS") val wsAccessToken = System.getenv("WS_ACCESS_TOKEN") val instance1 = ROneBotFactory.createClient(wsAddress, wsAccessToken, client) - ROneBotFactory.interceptor = CustomInterceptor() - instance1.addListeningGroups(985927054) - commands.forEach { - ROneBotFactory.commandManager.register(it) - } - val task = instance1.scheduler.scheduleTask({ - println("11") - }, 1.seconds, 1.minutes) - task.cancel() + ROneBotFactory.brigadierCommandManager.register(TestBrigadierCommand()) } \ No newline at end of file