Commit 0e39c300 authored by jiahua.liu's avatar jiahua.liu

Command Builder

parent f42e9857
...@@ -10,11 +10,11 @@ ...@@ -10,11 +10,11 @@
import net.mamoe.mirai.plugin.PluginManager import net.mamoe.mirai.plugin.PluginManager
object CommandManager { object CommandManager {
private val registeredCommand: MutableMap<String, Command> = mutableMapOf() private val registeredCommand: MutableMap<String, ICommand> = mutableMapOf()
fun register(command: Command) { fun register(command: ICommand) {
val allNames = mutableListOf<String>(command.name).also { it.addAll(command.alias) } val allNames = mutableListOf(command.name).also { it.addAll(command.alias) }
allNames.forEach { allNames.forEach {
if (registeredCommand.containsKey(it)) { if (registeredCommand.containsKey(it)) {
error("Command Name(or Alias) $it is already registered, consider if same function plugin was installed") error("Command Name(or Alias) $it is already registered, consider if same function plugin was installed")
...@@ -25,7 +25,7 @@ object CommandManager { ...@@ -25,7 +25,7 @@ object CommandManager {
} }
} }
fun unregister(command: Command) { fun unregister(command: ICommand) {
val allNames = mutableListOf<String>(command.name).also { it.addAll(command.alias) } val allNames = mutableListOf<String>(command.name).also { it.addAll(command.alias) }
allNames.forEach { allNames.forEach {
registeredCommand.remove(it) registeredCommand.remove(it)
...@@ -52,17 +52,67 @@ object CommandManager { ...@@ -52,17 +52,67 @@ object CommandManager {
} }
interface ICommand {
val name: String
val alias: List<String>
val description: String
fun onCommand(args: List<String>): Boolean
fun register()
}
abstract class Command( abstract class Command(
val name: String, override val name: String,
val alias: List<String> = listOf(), override val alias: List<String> = listOf(),
val description: String = "" override val description: String = ""
) { ) : ICommand {
/** /**
* 最高优先级监听器 * 最高优先级监听器
* 如果return [false] 这次指令不会被[PluginBase]的全局onCommand监听器监听 * 如果return [false] 这次指令不会被[PluginBase]的全局onCommand监听器监听
* */ * */
open fun onCommand(args: List<String>): Boolean { open override fun onCommand(args: List<String>): Boolean {
return true return true
} }
override fun register() {
CommandManager.register(this)
}
}
class AnonymousCommand internal constructor(
override val name: String,
override val alias: List<String>,
override val description: String,
val onCommand: ICommand.(args: List<String>) -> Boolean
) : ICommand {
override fun onCommand(args: List<String>): Boolean {
return onCommand.invoke(this, args)
}
override fun register() {
CommandManager.register(this)
}
}
class CommandBuilder internal constructor() {
var name: String? = null
var alias: List<String>? = null
var description: String = ""
var onCommand: (ICommand.(args: List<String>) -> Boolean)? = null
fun register(): ICommand {
if (name == null || onCommand == null) {
error("CommandBuilder not complete")
}
if (alias == null) {
alias = listOf()
}
return AnonymousCommand(name!!, alias!!, description, onCommand!!).also { it.register() }
}
}
fun buildCommand(builder: CommandBuilder.() -> Unit): ICommand {
val builder2 = CommandBuilder()
builder.invoke(builder2)
return builder2.register()
} }
...@@ -42,7 +42,8 @@ object MiraiConsole { ...@@ -42,7 +42,8 @@ object MiraiConsole {
logger("Mirai为开源项目,请自觉遵守开源项目协议") logger("Mirai为开源项目,请自觉遵守开源项目协议")
logger("Powered by Mamoe Technology") logger("Powered by Mamoe Technology")
logger() logger()
CommandManager.register(DefaultCommands.DefaultLoginCommand())
DefaultCommands()
pluginManager.loadPlugins() pluginManager.loadPlugins()
CommandListener.start() CommandListener.start()
println(MiraiProperties.HTTP_API_ENABLE) println(MiraiProperties.HTTP_API_ENABLE)
...@@ -59,29 +60,116 @@ object MiraiConsole { ...@@ -59,29 +60,116 @@ object MiraiConsole {
* Defaults Commands are recommend to be replaced by plugin provided commands * Defaults Commands are recommend to be replaced by plugin provided commands
*/ */
object DefaultCommands { object DefaultCommands {
class DefaultLoginCommand : Command( operator fun invoke() {
"login" buildCommand {
) { name = "login"
override fun onCommand(args: List<String>): Boolean { description = "Mirai-Console default bot login command"
if (args.size < 2) { onCommand = {
println("\"/login qqnumber qqpassword \" to login a bot") if (it.size < 2) {
println("\"/login qq号 qq密码 \" 来登录一个BOT") logger("\"/login qqnumber qqpassword \" to login a bot")
return false logger("\"/login qq号 qq密码 \" 来登录一个BOT")
false
}
val qqNumber = it[0].toLong()
val qqPassword = it[1]
println("login...")
try {
runBlocking {
Bot(qqNumber, qqPassword).alsoLogin()
println("$qqNumber login successed")
}
} catch (e: Exception) {
println("$qqNumber login failed")
}
true
} }
val qqNumber = args[0].toLong() }
val qqPassword = args[1]
println("login...") buildCommand {
try { name = "status"
runBlocking { description = "Mirai-Console default status command"
Bot(qqNumber, qqPassword).alsoLogin() onCommand = {
when (it.size) {
0 -> {
}
1 -> {
}
} }
} catch (e: Exception) { true
println("$qqNumber login failed")
} }
return true
} }
}
buildCommand {
name = "say"
description = "Mirai-Console default say command"
onCommand = {
when (it.size) {
0 -> {
}
1 -> {
}
}
true
}
}
buildCommand {
name = "plugins"
alias = listOf("plugin")
description = "show all plugins"
onCommand = {
when (it.size) {
0 -> {
}
1 -> {
}
}
true
}
}
buildCommand {
name = "command"
alias = listOf("commands", "help", "helps")
description = "show all commands"
onCommand = {
when (it.size) {
0 -> {
}
1 -> {
}
}
true
}
}
buildCommand {
name = "about"
description = ""
onCommand = {
when (it.size) {
0 -> {
}
1 -> {
}
}
true
}
}
}
} }
object CommandListener { object CommandListener {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
package net.mamoe.mirai.plugin package net.mamoe.mirai.plugin
import Command import Command
import ICommand
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.serialization.UnstableDefault import kotlinx.serialization.UnstableDefault
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
...@@ -58,7 +59,7 @@ abstract class PluginBase(coroutineContext: CoroutineContext) : CoroutineScope { ...@@ -58,7 +59,7 @@ abstract class PluginBase(coroutineContext: CoroutineContext) : CoroutineScope {
/** /**
* 当任意指令被使用 * 当任意指令被使用
*/ */
open fun onCommand(command: Command, args: List<String>) { open fun onCommand(command: ICommand, args: List<String>) {
} }
...@@ -163,7 +164,7 @@ object PluginManager { ...@@ -163,7 +164,7 @@ object PluginManager {
//已完成加载的 //已完成加载的
private val nameToPluginBaseMap: MutableMap<String, PluginBase> = mutableMapOf() private val nameToPluginBaseMap: MutableMap<String, PluginBase> = mutableMapOf()
fun onCommand(command: Command, args: List<String>) { fun onCommand(command: ICommand, args: List<String>) {
this.nameToPluginBaseMap.values.forEach { this.nameToPluginBaseMap.values.forEach {
it.onCommand(command, args) it.onCommand(command, args)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment