Merge remote-tracking branch 'origin/master'

This commit is contained in:
Him188 2020-01-25 19:44:24 +08:00
commit c42169a238
3 changed files with 63 additions and 22 deletions

View File

@ -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<Long, Bot>()
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<String>): 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();
}

View File

@ -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<String>): Boolean {
open fun onCommand(args: List<String>): Boolean {
return true
}
}

View File

@ -48,7 +48,7 @@ abstract class PluginBase(coroutineContext: CoroutineContext) : CoroutineScope {
/**
* 当任意指令被使用
*/
open fun onCommand(command: Command) {
open fun onCommand(command: Command, args: List<String>) {
}
@ -176,6 +176,11 @@ object PluginManager {
//已完成加载的
private val nameToPluginBaseMap: MutableMap<String, PluginBase> = mutableMapOf()
fun onCommand(command: Command, args: List<String>) {
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
}