diff --git a/README.md b/README.md index 1551f3e..20dd446 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,15 @@ 获取MC服务器信息: `org.zrnq.mcmotd:command.mcp` 绑定服务器到群聊: `org.zrnq.mcmotd:command.mcadd` 删除群聊绑定的服务器: `org.zrnq.mcmotd:command.mcdel` -启动/停止服务器的在线人数记录功能: `org.zrnq.mcmotd:command.mcrec` -获取http API访问计数: `org.zrnq.mcmotd:command.mcapi` +启动/停止服务器的在线人数记录功能: `org.zrnq.mcmotd:command.mcrec` +获取http API访问计数: `org.zrnq.mcmotd:command.mcapi` +重载插件配置: `org.zrnq.mcmotd:command.mcreload` ## 插件命令 -> /mcp (服务器地址/服务器名称) : 查询指定地址或绑定到指定名称上的服务器信息,当本群仅绑定了一个服务器时可省略参数。 -其中,服务器地址可以仅有域名,如`mc.example.com`,也可以带有端口号,如`mc.example.com:12345` +> /mcp (服务器地址/服务器名称) : 查询指定地址或绑定到指定名称上的服务器信息,当本群仅绑定了一个服务器时可省略参数。 +> +> 其中,服务器地址可以仅有域名,如`mc.example.com`,也可以带有端口号,如`mc.example.com:12345`。 +> +> 若服务器的玩家列表信息需要通过[Query协议](https://wiki.vg/Query)获取,则需要同时指定服务器连接端口和Query端口,如`mc.example.com:12345:23456`。 > /mcadd <服务器名称> <服务器地址> : 将指定地址的服务器绑定到指定名称上。各个群聊绑定的服务器相互独立。 @@ -44,7 +48,9 @@ > /mcrec <服务器地址> (true/false) : 启动/停止对于指定服务器的在线人数记录,仅有启用了在线人数记录的服务器才会在查询结果图片中附加历史在线人数信息 -> /mcapi : 获取http API访问计数信息(需要启用http API访问计数功能) +> /mcapi : 获取http API访问计数信息(需要启用http API访问计数功能) + +> /mcreload : 重载插件配置 ## 插件配置 插件的配置文件位于`/config/org.zrnq.mcmotd/mcmotd.yml` diff --git a/build.gradle.kts b/build.gradle.kts index 8e848df..9d451a1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } group = "org.zrnq" -version = "1.1.19" +version = "1.1.20" val ktor_version = "2.3.1" repositories { diff --git a/src/main/kotlin/org/zrnq/mcmotd/McMotd.kt b/src/main/kotlin/org/zrnq/mcmotd/McMotd.kt index 9736644..e0d0d31 100644 --- a/src/main/kotlin/org/zrnq/mcmotd/McMotd.kt +++ b/src/main/kotlin/org/zrnq/mcmotd/McMotd.kt @@ -4,6 +4,7 @@ import com.alibaba.fastjson.parser.ParserConfig import io.ktor.server.application.* import io.ktor.server.engine.* import io.ktor.server.netty.* +import net.mamoe.mirai.console.command.Command import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register import net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregister import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription @@ -20,23 +21,21 @@ object McMotd : KotlinPlugin( JvmPluginDescription( id = "org.zrnq.mcmotd", name = "Minecraft MOTD Fetcher", - version = "1.1.19", + version = "1.1.20", ) { author("ZRnQ") info("""以图片的形式获取指定Minecraft服务器的基本信息""") } ) { + private lateinit var commandList : List override fun onEnable() { miraiLogger = logger logger.info { "McMotd is loading" } ParserConfig.getGlobalInstance().isSafeMode = true PluginConfig.reload() PluginData.reload() - QueryCommand.register() - BindCommand.register() - DelCommand.register() - RecordCommand.register() - HttpServerCommand.register() + commandList = listOf(QueryCommand, BindCommand, DelCommand, RecordCommand, HttpServerCommand, ConfigReloadCommand) + commandList.forEach { it.register() } MClientOptions.loadPluginConfig() startRecord() configureHttpServer() @@ -44,16 +43,12 @@ object McMotd : KotlinPlugin( override fun onDisable() { logger.info { "McMotd is unloading" } - QueryCommand.unregister() - BindCommand.unregister() - DelCommand.unregister() - RecordCommand.unregister() - HttpServerCommand.unregister() + commandList.forEach { it.unregister() } stopRecord() stopHttpServer() } - private lateinit var timer : Timer + lateinit var timer : Timer private fun startRecord() { timer = Timer() diff --git a/src/main/kotlin/org/zrnq/mcmotd/QueryCommand.kt b/src/main/kotlin/org/zrnq/mcmotd/QueryCommand.kt index bd4685e..c099b57 100644 --- a/src/main/kotlin/org/zrnq/mcmotd/QueryCommand.kt +++ b/src/main/kotlin/org/zrnq/mcmotd/QueryCommand.kt @@ -1,6 +1,7 @@ package org.zrnq.mcmotd import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import net.mamoe.mirai.console.command.CommandSender import net.mamoe.mirai.console.command.MemberCommandSender @@ -8,11 +9,13 @@ import net.mamoe.mirai.console.command.SimpleCommand import net.mamoe.mirai.console.util.sendAnsiMessage import net.mamoe.mirai.message.data.At import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource +import org.zrnq.mclient.MClientOptions import org.zrnq.mclient.output.APIOutputHandler import org.zrnq.mclient.parseAddress import org.zrnq.mclient.renderBasicInfoImage import org.zrnq.mclient.secondToReadableTime import org.zrnq.mcmotd.ImageUtil.appendPlayerHistory +import org.zrnq.mcmotd.McMotd.reload import java.awt.image.BufferedImage import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream @@ -152,6 +155,23 @@ object HttpServerCommand : SimpleCommand(McMotd, "mcapi", description = "获取H } } +@Suppress("unused") +object ConfigReloadCommand : SimpleCommand(McMotd, "mcreload", description = "重载插件配置") { + @Handler + suspend fun CommandSender.handle() { + // run inside McMotd.timer to avoid ConcurrentModification with player history recording. + McMotd.timer.schedule(object : TimerTask() { + override fun run() { + PluginConfig.reload() + MClientOptions.loadPluginConfig() + runBlocking { + this@handle.reply("配置重载完成") + } + } + }, 0) + } +} + private suspend fun CommandSender.reply(message : String) { if(user == null) sendAnsiMessage { lightPurple().append(message) } else sendMessage(At(user!!.id) + message)