From aca12a56009a6e16d124b0e8ea5dc50f039051c8 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 15:24:55 +0800 Subject: [PATCH] move terminal --- mirai-console-terminal/build.gradle.kts | 11 ++- .../console/MiraiConsoleTerminalLoader.kt | 18 +++++ .../mirai/console/MiraiConsoleTerminalUI.kt | 81 +++++++++++-------- mirai-console/build.gradle.kts | 6 -- .../net/mamoe/mirai/console/MiraiConsole.kt | 21 ++--- .../mirai/console/MiraiConsoleUIFrontEnd.kt | 1 - 6 files changed, 77 insertions(+), 61 deletions(-) create mode 100644 mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalLoader.kt rename mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt => mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt (90%) diff --git a/mirai-console-terminal/build.gradle.kts b/mirai-console-terminal/build.gradle.kts index 2061c78dd..f95dd4cdb 100644 --- a/mirai-console-terminal/build.gradle.kts +++ b/mirai-console-terminal/build.gradle.kts @@ -8,6 +8,12 @@ plugins { apply(plugin = "com.github.johnrengelman.shadow") +tasks.withType() { + manifest { + attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsoleTerminalLoader" + } +} + val kotlinVersion: String by rootProject.ext val atomicFuVersion: String by rootProject.ext val coroutinesVersion: String by rootProject.ext @@ -29,12 +35,9 @@ dependencies { api(project(":mirai-core")) api(project(":mirai-core-qqandroid")) api(project(":mirai-api-http")) + api(project(":mirai-console")) runtimeOnly(files("../mirai-core-qqandroid/build/classes/kotlin/jvm/main")) runtimeOnly(files("../mirai-core/build/classes/kotlin/jvm/main")) - api(kotlin("serialization")) - api(group = "com.alibaba", name = "fastjson", version = "1.2.62") - 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 diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalLoader.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalLoader.kt new file mode 100644 index 000000000..4b0428601 --- /dev/null +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalLoader.kt @@ -0,0 +1,18 @@ +package net.mamoe.mirai.console + +import kotlin.concurrent.thread + +class MiraiConsoleTerminalLoader { + companion object { + @JvmStatic + fun main(args: Array) { + MiraiConsoleTerminalUI.start() + MiraiConsole.start( + MiraiConsoleTerminalUI + ) + Runtime.getRuntime().addShutdownHook(thread(start = false) { + MiraiConsole.stop() + }) + } + } +} \ No newline at end of file diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt similarity index 90% rename from mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt rename to mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index e91362ea5..a8d14debb 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -16,15 +16,18 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import net.mamoe.mirai.console.MiraiConsoleUI.LoggerDrawer.cleanPage -import net.mamoe.mirai.console.MiraiConsoleUI.LoggerDrawer.drawLog -import net.mamoe.mirai.console.MiraiConsoleUI.LoggerDrawer.redrawLogs +import net.mamoe.mirai.Bot +import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.cleanPage +import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.drawLog +import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.redrawLogs import java.awt.Font import java.io.OutputStream import java.io.PrintStream import java.nio.charset.Charset import java.util.* +import java.util.concurrent.ConcurrentLinkedQueue import kotlin.concurrent.thread +import kotlin.system.exitProcess /** * 此文件不推荐任何人看 @@ -37,31 +40,40 @@ import kotlin.concurrent.thread * */ -@SuppressWarnings("UNCHECKED") -object MiraiConsoleUI { +object MiraiConsoleTerminalUI : MiraiConsoleUIFrontEnd { val cacheLogSize = 50 - val log = mutableMapOf>().also { - it[0L] = - LimitLinkedQueue(cacheLogSize) - it[2821869985L] = - LimitLinkedQueue(cacheLogSize) + override fun pushLog(identity: Long, message: String) { + log[identity]!!.offer(message) + if (identity == screens[currentScreenId]) { + drawLog(message) + } + } + + override fun prePushBot(identity: Long) { + log[identity] = LimitLinkedQueue(cacheLogSize) + botAdminCount[identity] = 0 + screens.add(identity) + } + + override fun pushBot(bot: Bot) { + //nothing to do + } + + override fun pushBotAdminStatus(identity: Long, admins: List) { + botAdminCount[identity] = admins.size } - val botAdminCount = mutableMapOf() - private val screens = mutableListOf(0L, 2821869985L) + val log = mutableMapOf>().also { + it[0L] = LimitLinkedQueue(cacheLogSize) + } + val botAdminCount = mutableMapOf() + + private val screens = mutableListOf(0L) private var currentScreenId = 0 - fun addBotScreen(uin: Long) { - screens.add(uin) - log[uin] = - LimitLinkedQueue(cacheLogSize) - botAdminCount[uin] = 0 - } - - lateinit var terminal: Terminal lateinit var textGraphics: TextGraphics @@ -195,6 +207,9 @@ object MiraiConsoleUI { ) emptyCommand() } + KeyType.Escape -> { + exitProcess(0) + } else -> { if (keyStroke.character != null) { if (keyStroke.character.toInt() == 8) { @@ -360,22 +375,24 @@ object MiraiConsoleUI { } - fun redrawLogs(toDraw: List) { + fun redrawLogs(toDraw: Queue) { //this.cleanPage() currentHeight = 6 var logsToDraw = 0 var vara = 0 + val toPrint = mutableListOf() toDraw.forEach { val heightNeed = (it.length / (terminal.terminalSize.columns - 6)) + 1 vara += heightNeed if (currentHeight + vara < terminal.terminalSize.rows - 4) { logsToDraw++ + toPrint.add(it) } else { return@forEach } } - for (index in 0 until logsToDraw) { - drawLog(toDraw[logsToDraw - index - 1], false) + toPrint.reversed().forEach { + drawLog(it, false) } if (terminal is SwingTerminalFrame) { terminal.flush() @@ -383,13 +400,6 @@ object MiraiConsoleUI { } } - fun pushLog(uin: Long, str: String) { - log[uin]!!.push(str) - if (uin == screens[currentScreenId]) { - drawLog(str) - } - } - var commandBuilder = StringBuilder() fun redrawCommand() { @@ -475,13 +485,14 @@ object MiraiConsoleUI { } } + class LimitLinkedQueue( val limit: Int = 50 -) : LinkedList(), List { - override fun push(e: T) { +) : ConcurrentLinkedQueue() { + override fun offer(e: T): Boolean { if (size >= limit) { - pollLast() + poll() } - super.push(e) + return super.offer(e) } -} \ No newline at end of file +} diff --git a/mirai-console/build.gradle.kts b/mirai-console/build.gradle.kts index af0a2a9b0..540eeb6ff 100644 --- a/mirai-console/build.gradle.kts +++ b/mirai-console/build.gradle.kts @@ -8,12 +8,6 @@ plugins { apply(plugin = "com.github.johnrengelman.shadow") -tasks.withType() { - manifest { - attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsoleLoader" - } -} - val kotlinVersion: String by rootProject.ext val atomicFuVersion: String by rootProject.ext val coroutinesVersion: String by rootProject.ext diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt index cb0d1fffc..6f3b0133e 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt @@ -50,7 +50,11 @@ object MiraiConsole { var coreVersion = "0.15" val build = "Beta" - fun start() { + lateinit var frontEnd: MiraiConsoleUIFrontEnd + fun start( + frontEnd: MiraiConsoleUIFrontEnd + ) { + this.frontEnd = frontEnd 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( @@ -283,7 +287,7 @@ object MiraiConsole { operator fun invoke(identityStr: String, identity: Long, any: Any? = null) { if (any != null) { - MiraiConsoleUI.pushLog(identity, "$identityStr: $any") + frontEnd.pushLog(identity, "$identityStr: $any") } } } @@ -301,18 +305,5 @@ object MiraiConsole { } -class MiraiConsoleLoader { - companion object { - @JvmStatic - fun main(args: Array) { - MiraiConsoleUI.start() - MiraiConsole.start() - Runtime.getRuntime().addShutdownHook(thread(start = false) { - MiraiConsole.stop() - }) - } - } -} - diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIFrontEnd.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIFrontEnd.kt index a4907c0e4..7cadad3e3 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIFrontEnd.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIFrontEnd.kt @@ -14,7 +14,6 @@ interface MiraiConsoleUIFrontEnd { * identity:log所属的screen, Main=0; Bot=Bot.uin */ fun pushLog( - identityString: String, identity: Long, message: String )