diff --git a/mirai-console/backend/mirai-console/src/internal/command/builtin/LoginCommandImpl.kt b/mirai-console/backend/mirai-console/src/internal/command/builtin/LoginCommandImpl.kt index a3d16fc3f..0d2b80f8c 100644 --- a/mirai-console/backend/mirai-console/src/internal/command/builtin/LoginCommandImpl.kt +++ b/mirai-console/backend/mirai-console/src/internal/command/builtin/LoginCommandImpl.kt @@ -45,7 +45,30 @@ internal open class LoginCommandImpl : SimpleCommand( protocol: BotConfiguration.MiraiProtocol? = null, ) { fun BotConfiguration.setup(protocol: BotConfiguration.MiraiProtocol?): BotConfiguration { - if (protocol != null) this.protocol = protocol + val config = DataScope.get() + val account = config.accounts.firstOrNull { it.account == id.toString() } + if (account != null) { + account.configuration[AutoLoginConfig.Account.ConfigurationKey.protocol]?.let { protocol -> + try { + this.protocol = BotConfiguration.MiraiProtocol.valueOf(protocol.toString()) + } catch (_: Throwable) { + // + } + } + account.configuration[AutoLoginConfig.Account.ConfigurationKey.heartbeatStrategy]?.let { heartStrate -> + try { + this.heartbeatStrategy = BotConfiguration.HeartbeatStrategy.valueOf(heartStrate.toString()) + } catch (_: Throwable) { + // + } + } + account.configuration[AutoLoginConfig.Account.ConfigurationKey.device]?.let { device -> + fileBasedDeviceInfo(device.toString()) + } + } + if (protocol != null) { + this.protocol = protocol + } return this } diff --git a/mirai-console/backend/mirai-console/test/command/LoginCommandTest.kt b/mirai-console/backend/mirai-console/test/command/LoginCommandTest.kt index f966ff1a5..9f839e281 100644 --- a/mirai-console/backend/mirai-console/test/command/LoginCommandTest.kt +++ b/mirai-console/backend/mirai-console/test/command/LoginCommandTest.kt @@ -21,11 +21,13 @@ 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 import net.mamoe.mirai.internal.QQAndroidBot +import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.md5 import net.mamoe.mirai.utils.toUHexString import kotlin.test.Test import kotlin.test.assertContentEquals import kotlin.test.assertEquals +import kotlin.test.assertNotNull @OptIn(ExperimentalCommandDescriptors::class) internal class LoginCommandTest : AbstractCommandTest() { @@ -107,6 +109,41 @@ internal class LoginCommandTest : AbstractCommandTest() { assertContentEquals(myPwd.md5(), account.passwordMd5) assertEquals(myId, account.id) } + + @Test + fun `login with saved configuration`() = runTest { + val myId = 123L + val myPwd = "password001" + + dataScope.set(AutoLoginConfig().apply { + accounts.add( + Account( + account = myId.toString(), + password = Account.Password(PasswordKind.MD5, myPwd.md5().toUHexString("")), + configuration = mapOf( + Account.ConfigurationKey.protocol to BotConfiguration.MiraiProtocol.ANDROID_PAD.name, + Account.ConfigurationKey.device to "device.new.json", + Account.ConfigurationKey.heartbeatStrategy to BotConfiguration.HeartbeatStrategy.REGISTER.name + ) + ) + ) + }) + + val bot = awaitDeferred { cont -> + val command = object : LoginCommandImpl() { + override suspend fun doLogin(bot: Bot) { + cont.complete(bot as QQAndroidBot) + } + } + command.register(true) + command.execute(consoleSender, "$myId") + } + + val configuration = bot.configuration + assertEquals(BotConfiguration.MiraiProtocol.ANDROID_PAD, configuration.protocol) + assertEquals(BotConfiguration.HeartbeatStrategy.REGISTER, configuration.heartbeatStrategy) + assertNotNull(configuration.deviceInfo) + } } @BuilderInference