mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-25 07:30:14 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
c42169a238
@ -1,11 +1,13 @@
|
|||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import net.mamoe.mirai.Bot
|
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 net.mamoe.mirai.plugin.PluginManager
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
fun main() {
|
val bots = mutableMapOf<Long, Bot>()
|
||||||
|
|
||||||
|
fun main() {
|
||||||
println("loading Mirai in console environments")
|
println("loading Mirai in console environments")
|
||||||
println("正在控制台环境中启动Mirai ")
|
println("正在控制台环境中启动Mirai ")
|
||||||
println()
|
println()
|
||||||
@ -15,39 +17,56 @@ fun main() {
|
|||||||
println("Mirai-console now running on " + System.getProperty("user.dir"))
|
println("Mirai-console now running on " + System.getProperty("user.dir"))
|
||||||
println("Mirai-console 正在 " + System.getProperty("user.dir") + " 运行")
|
println("Mirai-console 正在 " + System.getProperty("user.dir") + " 运行")
|
||||||
println()
|
println()
|
||||||
println("\"login qqnumber qqpassword \" to login a bot")
|
println("\"/login qqnumber qqpassword \" to login a bot")
|
||||||
println("\"login qq号 qq密码 \" 来登陆一个BOT")
|
println("\"/login qq号 qq密码 \" 来登陆一个BOT")
|
||||||
|
|
||||||
thread { processNextCommandLine() }
|
thread { processNextCommandLine() }
|
||||||
|
|
||||||
PluginManager.loadPlugins()
|
PluginManager.loadPlugins()
|
||||||
|
defaultCommands()
|
||||||
|
|
||||||
Runtime.getRuntime().addShutdownHook(thread(start = false) {
|
Runtime.getRuntime().addShutdownHook(thread(start = false) {
|
||||||
PluginManager.disableAllPlugins()
|
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 {
|
runBlocking {
|
||||||
try {
|
try {
|
||||||
Bot(qqNumber, qqPassword).alsoLogin()
|
Bot(qqNumber, qqPassword).also {
|
||||||
|
it.login()
|
||||||
|
bots[qqNumber] = it
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} 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();
|
||||||
}
|
}
|
||||||
|
@ -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监听器监听
|
* 如果return [false] 这次指令不会被[PluginBase]的全局onCommand监听器监听
|
||||||
* */
|
* */
|
||||||
fun onCommand(args: List<String>): Boolean {
|
open fun onCommand(args: List<String>): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
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 {
|
PluginDescription.readFromContent(URL("jar:file:" + file.absoluteFile + "!/" + pluginYml.name).openConnection().inputStream.use {
|
||||||
it.readBytes().encodeToString()
|
it.readBytes().encodeToString()
|
||||||
})
|
})
|
||||||
println(description)
|
|
||||||
pluginsFound[description.name] = description
|
pluginsFound[description.name] = description
|
||||||
pluginsLocation[description.name] = file
|
pluginsLocation[description.name] = file
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user