diff --git a/backend/mirai-console/src/command/BuiltInCommands.kt b/backend/mirai-console/src/command/BuiltInCommands.kt index d0e3a6361..e5dc7e7a9 100644 --- a/backend/mirai-console/src/command/BuiltInCommands.kt +++ b/backend/mirai-console/src/command/BuiltInCommands.kt @@ -27,6 +27,7 @@ import net.mamoe.mirai.console.internal.command.CommandManagerImpl import net.mamoe.mirai.console.internal.command.CommandManagerImpl.allRegisteredCommands import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.* +import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN import net.mamoe.mirai.console.internal.permission.BuiltInPermissionService import net.mamoe.mirai.console.internal.plugin.PluginManagerImpl @@ -182,15 +183,30 @@ public object BuiltInCommands { @JvmOverloads public suspend fun CommandSender.handle( @Name("qq") id: Long, - password: String, + password: String? = null, protocol: BotConfiguration.MiraiProtocol? = null, ) { + fun BotConfiguration.setup(protocol: BotConfiguration.MiraiProtocol?): BotConfiguration { + if (protocol != null) this.protocol = protocol + return this + } + + suspend fun getPassword(id: Long): Any? { + val acc = AutoLoginConfig.accounts.firstOrNull { it.account == id.toString() } + if (acc == null) { + sendMessage("Could not find '$id' in AutoLogin config. Please specify password.") + return null + } + return if (acc.password.kind == MD5) acc.password.value.toByteArray() else acc.password.value + } + + val pwd: Any = password ?: getPassword(id) ?: return kotlin.runCatching { - MiraiConsole.addBot(id, password) { - if (protocol != null) { - this.protocol = protocol - } - }.doLogin() + when (pwd) { + is String -> MiraiConsole.addBot(id, pwd) { setup(protocol) }.doLogin() + is ByteArray -> MiraiConsole.addBot(id, pwd) { setup(protocol) }.doLogin() + else -> throw AssertionError("Assertion failed, please report to https://github.com/mamoe/mirai-console/issues/new/choose, debug=${pwd.javaClass}")// Unreachable + } }.fold( onSuccess = { scopeWith(ConsoleCommandSender).sendMessage("${it.nick} ($id) Login successful") }, onFailure = { throwable -> diff --git a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt index 096b8d5eb..020c26d0f 100644 --- a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt +++ b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt @@ -217,7 +217,9 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI phase("auto-login bots") { runBlocking { val accounts = AutoLoginConfig.accounts.toList() - for (account in accounts) { + for (account in accounts.filter { + it.configuration[ConfigurationKey.enable]?.toString()?.equals("true", true) ?: true + }) { val id = kotlin.runCatching { account.account.toLong() }.getOrElse { diff --git a/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt b/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt index a2922565a..d6e8a862f 100644 --- a/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt +++ b/backend/mirai-console/src/internal/data/builtins/AutoLoginConfig.kt @@ -36,6 +36,7 @@ public object AutoLoginConfig : AutoSavePluginConfig("AutoLogin") { 账号配置. 可用配置列表 (注意大小写): "protocol": "ANDROID_PHONE" / "ANDROID_PAD" / "ANDROID_WATCH" "device": "device.json" + "enable": true """ ) val configuration: Map = mapOf(), @@ -53,6 +54,7 @@ public object AutoLoginConfig : AutoSavePluginConfig("AutoLogin") { public enum class ConfigurationKey { protocol, device, + enable, ; @@ -89,7 +91,8 @@ public object AutoLoginConfig : AutoSavePluginConfig("AutoLogin") { password = Account.Password(Account.PasswordKind.PLAIN, "pwd"), configuration = mapOf( Account.ConfigurationKey.protocol to "ANDROID_PHONE", - Account.ConfigurationKey.device to "device.json" + Account.ConfigurationKey.device to "device.json", + Account.ConfigurationKey.enable to true ) ) )