diff --git a/mirai-console/build.gradle.kts b/mirai-console/build.gradle.kts index e822dbf6c..931d5481e 100644 --- a/mirai-console/build.gradle.kts +++ b/mirai-console/build.gradle.kts @@ -43,5 +43,6 @@ dependencies { api(group = "org.yaml", name = "snakeyaml", version = "1.25") api(group = "com.moandjiezana.toml", name = "toml4j", version = "0.7.2") api(group = "com.googlecode.lanterna", name = "lanterna", version = "3.0.2") + api("org.bouncycastle:bcprov-jdk15on:1.64") // classpath is not set correctly by IDE } \ No newline at end of file diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsole.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsole.kt index 16466e74a..a708e464a 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsole.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsole.kt @@ -10,19 +10,22 @@ package net.mamoe.mirai */ import kotlinx.coroutines.runBlocking +import net.mamoe.mirai.api.http.MiraiHttpAPIServer +import net.mamoe.mirai.api.http.generateSessionKey +import net.mamoe.mirai.contact.sendMessage import net.mamoe.mirai.plugins.PluginManager import net.mamoe.mirai.plugins.loadAsConfig import net.mamoe.mirai.plugins.withDefaultWrite import net.mamoe.mirai.plugins.withDefaultWriteSave -import net.mamoe.mirai.api.http.MiraiHttpAPIServer -import net.mamoe.mirai.api.http.generateSessionKey -import net.mamoe.mirai.contact.sendMessage -import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.SimpleLogger +import org.bouncycastle.jce.provider.BouncyCastleProvider import java.io.File -import java.io.PrintStream +import java.security.Security +import java.util.* +import java.util.concurrent.LinkedBlockingQueue import kotlin.concurrent.thread + object MiraiConsole { val bots get() = Bot.instances @@ -48,7 +51,6 @@ object MiraiConsole { val build = "Beta" fun start() { - MiraiConsoleUI.start() logger("Mirai-console [v$version $build | core version v$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") @@ -65,7 +67,6 @@ object MiraiConsole { logger("Mirai-console 启动完成") logger("\"/login qqnumber qqpassword \" to login a bot") logger("\"/login qq号 qq密码 \" 来登陆一个BOT") - } fun stop() { @@ -108,14 +109,15 @@ object MiraiConsole { } val qqNumber = it[0].toLong() val qqPassword = it[1] - logger("login...") + logger("[Bot Login]", 0, "login...") try { runBlocking { Bot(qqNumber, qqPassword).alsoLogin() - println("$qqNumber login successes") + logger("[Bot Login]", 0, "$qqNumber login successes") } } catch (e: Exception) { - println("$qqNumber login failed") + logger("[Bot Login]", 0, "$qqNumber login failed -> " + e.message) + e.printStackTrace() } true } @@ -234,14 +236,15 @@ object MiraiConsole { } object CommandListener { + val commandChannel: Queue = LinkedBlockingQueue() fun start() { thread { - //processNextCommandLine() + processNextCommandLine() } } tailrec fun processNextCommandLine() { - var fullCommand = readLine() + var fullCommand = commandChannel.poll() if (fullCommand != null) { if (!fullCommand.startsWith("/")) { fullCommand = "/$fullCommand" @@ -283,11 +286,14 @@ class MiraiConsoleLoader { companion object { @JvmStatic fun main(args: Array) { + Security.removeProvider("BC") + Security.addProvider(BouncyCastleProvider()) + //Security.addProvider(BouncyCastle) + MiraiConsoleUI.start() MiraiConsole.start() Runtime.getRuntime().addShutdownHook(thread(start = false) { MiraiConsole.stop() }) - } } } diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsoleUI.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsoleUI.kt index ead768705..9d8ab7540 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsoleUI.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/MiraiConsoleUI.kt @@ -70,6 +70,11 @@ object MiraiConsoleUI { hasStart = true val defaultTerminalFactory = DefaultTerminalFactory(internalPrinter, System.`in`, Charset.defaultCharset()) + defaultTerminalFactory.setInitialTerminalSize( + TerminalSize( + 90, 120 + ) + ) try { terminal = defaultTerminalFactory.createTerminal() terminal.enterPrivateMode() @@ -168,6 +173,7 @@ object MiraiConsoleUI { update() } KeyType.Enter -> { + MiraiConsole.CommandListener.commandChannel.offer(commandBuilder.toString()) emptyCommand() } else -> { @@ -290,8 +296,6 @@ object MiraiConsoleUI { if (currentHeight + heightNeed > maxHeight) { cleanPage() } - textGraphics.foregroundColor = TextColor.ANSI.GREEN - textGraphics.backgroundColor = TextColor.ANSI.DEFAULT val width = terminal.terminalSize.columns - 7 var x = string while (true) { @@ -306,6 +310,8 @@ object MiraiConsoleUI { } } try { + textGraphics.foregroundColor = TextColor.ANSI.GREEN + textGraphics.backgroundColor = TextColor.ANSI.DEFAULT textGraphics.putString(3, currentHeight, toWrite, SGR.ITALIC) } catch (ignored: Exception) { // @@ -401,11 +407,23 @@ object MiraiConsoleUI { } + var lastEmpty: Job? = null private fun emptyCommand() { commandBuilder = StringBuilder() - redrawCommand() if (terminal is SwingTerminal) { + redrawCommand() terminal.flush() + } else { + lastEmpty = GlobalScope.launch { + delay(100) + if (lastEmpty == coroutineContext[Job]) { + terminal.clearScreen() + //inited = false + update() + redrawCommand() + redrawLogs(log[screens[currentScreenId]]!!) + } + } } }