diff --git a/mirai-console/src/main/kotlin/MiraiConsole.kt b/mirai-console/src/main/kotlin/MiraiConsole.kt index 1955790c3..4f397dc2b 100644 --- a/mirai-console/src/main/kotlin/MiraiConsole.kt +++ b/mirai-console/src/main/kotlin/MiraiConsole.kt @@ -1,11 +1,13 @@ import kotlinx.coroutines.runBlocking import net.mamoe.mirai.Bot -import net.mamoe.mirai.alsoLogin +import net.mamoe.mirai.plugin.Command +import net.mamoe.mirai.plugin.CommandManager import net.mamoe.mirai.plugin.PluginManager import kotlin.concurrent.thread -fun main() { +val bots = mutableMapOf() +fun main() { println("loading Mirai in console environments") println("正在控制台环境中启动Mirai ") println() @@ -15,39 +17,56 @@ fun main() { println("Mirai-console now running on " + System.getProperty("user.dir")) println("Mirai-console 正在 " + System.getProperty("user.dir") + " 运行") println() - println("\"login qqnumber qqpassword \" to login a bot") - println("\"login qq号 qq密码 \" 来登陆一个BOT") + println("\"/login qqnumber qqpassword \" to login a bot") + println("\"/login qq号 qq密码 \" 来登陆一个BOT") thread { processNextCommandLine() } PluginManager.loadPlugins() + defaultCommands() Runtime.getRuntime().addShutdownHook(thread(start = false) { PluginManager.disableAllPlugins() }) } -tailrec fun processNextCommandLine() { - val commandArgs = readLine()?.split(" ") ?: return - when (commandArgs[0]) { - "login" -> { - if (commandArgs.size < 3) { - println("\"login qqnumber qqpassword \" to login a bot") - println("\"login qq号 qq密码 \" 来登录一个BOT") - return processNextCommandLine() - } - val qqNumber = commandArgs[1].toLong() - val qqPassword = commandArgs[2] - println("login...") +fun defaultCommands() { + class LoginCommand : Command( + "login" + ) { + override fun onCommand(args: List): Boolean { + if (args.size < 2) { + println("\"/login qqnumber qqpassword \" to login a bot") + println("\"/login qq号 qq密码 \" 来登录一个BOT") + return false + } + val qqNumber = args[0].toLong() + val qqPassword = args[1] + println("login...") runBlocking { try { - Bot(qqNumber, qqPassword).alsoLogin() + Bot(qqNumber, qqPassword).also { + it.login() + bots[qqNumber] = it + } } catch (e: Exception) { - println("login failed") + println("$qqNumber login failed") } } + return true } } - return processNextCommandLine() + CommandManager.register(LoginCommand()) +} + +tailrec fun processNextCommandLine() { + val fullCommand = readLine() + if (fullCommand != null && fullCommand.startsWith("/")) { + if (!CommandManager.runCommand(fullCommand)) { + println("unknown command $fullCommand") + println("未知指令 $fullCommand") + } + } + processNextCommandLine(); } diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/Command.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/Command.kt index 6f9f112e0..ef6087437 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/Command.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/Command.kt @@ -16,6 +16,24 @@ object CommandManager { } } + fun runCommand(fullCommand: String): Boolean { + val blocks = fullCommand.split(" ") + val commandHead = blocks[0].replace("/", "") + if (!registeredCommand.containsKey(commandHead)) { + return false + } + val args = blocks.subList(1, blocks.size) + registeredCommand[commandHead]?.run { + if (onCommand( + blocks.subList(1, blocks.size) + ) + ) { + PluginManager.onCommand(this, args) + } + } + return true + } + } @@ -27,7 +45,7 @@ abstract class Command( * 最高优先级监听器 * 如果return [false] 这次指令不会被[PluginBase]的全局onCommand监听器监听 * */ - fun onCommand(args: List): Boolean { + open fun onCommand(args: List): Boolean { return true } } diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/PluginBase.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/PluginBase.kt index 266aad948..037faf1bf 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/PluginBase.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/plugin/PluginBase.kt @@ -48,7 +48,7 @@ abstract class PluginBase(coroutineContext: CoroutineContext) : CoroutineScope { /** * 当任意指令被使用 */ - open fun onCommand(command: Command) { + open fun onCommand(command: Command, args: List) { } @@ -176,6 +176,11 @@ object PluginManager { //已完成加载的 private val nameToPluginBaseMap: MutableMap = mutableMapOf() + fun onCommand(command: Command, args: List) { + this.nameToPluginBaseMap.values.forEach { + it.onCommand(command, args) + } + } /** * 尝试加载全部插件 @@ -196,7 +201,6 @@ object PluginManager { PluginDescription.readFromContent(URL("jar:file:" + file.absoluteFile + "!/" + pluginYml.name).openConnection().inputStream.use { it.readBytes().encodeToString() }) - println(description) pluginsFound[description.name] = description pluginsLocation[description.name] = file }