From 00c9ae7a6417c63799521a4425c035a2a657cef4 Mon Sep 17 00:00:00 2001 From: RTAkland Date: Tue, 3 Sep 2024 16:15:26 +0800 Subject: [PATCH] feat: add mcping and help command --- build.gradle.kts | 7 +- gradle/libs.versions.toml | 4 +- src/main/kotlin/cn/rtast/fancybot/FancyBot.kt | 14 ++-- .../cn/rtast/fancybot/commands/HelpCommand.kt | 30 ++++++++ .../rtast/fancybot/commands/MCPingCommand.kt | 69 +++++++++++++++++++ .../rtast/fancybot/entity/MCPingResponse.kt | 24 +++++++ 6 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/cn/rtast/fancybot/commands/HelpCommand.kt create mode 100644 src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt create mode 100644 src/main/kotlin/cn/rtast/fancybot/entity/MCPingResponse.kt diff --git a/build.gradle.kts b/build.gradle.kts index 123c467..00ee744 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,10 +13,8 @@ version = fancyBotVersion repositories { mavenCentral() mavenLocal() - maven { - name = "repo.rtast.cn" - url = uri("https://repo.rtast.cn/api/v4/projects/33/packages/maven") - } + maven("https://repo.rtast.cn/api/v4/projects/33/packages/maven") + maven("https://repo.rtast.cn/api/v4/projects/19/packages/maven") } tasks.compileKotlin { @@ -35,6 +33,7 @@ dependencies { implementation(libs.exposedCore) implementation(libs.exposedJDBC) implementation(libs.sqliteJDBC) + implementation(libs.motdPinger) } tasks.build { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 94d1e50..0e5a404 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,10 +1,11 @@ [versions] kotlinVersion = "2.0.10" -ronebotVersion = "1.5.7" +ronebotVersion = "1.5.8" shadowVersion = "8.3.0" okhttpVersion = "5.0.0-alpha.14" exposedVersion = "0.53.0" sqliteJDBCVersion = "3.46.1.0" +motdPingerVersion = "1.0.1" [libraries] rOneBot = { group = "cn.rtast", name = "ROneBot", version.ref = "ronebotVersion" } @@ -12,6 +13,7 @@ okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhtt exposedCore = { group = "org.jetbrains.exposed", name = "exposed-core", version.ref = "exposedVersion" } exposedJDBC = { group = "org.jetbrains.exposed", name = "exposed-jdbc", version.ref = "exposedVersion" } sqliteJDBC = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqliteJDBCVersion" } +motdPinger = { group = "cn.rtast", name = "MotdPinger", version.ref = "motdPingerVersion" } [bundles] diff --git a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt index be34f8d..508b7c8 100644 --- a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt +++ b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt @@ -10,8 +10,10 @@ package cn.rtast.fancybot import cn.rtast.fancybot.commands.AntiRevokeCommand import cn.rtast.fancybot.commands.EchoCommand import cn.rtast.fancybot.commands.FKXQSCommand +import cn.rtast.fancybot.commands.HelpCommand import cn.rtast.fancybot.commands.HitokotoCommand import cn.rtast.fancybot.commands.JrrpCommand +import cn.rtast.fancybot.commands.MCPingCommand import cn.rtast.fancybot.commands.MusicCommand import cn.rtast.fancybot.commands.MyPointCommand import cn.rtast.fancybot.commands.QRCodeCommand @@ -21,9 +23,9 @@ import cn.rtast.fancybot.entity.enums.WSType import cn.rtast.fancybot.items.BaisiItem import cn.rtast.fancybot.items.HeisiItem import cn.rtast.fancybot.items.SetuItem -import cn.rtast.fancybot.util.item.ItemManager import cn.rtast.fancybot.util.file.ConfigManager import cn.rtast.fancybot.util.initDatabase +import cn.rtast.fancybot.util.item.ItemManager import cn.rtast.rob.ROneBotFactory import cn.rtast.rob.entity.GetMessage import cn.rtast.rob.entity.GroupMessage @@ -64,14 +66,10 @@ class FancyBot : OBMessage { } val commands = listOf( - EchoCommand(), - JrrpCommand(), - MusicCommand(), + EchoCommand(), JrrpCommand(), MusicCommand(), SignCommand(), RedeemCommand(), MyPointCommand(), - HitokotoCommand(), - FKXQSCommand(), - QRCodeCommand(), - AntiRevokeCommand() + HitokotoCommand(), FKXQSCommand(), QRCodeCommand(), + AntiRevokeCommand(), MCPingCommand(), HelpCommand() ) val items = listOf( diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/HelpCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/HelpCommand.kt new file mode 100644 index 0000000..db0c3cb --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/commands/HelpCommand.kt @@ -0,0 +1,30 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/3 + */ + + +package cn.rtast.fancybot.commands + +import cn.rtast.fancybot.commands +import cn.rtast.rob.entity.GroupMessage +import cn.rtast.rob.util.BaseCommand +import cn.rtast.rob.util.ob.MessageChain +import cn.rtast.rob.util.ob.OBMessage + +class HelpCommand : BaseCommand() { + override val commandNames = listOf("/help", "/帮助") + + override suspend fun executeGroup(listener: OBMessage, message: GroupMessage, args: List) { + val allCommands = commands.joinToString("\n") { + "[${it.javaClass.name.split(".").last().replace("Command", "")}] 命令:${it.commandNames.joinToString(",")}" + } + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addNewLine() + .addText(allCommands) + .build() + listener.sendGroupMessage(message.groupId, msg) + } +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt new file mode 100644 index 0000000..57a5cb6 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt @@ -0,0 +1,69 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/3 + */ + + +package cn.rtast.fancybot.commands + +import cn.rtast.fancybot.entity.MCPingResponse +import cn.rtast.fancybot.util.fromJson +import cn.rtast.motdpinger.MotdPinger +import cn.rtast.rob.entity.GroupMessage +import cn.rtast.rob.util.BaseCommand +import cn.rtast.rob.util.ob.MessageChain +import cn.rtast.rob.util.ob.OBMessage + +class MCPingCommand : BaseCommand() { + override val commandNames = listOf("/mcping", "/mcPing") + + private val pingInstance = MotdPinger() + + override suspend fun executeGroup(listener: OBMessage, message: GroupMessage, args: List) { + if (args.isEmpty()) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addNewLine() + .addText("使用方法: /mcping :[port]") + .addNewLine() + .addText("仅限Java版服务器哦~") + .build() + listener.sendGroupMessage(message.groupId, msg) + return + } + val parts = args.first().split(":") + val host: String + val port: Int + if (parts.size == 2) { + host = parts[0] + port = parts[1].toIntOrNull() ?: 25565 + } else { + host = args.first() + port = 25565 + } + try { + val rawResponse = pingInstance.pingServer(host, port) + val jsonResponse = rawResponse?.fromJson()!! + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addNewLine() + .addImage(jsonResponse.favicon, true) + .addText("服务器地址: $host:$port") + .addNewLine() + .addText("协议版本号: ${jsonResponse.version.protocol}/${jsonResponse.version.name}") + .addNewLine() + .addText("玩家: ${jsonResponse.players.online}/${jsonResponse.players.max}") + .build() + listener.sendGroupMessage(message.groupId, msg) + } catch (_: Exception) { + val msg = MessageChain.Builder() + .addAt(message.sender.userId) + .addText("ping失败~") + .addNewLine() + .addText("检查一下地址或者端口是否正确吧~") + .build() + listener.sendGroupMessage(message.groupId, msg) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/MCPingResponse.kt b/src/main/kotlin/cn/rtast/fancybot/entity/MCPingResponse.kt new file mode 100644 index 0000000..cefbacb --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/entity/MCPingResponse.kt @@ -0,0 +1,24 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/3 + */ + + +package cn.rtast.fancybot.entity + +data class MCPingResponse( + val version: Version, + val players: Players, + val favicon: String +) { + data class Version( + val protocol: Int, + val name: String, + ) + + data class Players( + val online: Int, + val max: Int, + ) +} \ No newline at end of file