mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-28 16:50:09 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
5de27d47b9
@ -1,5 +1,6 @@
|
|||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console
|
||||||
|
|
||||||
|
import net.mamoe.mirai.console.pure.MiraiConsoleUIPure
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
class MiraiConsoleTerminalLoader {
|
class MiraiConsoleTerminalLoader {
|
||||||
|
@ -19,6 +19,7 @@ import net.mamoe.mirai.Bot
|
|||||||
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.cleanPage
|
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.cleanPage
|
||||||
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.drawLog
|
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.drawLog
|
||||||
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.redrawLogs
|
import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.redrawLogs
|
||||||
|
import net.mamoe.mirai.console.utils.MiraiConsoleUI
|
||||||
import net.mamoe.mirai.utils.LoginSolver
|
import net.mamoe.mirai.utils.LoginSolver
|
||||||
import net.mamoe.mirai.utils.createCharImg
|
import net.mamoe.mirai.utils.createCharImg
|
||||||
import net.mamoe.mirai.utils.writeChannel
|
import net.mamoe.mirai.utils.writeChannel
|
||||||
@ -129,9 +130,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
|
|||||||
requestResult = input
|
requestResult = input
|
||||||
requesting = false
|
requesting = false
|
||||||
} else {
|
} else {
|
||||||
MiraiConsole.CommandListener.commandChannel.send(
|
MiraiConsole.CommandProcessor.runConsoleCommand(commandBuilder.toString())
|
||||||
commandBuilder.toString()
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version"
|
|||||||
|
|
||||||
tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>() {
|
tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>() {
|
||||||
manifest {
|
manifest {
|
||||||
attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsolePureLoader"
|
attributes["Main-Class"] = "net.mamoe.mirai.console.pure.MiraiConsolePureLoader"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,16 +14,17 @@ import kotlinx.coroutines.channels.Channel
|
|||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
import net.mamoe.mirai.api.http.MiraiHttpAPIServer
|
import net.mamoe.mirai.api.http.MiraiHttpAPIServer
|
||||||
import net.mamoe.mirai.api.http.generateSessionKey
|
import net.mamoe.mirai.api.http.generateSessionKey
|
||||||
import net.mamoe.mirai.console.MiraiConsole.CommandListener.processNextCommandLine
|
import net.mamoe.mirai.console.MiraiConsole.CommandProcessor.processNextCommandLine
|
||||||
|
import net.mamoe.mirai.console.command.*
|
||||||
import net.mamoe.mirai.console.plugins.PluginManager
|
import net.mamoe.mirai.console.plugins.PluginManager
|
||||||
import net.mamoe.mirai.console.plugins.loadAsConfig
|
import net.mamoe.mirai.console.plugins.loadAsConfig
|
||||||
import net.mamoe.mirai.console.plugins.withDefaultWrite
|
import net.mamoe.mirai.console.plugins.withDefaultWrite
|
||||||
import net.mamoe.mirai.console.plugins.withDefaultWriteSave
|
import net.mamoe.mirai.console.plugins.withDefaultWriteSave
|
||||||
|
import net.mamoe.mirai.console.utils.MiraiConsoleUI
|
||||||
|
import net.mamoe.mirai.console.utils.checkManager
|
||||||
import net.mamoe.mirai.contact.sendMessage
|
import net.mamoe.mirai.contact.sendMessage
|
||||||
import net.mamoe.mirai.utils.DeviceInfo
|
import net.mamoe.mirai.event.subscribeMessages
|
||||||
import net.mamoe.mirai.utils.FileBasedDeviceInfo
|
|
||||||
import net.mamoe.mirai.utils.SimpleLogger
|
import net.mamoe.mirai.utils.SimpleLogger
|
||||||
import net.mamoe.mirai.utils.SystemDeviceInfo
|
|
||||||
import net.mamoe.mirai.utils.cryptor.ECDH
|
import net.mamoe.mirai.utils.cryptor.ECDH
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.security.Security
|
import java.security.Security
|
||||||
@ -31,8 +32,18 @@ import java.util.*
|
|||||||
|
|
||||||
|
|
||||||
object MiraiConsole {
|
object MiraiConsole {
|
||||||
val bots
|
/**
|
||||||
get() = Bot.instances
|
* 发布的版本号 统一修改位置
|
||||||
|
*/
|
||||||
|
val version = "v0.01"
|
||||||
|
var coreVersion = "v0.18.0"
|
||||||
|
val build = "Alpha"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取从Console登陆上的Bot, Bots
|
||||||
|
* */
|
||||||
|
val bots get() = Bot.instances
|
||||||
|
|
||||||
fun getBotByUIN(uin: Long): Bot? {
|
fun getBotByUIN(uin: Long): Bot? {
|
||||||
bots.forEach {
|
bots.forEach {
|
||||||
@ -43,50 +54,64 @@ object MiraiConsole {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
val pluginManager: PluginManager
|
/**
|
||||||
get() = PluginManager
|
* PluginManager
|
||||||
|
*/
|
||||||
|
val pluginManager: PluginManager get() = PluginManager
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与前端交互所使用的Logger
|
||||||
|
*/
|
||||||
var logger = UIPushLogger
|
var logger = UIPushLogger
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Console运行路径
|
||||||
|
*/
|
||||||
var path: String = System.getProperty("user.dir")
|
var path: String = System.getProperty("user.dir")
|
||||||
|
|
||||||
private val version = "v0.01"
|
/**
|
||||||
private var coreVersion = "v0.18.0"
|
* Console前端接口
|
||||||
private val build = "Zeta"
|
*/
|
||||||
|
|
||||||
private var allDown = false
|
|
||||||
|
|
||||||
lateinit var frontEnd: MiraiConsoleUI
|
lateinit var frontEnd: MiraiConsoleUI
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动Console
|
||||||
|
*/
|
||||||
|
var start = false
|
||||||
|
|
||||||
fun start(
|
fun start(
|
||||||
frontEnd: MiraiConsoleUI
|
frontEnd: MiraiConsoleUI
|
||||||
) {
|
) {
|
||||||
|
if (start) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
start = true
|
||||||
|
|
||||||
|
/* 加载ECDH */
|
||||||
try {
|
try {
|
||||||
ECDH()
|
ECDH()
|
||||||
} catch (ignored: Exception) {
|
} catch (ignored: Exception) {
|
||||||
|
|
||||||
}
|
}
|
||||||
Security.removeProvider("BC")
|
//Security.removeProvider("BC")
|
||||||
|
|
||||||
|
|
||||||
|
/* 初始化前端 */
|
||||||
this.frontEnd = frontEnd
|
this.frontEnd = frontEnd
|
||||||
frontEnd.pushVersion(
|
frontEnd.pushVersion(version, build, coreVersion)
|
||||||
version, build, coreVersion
|
logger("Mirai-console [$version $build | core version $coreVersion] is still in testing stage, major features are available")
|
||||||
)
|
logger("Mirai-console now running under $path")
|
||||||
logger("Mirai-console [$version $build | core version $coreVersion] is still in testing stage, majority feature is available")
|
|
||||||
logger(
|
|
||||||
"Mirai-console now running under " + System.getProperty(
|
|
||||||
"user.dir"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
logger("Get news in github: https://github.com/mamoe/mirai")
|
logger("Get news in github: https://github.com/mamoe/mirai")
|
||||||
logger("Mirai为开源项目,请自觉遵守开源项目协议")
|
logger("Mirai为开源项目,请自觉遵守开源项目协议")
|
||||||
logger("Powered by Mamoe Technologies and contributors")
|
logger("Powered by Mamoe Technologies and contributors")
|
||||||
|
|
||||||
|
/* 依次启用功能 */
|
||||||
DefaultCommands()
|
DefaultCommands()
|
||||||
HTTPAPIAdaptar()
|
HTTPAPIAdaptar()
|
||||||
pluginManager.loadPlugins()
|
pluginManager.loadPlugins()
|
||||||
CommandListener.start()
|
CommandProcessor.start()
|
||||||
|
|
||||||
|
/* 通知启动完成 */
|
||||||
logger("Mirai-console 启动完成")
|
logger("Mirai-console 启动完成")
|
||||||
logger("\"/login qqnumber qqpassword \" to login a bot")
|
logger("\"/login qqnumber qqpassword \" to login a bot")
|
||||||
logger("\"/login qq号 qq密码 \" 来登录一个BOT")
|
logger("\"/login qq号 qq密码 \" 来登录一个BOT")
|
||||||
@ -94,7 +119,6 @@ object MiraiConsole {
|
|||||||
|
|
||||||
fun stop() {
|
fun stop() {
|
||||||
PluginManager.disableAllPlugins()
|
PluginManager.disableAllPlugins()
|
||||||
allDown = true
|
|
||||||
try {
|
try {
|
||||||
bots.forEach {
|
bots.forEach {
|
||||||
it.get()?.close()
|
it.get()?.close()
|
||||||
@ -104,218 +128,44 @@ object MiraiConsole {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object HTTPAPIAdaptar {
|
|
||||||
operator fun invoke() {
|
|
||||||
if (MiraiProperties.HTTP_API_ENABLE) {
|
|
||||||
if (MiraiProperties.HTTP_API_AUTH_KEY.startsWith("InitKey")) {
|
|
||||||
logger("请尽快更改初始生成的HTTP API AUTHKEY")
|
|
||||||
}
|
|
||||||
logger("正在启动HTTPAPI; 端口=" + MiraiProperties.HTTP_API_PORT)
|
|
||||||
MiraiHttpAPIServer.logger = SimpleLogger("HTTP API") { _, message, e ->
|
|
||||||
logger("[Mirai HTTP API]", 0, message)
|
|
||||||
}
|
|
||||||
MiraiHttpAPIServer.start(
|
|
||||||
MiraiProperties.HTTP_API_PORT,
|
|
||||||
MiraiProperties.HTTP_API_AUTH_KEY
|
|
||||||
)
|
|
||||||
logger("HTTPAPI启动完成; 端口= " + MiraiProperties.HTTP_API_PORT)
|
|
||||||
|
|
||||||
}
|
object CommandProcessor : Job by {
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defaults Commands are recommend to be replaced by plugin provided commands
|
|
||||||
*/
|
|
||||||
object DefaultCommands {
|
|
||||||
operator fun invoke() {
|
|
||||||
registerCommand {
|
|
||||||
name = "login"
|
|
||||||
description = "Mirai-Console default bot login command"
|
|
||||||
onCommand {
|
|
||||||
if (it.size < 2) {
|
|
||||||
logger("\"/login qqnumber qqpassword \" to login a bot")
|
|
||||||
logger("\"/login qq号 qq密码 \" 来登录一个BOT")
|
|
||||||
return@onCommand false
|
|
||||||
}
|
|
||||||
val qqNumber = it[0].toLong()
|
|
||||||
val qqPassword = it[1]
|
|
||||||
logger("[Bot Login]", 0, "login...")
|
|
||||||
try {
|
|
||||||
frontEnd.prePushBot(qqNumber)
|
|
||||||
val bot = Bot(qqNumber, qqPassword) {
|
|
||||||
this.loginSolver = frontEnd.createLoginSolver()
|
|
||||||
this.botLoggerSupplier = {
|
|
||||||
SimpleLogger("BOT $qqNumber]") { _, message, e ->
|
|
||||||
logger("[BOT $qqNumber]", qqNumber, message)
|
|
||||||
if (e != null) {
|
|
||||||
logger("[NETWORK ERROR]", qqNumber, e.toString())//因为在一页 所以可以不打QQ
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.networkLoggerSupplier = {
|
|
||||||
SimpleLogger("BOT $qqNumber") { _, message, e ->
|
|
||||||
logger("[NETWORK]", qqNumber, message)//因为在一页 所以可以不打QQ
|
|
||||||
if (e != null) {
|
|
||||||
logger("[NETWORK ERROR]", qqNumber, e.toString())//因为在一页 所以可以不打QQ
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bot.login()
|
|
||||||
logger(
|
|
||||||
"[Bot Login]",
|
|
||||||
0,
|
|
||||||
"$qqNumber login successes"
|
|
||||||
)
|
|
||||||
frontEnd.pushBot(bot)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
logger(
|
|
||||||
"[Bot Login]",
|
|
||||||
0,
|
|
||||||
"$qqNumber login failed -> " + e.message
|
|
||||||
)
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
registerCommand {
|
|
||||||
name = "status"
|
|
||||||
description = "Mirai-Console default status command"
|
|
||||||
onCommand {
|
|
||||||
when (it.size) {
|
|
||||||
0 -> {
|
|
||||||
logger("当前有" + bots.size + "个BOT在线")
|
|
||||||
}
|
|
||||||
1 -> {
|
|
||||||
val bot = it[0]
|
|
||||||
var find = false
|
|
||||||
bots.forEach {
|
|
||||||
if (it.get()?.uin.toString().contains(bot)) {
|
|
||||||
find = true
|
|
||||||
logger("" + it.get()?.uin + ": 在线中; 好友数量:" + it.get()?.qqs?.size + "; 群组数量:" + it.get()?.groups?.size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!find) {
|
|
||||||
logger("没有找到BOT$bot")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
registerCommand {
|
|
||||||
name = "say"
|
|
||||||
description = "Mirai-Console default say command"
|
|
||||||
onCommand {
|
|
||||||
if (it.size < 2) {
|
|
||||||
logger("say [好友qq号或者群号] [文本消息] //将默认使用第一个BOT")
|
|
||||||
logger("say [bot号] [好友qq号或者群号] [文本消息]")
|
|
||||||
return@onCommand false
|
|
||||||
}
|
|
||||||
val bot: Bot? = if (it.size == 2) {
|
|
||||||
if (bots.size == 0) {
|
|
||||||
logger("还没有BOT登录")
|
|
||||||
return@onCommand false
|
|
||||||
}
|
|
||||||
bots[0].get()
|
|
||||||
} else {
|
|
||||||
getBotByUIN(it[0].toLong())
|
|
||||||
}
|
|
||||||
if (bot == null) {
|
|
||||||
logger("没有找到BOT")
|
|
||||||
return@onCommand false
|
|
||||||
}
|
|
||||||
val target = it[it.size - 2].toLong()
|
|
||||||
val message = it[it.size - 1]
|
|
||||||
try {
|
|
||||||
val contact = bot[target]
|
|
||||||
runBlocking {
|
|
||||||
contact.sendMessage(message)
|
|
||||||
logger("消息已推送")
|
|
||||||
}
|
|
||||||
} catch (e: NoSuchElementException) {
|
|
||||||
logger("没有找到群或好友 号码为${target}")
|
|
||||||
return@onCommand false
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
registerCommand {
|
|
||||||
name = "plugins"
|
|
||||||
alias = listOf("plugin")
|
|
||||||
description = "show all plugins"
|
|
||||||
onCommand {
|
|
||||||
PluginManager.getAllPluginDescriptions().let {
|
|
||||||
println("loaded " + it.size + " plugins")
|
|
||||||
it.forEach {
|
|
||||||
logger("\t" + it.name + " v" + it.version + " by" + it.author + " " + it.info)
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
registerCommand {
|
|
||||||
name = "command"
|
|
||||||
alias = listOf("commands", "help", "helps")
|
|
||||||
description = "show all commands"
|
|
||||||
onCommand {
|
|
||||||
CommandManager.getCommands().let {
|
|
||||||
println("currently have " + it.size + " commands")
|
|
||||||
it.toSet().forEach {
|
|
||||||
logger("\t" + it.name + " :" + it.description)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
registerCommand {
|
|
||||||
name = "about"
|
|
||||||
description = "About Mirai-Console"
|
|
||||||
onCommand {
|
|
||||||
logger("v$version $build is still in testing stage, majority feature is available")
|
|
||||||
logger(
|
|
||||||
"now running under " + System.getProperty(
|
|
||||||
"user.dir"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
logger("在Github中获取项目最新进展: https://github.com/mamoe/mirai")
|
|
||||||
logger("Mirai为开源项目,请自觉遵守开源项目协议")
|
|
||||||
logger("Powered by Mamoe Technologies and contributors")
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object CommandListener : Job by {
|
|
||||||
GlobalScope.launch(start = CoroutineStart.LAZY) {
|
GlobalScope.launch(start = CoroutineStart.LAZY) {
|
||||||
processNextCommandLine()
|
processNextCommandLine()
|
||||||
}
|
}
|
||||||
}() {
|
}() {
|
||||||
val commandChannel: Channel<String> = Channel()
|
|
||||||
|
|
||||||
suspend fun processNextCommandLine() {
|
internal class FullCommand(
|
||||||
if (allDown) {
|
val sender: CommandSender,
|
||||||
return
|
val commandStr: String
|
||||||
}
|
)
|
||||||
|
|
||||||
|
private val commandChannel: Channel<FullCommand> = Channel()
|
||||||
|
|
||||||
|
suspend fun runConsoleCommand(command: String) {
|
||||||
|
commandChannel.send(
|
||||||
|
FullCommand(ConsoleCommandSender, command)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun runCommand(sender: CommandSender, command: String) {
|
||||||
|
commandChannel.send(
|
||||||
|
FullCommand(sender, command)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun runConsoleCommandBlocking(command: String) = runBlocking { runConsoleCommand(command) }
|
||||||
|
|
||||||
|
fun runCommandBlocking(sender: CommandSender, command: String) = runBlocking { runCommand(sender, command) }
|
||||||
|
|
||||||
|
private suspend fun processNextCommandLine() {
|
||||||
for (command in commandChannel) {
|
for (command in commandChannel) {
|
||||||
var fullCommand = command
|
var commandStr = command.commandStr
|
||||||
if (!fullCommand.startsWith("/")) {
|
if (!commandStr.startsWith("/")) {
|
||||||
fullCommand = "/$fullCommand"
|
commandStr = "/$commandStr"
|
||||||
}
|
}
|
||||||
if (!CommandManager.runCommand(ConsoleCommandSender, fullCommand)) {
|
if (!CommandManager.runCommand(command.sender, commandStr)) {
|
||||||
logger("未知指令 $fullCommand")
|
logger("未知指令 $commandStr")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -337,16 +187,35 @@ object MiraiConsole {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object MiraiProperties {
|
}
|
||||||
var config = File("$path/mirai.properties").loadAsConfig()
|
|
||||||
|
|
||||||
var HTTP_API_ENABLE: Boolean by config.withDefaultWrite { true }
|
object MiraiProperties {
|
||||||
var HTTP_API_PORT: Int by config.withDefaultWrite { 8080 }
|
var config = File("${MiraiConsole.path}/mirai.properties").loadAsConfig()
|
||||||
var HTTP_API_AUTH_KEY: String by config.withDefaultWriteSave {
|
|
||||||
"InitKey" + generateSessionKey()
|
var HTTP_API_ENABLE: Boolean by config.withDefaultWrite { true }
|
||||||
|
var HTTP_API_PORT: Int by config.withDefaultWrite { 8080 }
|
||||||
|
var HTTP_API_AUTH_KEY: String by config.withDefaultWriteSave {
|
||||||
|
"InitKey" + generateSessionKey()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object HTTPAPIAdaptar {
|
||||||
|
operator fun invoke() {
|
||||||
|
if (MiraiProperties.HTTP_API_ENABLE) {
|
||||||
|
if (MiraiProperties.HTTP_API_AUTH_KEY.startsWith("InitKey")) {
|
||||||
|
MiraiConsole.logger("请尽快更改初始生成的HTTP API AUTHKEY")
|
||||||
|
}
|
||||||
|
MiraiConsole.logger("正在启动HTTPAPI; 端口=" + MiraiProperties.HTTP_API_PORT)
|
||||||
|
MiraiHttpAPIServer.logger = SimpleLogger("HTTP API") { _, message, e ->
|
||||||
|
MiraiConsole.logger("[Mirai HTTP API]", 0, message)
|
||||||
|
}
|
||||||
|
MiraiHttpAPIServer.start(
|
||||||
|
MiraiProperties.HTTP_API_PORT,
|
||||||
|
MiraiProperties.HTTP_API_AUTH_KEY
|
||||||
|
)
|
||||||
|
MiraiConsole.logger("HTTPAPI启动完成; 端口= " + MiraiProperties.HTTP_API_PORT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,17 +7,23 @@
|
|||||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console.command
|
||||||
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
import net.mamoe.mirai.console.plugins.PluginManager
|
import net.mamoe.mirai.console.plugins.PluginManager
|
||||||
import net.mamoe.mirai.contact.Contact
|
import net.mamoe.mirai.contact.Contact
|
||||||
import net.mamoe.mirai.contact.QQ
|
import net.mamoe.mirai.contact.Group
|
||||||
import net.mamoe.mirai.contact.sendMessage
|
import net.mamoe.mirai.contact.sendMessage
|
||||||
|
import net.mamoe.mirai.message.GroupMessage
|
||||||
|
import net.mamoe.mirai.message.MessageReceipt
|
||||||
import net.mamoe.mirai.message.data.MessageChain
|
import net.mamoe.mirai.message.data.MessageChain
|
||||||
|
import net.mamoe.mirai.message.data.quote
|
||||||
|
import net.mamoe.mirai.message.data.toMessage
|
||||||
|
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||||
|
import java.lang.StringBuilder
|
||||||
|
|
||||||
object CommandManager {
|
object CommandManager {
|
||||||
private val registeredCommand: MutableMap<String, Command> = mutableMapOf()
|
private val registeredCommand: MutableMap<String, Command> = mutableMapOf()
|
||||||
@ -50,7 +56,10 @@ object CommandManager {
|
|||||||
registeredCommand.remove(commandName)
|
registeredCommand.remove(commandName)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun runCommand(sender: CommandSender, fullCommand: String): Boolean {
|
/*
|
||||||
|
* Index: MiraiConsole
|
||||||
|
* */
|
||||||
|
internal suspend fun runCommand(sender: CommandSender, fullCommand: String): Boolean {
|
||||||
val blocks = fullCommand.split(" ")
|
val blocks = fullCommand.split(" ")
|
||||||
val commandHead = blocks[0].replace("/", "")
|
val commandHead = blocks[0].replace("/", "")
|
||||||
if (!registeredCommand.containsKey(commandHead)) {
|
if (!registeredCommand.containsKey(commandHead)) {
|
||||||
@ -58,12 +67,19 @@ object CommandManager {
|
|||||||
}
|
}
|
||||||
val args = blocks.subList(1, blocks.size)
|
val args = blocks.subList(1, blocks.size)
|
||||||
registeredCommand[commandHead]?.run {
|
registeredCommand[commandHead]?.run {
|
||||||
if (onCommand(
|
try {
|
||||||
sender,
|
if (onCommand(
|
||||||
blocks.subList(1, blocks.size)
|
sender,
|
||||||
)
|
blocks.subList(1, blocks.size)
|
||||||
) {
|
)
|
||||||
PluginManager.onCommand(this, args)
|
) {
|
||||||
|
PluginManager.onCommand(this, args)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
sender.sendMessage("在运行指令时出现了未知错误")
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
(sender as CommandSenderImpl).flushMessage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@ -72,25 +88,46 @@ object CommandManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface CommandSender {
|
interface CommandSender {
|
||||||
|
/**
|
||||||
|
* 立刻发送一条Message
|
||||||
|
*/
|
||||||
suspend fun sendMessage(messageChain: MessageChain)
|
suspend fun sendMessage(messageChain: MessageChain)
|
||||||
|
|
||||||
suspend fun sendMessage(message: String)
|
suspend fun sendMessage(message: String)
|
||||||
|
/**
|
||||||
|
* 写入要发送的内容 所有内容最后会被以一条发出, 不管成功与否
|
||||||
|
*/
|
||||||
|
fun appendMessage(message: String)
|
||||||
|
|
||||||
fun sendMessageBlocking(messageChain: MessageChain) = runBlocking { sendMessage(messageChain) }
|
fun sendMessageBlocking(messageChain: MessageChain) = runBlocking { sendMessage(messageChain) }
|
||||||
fun sendMessageBlocking(message: String) = runBlocking { sendMessage(message) }
|
fun sendMessageBlocking(message: String) = runBlocking { sendMessage(message) }
|
||||||
}
|
}
|
||||||
|
|
||||||
object ConsoleCommandSender : CommandSender {
|
abstract class CommandSenderImpl : CommandSender {
|
||||||
override suspend fun sendMessage(messageChain: MessageChain) {
|
private val builder = StringBuilder()
|
||||||
MiraiConsole.logger(messageChain.toString())
|
|
||||||
|
override fun appendMessage(message: String) {
|
||||||
|
builder.append(message).append("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun sendMessage(message: String) {
|
internal suspend fun flushMessage() {
|
||||||
MiraiConsole.logger(message)
|
if (!builder.isEmpty()) {
|
||||||
|
sendMessage(builder.toString().removeSuffix("\n"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ContactCommandSender(val contact: Contact) : CommandSender {
|
object ConsoleCommandSender : CommandSenderImpl() {
|
||||||
|
override suspend fun sendMessage(messageChain: MessageChain) {
|
||||||
|
MiraiConsole.logger("[Command]", 0, messageChain.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun sendMessage(message: String) {
|
||||||
|
MiraiConsole.logger("[Command]", 0, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class ContactCommandSender(val contact: Contact) : CommandSenderImpl() {
|
||||||
override suspend fun sendMessage(messageChain: MessageChain) {
|
override suspend fun sendMessage(messageChain: MessageChain) {
|
||||||
contact.sendMessage(messageChain)
|
contact.sendMessage(messageChain)
|
||||||
}
|
}
|
||||||
@ -100,6 +137,20 @@ class ContactCommandSender(val contact: Contact) : CommandSender {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弃用中
|
||||||
|
* */
|
||||||
|
class GroupCommandSender(val toQuote: GroupMessage, contact: Contact) : ContactCommandSender(contact) {
|
||||||
|
@MiraiExperimentalAPI
|
||||||
|
override suspend fun sendMessage(message: String) {
|
||||||
|
toQuote.quoteReply(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
@MiraiExperimentalAPI
|
||||||
|
override suspend fun sendMessage(messageChain: MessageChain) {
|
||||||
|
toQuote.quoteReply(messageChain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface Command {
|
interface Command {
|
||||||
val name: String
|
val name: String
|
||||||
@ -163,7 +214,12 @@ class CommandBuilder internal constructor() {
|
|||||||
if (alias == null) {
|
if (alias == null) {
|
||||||
alias = listOf()
|
alias = listOf()
|
||||||
}
|
}
|
||||||
return AnonymousCommand(name!!, alias!!, description, onCommand!!).also { it.register() }
|
return AnonymousCommand(
|
||||||
|
name!!,
|
||||||
|
alias!!,
|
||||||
|
description,
|
||||||
|
onCommand!!
|
||||||
|
).also { it.register() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,272 @@
|
|||||||
|
package net.mamoe.mirai.console.command
|
||||||
|
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
|
import net.mamoe.mirai.console.plugins.PluginManager
|
||||||
|
import net.mamoe.mirai.console.utils.addManager
|
||||||
|
import net.mamoe.mirai.console.utils.checkManager
|
||||||
|
import net.mamoe.mirai.console.utils.getManagers
|
||||||
|
import net.mamoe.mirai.console.utils.removeManager
|
||||||
|
import net.mamoe.mirai.contact.sendMessage
|
||||||
|
import net.mamoe.mirai.event.subscribeMessages
|
||||||
|
import net.mamoe.mirai.message.GroupMessage
|
||||||
|
import net.mamoe.mirai.utils.SimpleLogger
|
||||||
|
import java.lang.StringBuilder
|
||||||
|
import java.util.NoSuchElementException
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some defaults commands are recommend to be replaced by plugin provided commands
|
||||||
|
*/
|
||||||
|
|
||||||
|
object DefaultCommands {
|
||||||
|
operator fun invoke() {
|
||||||
|
registerCommand {
|
||||||
|
name = "manager"
|
||||||
|
description = "Add a manager"
|
||||||
|
onCommand { it ->
|
||||||
|
if (this !is ConsoleCommandSender) {
|
||||||
|
sendMessage("请在后台使用该指令")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
if (it.size < 2) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "/manager add [bot ID] [Manager ID]")
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "/manager remove [bot ID] [Manager ID]")
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "/manager list [bot ID]")
|
||||||
|
return@onCommand true
|
||||||
|
}
|
||||||
|
val botId = try {
|
||||||
|
it[1].toLong()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[1] + " 不是一个Bot的ID")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
val bot = MiraiConsole.getBotByUIN(botId)
|
||||||
|
if (bot == null) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "$botId 没有在Console中登陆")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
when (it[0]) {
|
||||||
|
"add" -> {
|
||||||
|
if (it.size < 3) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "/manager add [bot ID] [Manager ID]")
|
||||||
|
return@onCommand true
|
||||||
|
}
|
||||||
|
val adminID = try {
|
||||||
|
it[2].toLong()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[2] + " 不是一个ID")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
bot.addManager(adminID)
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[2] + "增加成功")
|
||||||
|
}
|
||||||
|
"remove" -> {
|
||||||
|
if (it.size < 3) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, "/manager remove [bot ID] [Manager ID]")
|
||||||
|
return@onCommand true
|
||||||
|
}
|
||||||
|
val adminID = try {
|
||||||
|
it[2].toLong()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[1] + " 不是一个ID")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
if (!bot.checkManager(adminID)) {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[2] + "本身不是一个Manager")
|
||||||
|
return@onCommand true
|
||||||
|
}
|
||||||
|
bot.removeManager(adminID)
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, it[2] + "移除成功")
|
||||||
|
}
|
||||||
|
"list" -> {
|
||||||
|
bot.getManagers().forEach {
|
||||||
|
MiraiConsole.logger("[Bot Manager]", 0, " -> $it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return@onCommand true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "login"
|
||||||
|
description = "机器人登陆"
|
||||||
|
onCommand {
|
||||||
|
if (this !is ConsoleCommandSender) {
|
||||||
|
sendMessage("请在后台使用该指令")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
if (it.size < 2) {
|
||||||
|
MiraiConsole.logger("\"/login qqnumber qqpassword \" to login a bot")
|
||||||
|
MiraiConsole.logger("\"/login qq号 qq密码 \" 来登录一个BOT")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
val qqNumber = it[0].toLong()
|
||||||
|
val qqPassword = it[1]
|
||||||
|
MiraiConsole.logger("[Bot Login]", 0, "login...")
|
||||||
|
try {
|
||||||
|
MiraiConsole.frontEnd.prePushBot(qqNumber)
|
||||||
|
val bot = Bot(qqNumber, qqPassword) {
|
||||||
|
this.loginSolver = MiraiConsole.frontEnd.createLoginSolver()
|
||||||
|
this.botLoggerSupplier = {
|
||||||
|
SimpleLogger("BOT $qqNumber]") { _, message, e ->
|
||||||
|
MiraiConsole.logger("[BOT $qqNumber]", qqNumber, message)
|
||||||
|
if (e != null) {
|
||||||
|
MiraiConsole.logger("[NETWORK ERROR]", qqNumber, e.toString())//因为在一页 所以可以不打QQ
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.networkLoggerSupplier = {
|
||||||
|
SimpleLogger("BOT $qqNumber") { _, message, e ->
|
||||||
|
MiraiConsole.logger("[NETWORK]", qqNumber, message)//因为在一页 所以可以不打QQ
|
||||||
|
if (e != null) {
|
||||||
|
MiraiConsole.logger("[NETWORK ERROR]", qqNumber, e.toString())//因为在一页 所以可以不打QQ
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bot.login()
|
||||||
|
bot.subscribeMessages {
|
||||||
|
contains("test") {
|
||||||
|
if (this is GroupMessage) {
|
||||||
|
quoteReply("Hello $senderName")
|
||||||
|
} else {
|
||||||
|
reply("Hello!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.startsWith("/") {
|
||||||
|
if (bot.checkManager(this.sender.id)) {
|
||||||
|
val sender = ContactCommandSender(this.subject)
|
||||||
|
MiraiConsole.CommandProcessor.runCommand(
|
||||||
|
sender, it
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sendMessage("$qqNumber login successes")
|
||||||
|
MiraiConsole.frontEnd.pushBot(bot)
|
||||||
|
|
||||||
|
} catch (e: Exception) {
|
||||||
|
sendMessage("$qqNumber login failed -> " + e.message)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "status"
|
||||||
|
description = "获取状态"
|
||||||
|
onCommand {
|
||||||
|
when (it.size) {
|
||||||
|
0 -> {
|
||||||
|
sendMessage("当前有" + MiraiConsole.bots.size + "个BOT在线")
|
||||||
|
}
|
||||||
|
1 -> {
|
||||||
|
val bot = it[0]
|
||||||
|
var find = false
|
||||||
|
MiraiConsole.bots.forEach {
|
||||||
|
if (it.get()?.uin.toString().contains(bot)) {
|
||||||
|
find = true
|
||||||
|
appendMessage("" + it.get()?.uin + ": 在线中; 好友数量:" + it.get()?.qqs?.size + "; 群组数量:" + it.get()?.groups?.size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!find) {
|
||||||
|
sendMessage("没有找到BOT$bot")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "say"
|
||||||
|
description = "聊天功能演示"
|
||||||
|
onCommand {
|
||||||
|
if (it.size < 2) {
|
||||||
|
MiraiConsole.logger("say [好友qq号或者群号] [文本消息] //将默认使用第一个BOT")
|
||||||
|
MiraiConsole.logger("say [bot号] [好友qq号或者群号] [文本消息]")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
val bot: Bot? = if (it.size == 2) {
|
||||||
|
if (MiraiConsole.bots.size == 0) {
|
||||||
|
MiraiConsole.logger("还没有BOT登录")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
MiraiConsole.bots[0].get()
|
||||||
|
} else {
|
||||||
|
MiraiConsole.getBotByUIN(it[0].toLong())
|
||||||
|
}
|
||||||
|
if (bot == null) {
|
||||||
|
MiraiConsole.logger("没有找到BOT")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
val target = it[it.size - 2].toLong()
|
||||||
|
val message = it[it.size - 1]
|
||||||
|
try {
|
||||||
|
val contact = bot[target]
|
||||||
|
runBlocking {
|
||||||
|
contact.sendMessage(message)
|
||||||
|
MiraiConsole.logger("消息已推送")
|
||||||
|
}
|
||||||
|
} catch (e: NoSuchElementException) {
|
||||||
|
MiraiConsole.logger("没有找到群或好友 号码为${target}")
|
||||||
|
return@onCommand false
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "plugins"
|
||||||
|
alias = listOf("plugin")
|
||||||
|
description = "获取插件列表"
|
||||||
|
onCommand {
|
||||||
|
PluginManager.getAllPluginDescriptions().let {
|
||||||
|
it.forEach {
|
||||||
|
appendMessage("\t" + it.name + " v" + it.version + " by" + it.author + " " + it.info)
|
||||||
|
}
|
||||||
|
appendMessage("加载了" + it.size + "个插件")
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "command"
|
||||||
|
alias = listOf("commands", "help", "helps")
|
||||||
|
description = "获取指令列表"
|
||||||
|
onCommand {
|
||||||
|
CommandManager.getCommands().let {
|
||||||
|
var size = 0
|
||||||
|
it.toSet().forEach {
|
||||||
|
++size
|
||||||
|
appendMessage("-> " + it.name + " :" + it.description)
|
||||||
|
}
|
||||||
|
appendMessage("""共有${size}条指令""")
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCommand {
|
||||||
|
name = "about"
|
||||||
|
description = "About Mirai-Console"
|
||||||
|
onCommand {
|
||||||
|
appendMessage("v${MiraiConsole.version} ${MiraiConsole.build} is still in testing stage, major features are available")
|
||||||
|
appendMessage("now running under ${MiraiConsole.path}")
|
||||||
|
appendMessage("在Github中获取项目最新进展: https://github.com/mamoe/mirai")
|
||||||
|
appendMessage("Mirai为开源项目,请自觉遵守开源项目协议")
|
||||||
|
appendMessage("Powered by Mamoe Technologies and contributors")
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -21,6 +21,7 @@ import org.yaml.snakeyaml.Yaml
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
import kotlin.collections.LinkedHashMap
|
||||||
import kotlin.properties.ReadWriteProperty
|
import kotlin.properties.ReadWriteProperty
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
@ -211,7 +212,15 @@ fun <T : Any> Config._smartCast(propertyName: String, _class: KClass<T>): T {
|
|||||||
|
|
||||||
interface ConfigSection : Config, MutableMap<String, Any> {
|
interface ConfigSection : Config, MutableMap<String, Any> {
|
||||||
override fun getConfigSection(key: String): ConfigSection {
|
override fun getConfigSection(key: String): ConfigSection {
|
||||||
return (get(key) ?: error("ConfigSection does not contain $key ")) as ConfigSection
|
val content = get(key) ?: error("ConfigSection does not contain $key ")
|
||||||
|
if (content is ConfigSection) {
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
return ConfigSectionDelegation(
|
||||||
|
Collections.synchronizedMap(
|
||||||
|
(get(key) ?: error("ConfigSection does not contain $key ")) as LinkedHashMap<String, Any>
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getString(key: String): String {
|
override fun getString(key: String): String {
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
package net.mamoe.mirai.console.plugins
|
package net.mamoe.mirai.console.plugins
|
||||||
|
|
||||||
import net.mamoe.mirai.console.Command
|
import net.mamoe.mirai.console.command.Command
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import net.mamoe.mirai.console.MiraiConsole
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
import net.mamoe.mirai.utils.DefaultLogger
|
import net.mamoe.mirai.utils.DefaultLogger
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console.pure
|
||||||
|
|
||||||
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
class MiraiConsolePureLoader {
|
class MiraiConsolePureLoader {
|
@ -7,11 +7,12 @@
|
|||||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console.pure
|
||||||
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
|
import net.mamoe.mirai.console.utils.MiraiConsoleUI
|
||||||
import net.mamoe.mirai.utils.DefaultLoginSolver
|
import net.mamoe.mirai.utils.DefaultLoginSolver
|
||||||
import net.mamoe.mirai.utils.LoginSolver
|
import net.mamoe.mirai.utils.LoginSolver
|
||||||
import net.mamoe.mirai.utils.LoginSolverInputReader
|
import net.mamoe.mirai.utils.LoginSolverInputReader
|
||||||
@ -29,9 +30,7 @@ class MiraiConsoleUIPure : MiraiConsoleUI {
|
|||||||
requestStr = input
|
requestStr = input
|
||||||
requesting = false
|
requesting = false
|
||||||
} else {
|
} else {
|
||||||
runBlocking {
|
MiraiConsole.CommandProcessor.runConsoleCommandBlocking(input)
|
||||||
MiraiConsole.CommandListener.commandChannel.send(input)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package net.mamoe.mirai.console.utils
|
||||||
|
|
||||||
|
import net.mamoe.mirai.Bot
|
||||||
|
import net.mamoe.mirai.console.MiraiConsole
|
||||||
|
import net.mamoe.mirai.console.MiraiProperties
|
||||||
|
import net.mamoe.mirai.console.utils.BotManagers.BOT_MANAGERS
|
||||||
|
import net.mamoe.mirai.console.plugins.ConfigSection
|
||||||
|
import net.mamoe.mirai.console.plugins.ConfigSectionImpl
|
||||||
|
import net.mamoe.mirai.console.plugins.loadAsConfig
|
||||||
|
import net.mamoe.mirai.console.plugins.withDefaultWriteSave
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
object BotManagers {
|
||||||
|
val config = File("${MiraiConsole.path}/bot.yml").loadAsConfig()
|
||||||
|
val BOT_MANAGERS: ConfigSection by config.withDefaultWriteSave { ConfigSectionImpl() }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Bot.addManager(long: Long) {
|
||||||
|
BOT_MANAGERS.putIfAbsent(this.uin.toString(), mutableListOf<Long>())
|
||||||
|
BOT_MANAGERS[this.uin.toString()] =
|
||||||
|
(BOT_MANAGERS.getLongList(this.uin.toString()) as MutableList<Long>).apply { add(long) }
|
||||||
|
BotManagers.config.save()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Bot.removeManager(long: Long) {
|
||||||
|
BOT_MANAGERS.putIfAbsent(this.uin.toString(), mutableListOf<Long>())
|
||||||
|
BOT_MANAGERS[this.uin.toString()] =
|
||||||
|
(BOT_MANAGERS.getLongList(this.uin.toString()) as MutableList<Long>).apply { add(long) }
|
||||||
|
BotManagers.config.save()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Bot.getManagers(): List<Long> {
|
||||||
|
BOT_MANAGERS.putIfAbsent(this.uin.toString(), mutableListOf<Long>())
|
||||||
|
return BOT_MANAGERS.getLongList(this.uin.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Bot.checkManager(long: Long): Boolean {
|
||||||
|
return this.getManagers().contains(long)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package net.mamoe.mirai.console
|
package net.mamoe.mirai.console.utils
|
||||||
|
|
||||||
import net.mamoe.mirai.Bot
|
import net.mamoe.mirai.Bot
|
||||||
import net.mamoe.mirai.utils.LoginSolver
|
import net.mamoe.mirai.utils.LoginSolver
|
Loading…
Reference in New Issue
Block a user