From e971fd769dff5c293116a53e61fb3a60bb6357cf Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 20:10:12 +0800 Subject: [PATCH 01/19] =?UTF-8?q?Mirai=20Console=20=EF=BC=88Terminal?= =?UTF-8?q?=EF=BC=89V0.01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mirai/console/MiraiConsoleTerminalUI.kt | 58 +++++++++++++++++-- .../net/mamoe/mirai/console/MiraiConsole.kt | 14 +---- .../net/mamoe/mirai/console/MiraiConsoleUI.kt | 6 ++ .../mamoe/mirai/utils/BotConfigurationJvm.kt | 2 +- 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index 15c5d5940..a6a9d8ad9 100644 --- a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -12,22 +12,24 @@ import com.googlecode.lanterna.terminal.TerminalResizeListener import com.googlecode.lanterna.terminal.swing.SwingTerminal import com.googlecode.lanterna.terminal.swing.SwingTerminalFontConfiguration import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import kotlinx.coroutines.* +import kotlinx.coroutines.io.close +import kotlinx.io.core.IoBuffer +import kotlinx.io.core.use 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 net.mamoe.mirai.utils.LoginSolver +import net.mamoe.mirai.utils.writeChannel import java.awt.Font +import java.io.File import java.io.OutputStream import java.io.PrintStream import java.nio.charset.Charset import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedDeque -import java.util.concurrent.ConcurrentLinkedQueue import kotlin.concurrent.thread import kotlin.system.exitProcess @@ -97,6 +99,52 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { botAdminCount[identity] = admins.size } + override fun createLoginSolver(): LoginSolver { + return object : LoginSolver() { + override suspend fun onSolvePicCaptcha(bot: Bot, data: IoBuffer): String? { + val tempFile: File = createTempFile(suffix = ".png").apply { deleteOnExit() } + withContext(Dispatchers.IO) { + tempFile.createNewFile() + pushLog(0, "[Login Solver]需要图片验证码登录, 验证码为 4 字母") + try { + tempFile.writeChannel().apply { writeFully(data); close() } + pushLog(0, "将会显示字符图片. 若看不清字符图片, 请查看文件 ${tempFile.absolutePath}") + } catch (e: Exception) { + error("[Login Solver]验证码无法保存[Error0001]") + } + } + pushLog(0, "[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车") + return requestInput("[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车")!!.takeUnless { it.isEmpty() || it.length != 4 } + .also { + pushLog(0, "[Login Solver]正在提交[$it]中...") + } + } + + override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? { + pushLog(0, "[Login Solver]需要滑动验证码") + pushLog(0, "[Login Solver]请在任意浏览器中打开以下链接并完成验证码. ") + pushLog(0, "[Login Solver]完成后请输入任意字符 ") + pushLog(0, url) + return requestInput("[Login Solver]完成后请输入任意字符").also { + pushLog(0, "[Login Solver]正在提交中") + } + } + + + override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? { + pushLog(0, "[Login Solver]需要进行账户安全认证") + pushLog(0, "[Login Solver]该账户有[设备锁]/[不常用登陆地点]/[不常用设备登陆]的问题") + pushLog(0, "[Login Solver]完成以下账号认证即可成功登陆|理论本认证在mirai每个账户中最多出现1次") + pushLog(0, "[Login Solver]请将该链接在QQ浏览器中打开并完成认证, 成功后输入任意字符") + pushLog(0, "[Login Solver]这步操作将在后续的版本中优化") + pushLog(0, url) + return requestInput("[Login Solver]完成后请输入任意字符").also { + pushLog(0, "[Login Solver]正在提交中...") + } + } + + } + } val log = ConcurrentHashMap>().also { it[0L] = LimitLinkedQueue(cacheLogSize) 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 62df4dc71..4b46a63c0 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 @@ -123,19 +123,7 @@ object MiraiConsole { runBlocking { frontEnd.prePushBot(qqNumber) val bot = Bot(qqNumber, qqPassword) { - this.loginSolver = DefaultLoginSolver(object : LoginSolverInputReader { - override suspend fun read(question: String): String? { - return frontEnd.requestInput(question) - } - }, - SimpleLogger("Login Helper") { _, message, e -> - logger("[Login Helper]", qqNumber, message) - if (e != null) { - logger("[NETWORK ERROR]", qqNumber, e.toString())//因为在一页 所以可以不打QQ - e.printStackTrace() - } - } - ) + this.loginSolver = frontEnd.createLoginSolver() this.botLoggerSupplier = { SimpleLogger("BOT $qqNumber]") { _, message, e -> logger("[BOT $qqNumber]", qqNumber, message) diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt index a0c7d78ca..f7784ee33 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUI.kt @@ -1,6 +1,7 @@ package net.mamoe.mirai.console import net.mamoe.mirai.Bot +import net.mamoe.mirai.utils.LoginSolver /** * 只需要实现一个这个 传入MiraiConsole 就可以绑定UI层与Console层 @@ -57,4 +58,9 @@ interface MiraiConsoleUI { admins: List ) + /** + * 由UI层创建一个LoginSolver + */ + fun createLoginSolver(): LoginSolver + } \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt index 736e1f6a6..3aa3d1f56 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt @@ -118,7 +118,7 @@ class DefaultLoginSolver( } // Copied from Ktor CIO -private fun File.writeChannel( +public fun File.writeChannel( coroutineContext: CoroutineContext = Dispatchers.IO ): ByteWriteChannel = GlobalScope.reader(CoroutineName("file-writer") + coroutineContext, autoFlush = true) { @Suppress("BlockingMethodInNonBlockingContext") From bb244a8ee43641f923e1920098012145f26622ad Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 20:24:42 +0800 Subject: [PATCH 02/19] Mirai Console Fix --- .../mirai/console/graphical/controller/MiraiController.kt | 5 +++++ .../net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt index c5e77d5fb..e8220e847 100644 --- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt @@ -2,6 +2,7 @@ package net.mamoe.mirai.console.graphical.controller import net.mamoe.mirai.Bot import net.mamoe.mirai.console.MiraiConsoleUI +import net.mamoe.mirai.utils.LoginSolver import tornadofx.Controller class MiraiController : Controller(), MiraiConsoleUI { @@ -28,4 +29,8 @@ class MiraiController : Controller(), MiraiConsoleUI { override fun pushBotAdminStatus(identity: Long, admins: List) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } + + override fun createLoginSolver(): LoginSolver { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } } \ No newline at end of file diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index a6a9d8ad9..bb30b3018 100644 --- a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -107,8 +107,11 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { tempFile.createNewFile() pushLog(0, "[Login Solver]需要图片验证码登录, 验证码为 4 字母") try { - tempFile.writeChannel().apply { writeFully(data); close() } - pushLog(0, "将会显示字符图片. 若看不清字符图片, 请查看文件 ${tempFile.absolutePath}") + tempFile.writeChannel().apply { + writeFully(data) + close() + } + pushLog(0, "请查看文件 ${tempFile.absolutePath}") } catch (e: Exception) { error("[Login Solver]验证码无法保存[Error0001]") } From 13460b93b60b7e19321a0b6ebb4affd9804f671b Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 22:01:48 +0800 Subject: [PATCH 03/19] Mirai Console Fix --- .../mirai/console/MiraiConsoleTerminalUI.kt | 110 ++++++++++-------- 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index bb30b3018..c49858684 100644 --- a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -117,7 +117,8 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { } } pushLog(0, "[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车") - return requestInput("[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车")!!.takeUnless { it.isEmpty() || it.length != 4 } + return requestInput("[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车")!! + .takeUnless { it.isEmpty() || it.length != 4 } .also { pushLog(0, "[Login Solver]正在提交[$it]中...") } @@ -133,7 +134,6 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { } } - override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? { pushLog(0, "[Login Solver]需要进行账户安全认证") pushLog(0, "[Login Solver]该账户有[设备锁]/[不常用登陆地点]/[不常用设备登陆]的问题") @@ -235,13 +235,17 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { var lastJob: Job? = null terminal.addResizeListener(TerminalResizeListener { terminal1: Terminal, newSize: TerminalSize -> lastJob = GlobalScope.launch { - delay(300) - if (lastJob == coroutineContext[Job]) { - terminal.clearScreen() - //inited = false - update() - redrawCommand() - redrawLogs(log[screens[currentScreenId]]!!) + try { + delay(300) + if (lastJob == coroutineContext[Job]) { + terminal.clearScreen() + //inited = false + update() + redrawCommand() + redrawLogs(log[screens[currentScreenId]]!!) + } + } catch (e: Exception) { + pushLog(0, "[UI ERROR] ${e.message}") } } }) @@ -264,45 +268,53 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { System.setErr(System.out) - update() + try { + update() + } catch (e: Exception) { + pushLog(0, "[UI ERROR] ${e.message}") + } val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ') thread { while (true) { - var keyStroke: KeyStroke = terminal.readInput() + try { + var keyStroke: KeyStroke = terminal.readInput() - when (keyStroke.keyType) { - KeyType.ArrowLeft -> { - currentScreenId = - getLeftScreenId() - clearRows(2) - cleanPage() - update() - } - KeyType.ArrowRight -> { - currentScreenId = - getRightScreenId() - clearRows(2) - cleanPage() - update() - } - KeyType.Enter -> { - provideInput(commandBuilder.toString()) - emptyCommand() - } - KeyType.Escape -> { - exitProcess(0) - } - else -> { - if (keyStroke.character != null) { - if (keyStroke.character.toInt() == 8) { - deleteCommandChar() - } - if (keyStroke.character.isLetterOrDigit() || charList.contains(keyStroke.character)) { - addCommandChar(keyStroke.character) + when (keyStroke.keyType) { + KeyType.ArrowLeft -> { + currentScreenId = + getLeftScreenId() + clearRows(2) + cleanPage() + update() + } + KeyType.ArrowRight -> { + currentScreenId = + getRightScreenId() + clearRows(2) + cleanPage() + update() + } + KeyType.Enter -> { + provideInput(commandBuilder.toString()) + emptyCommand() + } + KeyType.Escape -> { + exitProcess(0) + } + else -> { + if (keyStroke.character != null) { + if (keyStroke.character.toInt() == 8) { + deleteCommandChar() + } + if (keyStroke.character.isLetterOrDigit() || charList.contains(keyStroke.character)) { + addCommandChar(keyStroke.character) + } } } } + } catch (e: Exception) { + pushLog(0, "[UI ERROR] ${e.message}") } } } @@ -542,13 +554,17 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { terminal.flush() } else { lastEmpty = GlobalScope.launch { - delay(100) - if (lastEmpty == coroutineContext[Job]) { - terminal.clearScreen() - //inited = false - update() - redrawCommand() - redrawLogs(log[screens[currentScreenId]]!!) + try { + delay(100) + if (lastEmpty == coroutineContext[Job]) { + terminal.clearScreen() + //inited = false + update() + redrawCommand() + redrawLogs(log[screens[currentScreenId]]!!) + } + } catch (e: Exception) { + pushLog(0, "[UI ERROR] ${e.message}") } } } From 168d91e6aa65eed3505f862cd157a24546bbdfa3 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 22:28:45 +0800 Subject: [PATCH 04/19] Console Terminal Chinese Supported --- .../mirai/console/MiraiConsoleTerminalUI.kt | 71 +++++++++++++++---- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index c49858684..7c4355503 100644 --- a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -15,7 +15,6 @@ import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame import kotlinx.coroutines.* import kotlinx.coroutines.io.close import kotlinx.io.core.IoBuffer -import kotlinx.io.core.use import net.mamoe.mirai.Bot import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.cleanPage import net.mamoe.mirai.console.MiraiConsoleTerminalUI.LoggerDrawer.drawLog @@ -44,6 +43,47 @@ import kotlin.system.exitProcess * */ +fun String.actualLength(): Int { + var x = 0 + this.forEach { + if (it.isChineseChar()) { + x += 2 + } else { + x += 1 + } + } + return x +} + +fun String.getSubStringIndexByActualLength(widthMax: Int): Int { + var index = 0 + var currentLength = 0 + this.forEach { + if (it.isChineseChar()) { + currentLength += 2 + } else { + currentLength += 1 + } + if (currentLength > widthMax) { + return@forEach + } + ++index + } + if (index < 2) { + index = 2 + } + return index +} + +fun Char.isChineseChar(): Boolean { + return this.toString().isChineseChar() +} + +fun String.isChineseChar(): Boolean { + return this.matches(Regex("[\u4e00-\u9fa5]")) +} + + object MiraiConsoleTerminalUI : MiraiConsoleUI { val cacheLogSize = 50 var mainTitle = "Mirai Console v0.01 Core v0.15" @@ -365,7 +405,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { textGraphics.foregroundColor = TextColor.ANSI.WHITE textGraphics.backgroundColor = TextColor.ANSI.GREEN - textGraphics.putString((width - mainTitle.length) / 2, 1, mainTitle, SGR.BOLD) + textGraphics.putString((width - mainTitle.actualLength()) / 2, 1, mainTitle, SGR.BOLD) textGraphics.foregroundColor = TextColor.ANSI.DEFAULT textGraphics.backgroundColor = TextColor.ANSI.DEFAULT textGraphics.putString(2, 3, "-".repeat(width - 4)) @@ -380,15 +420,15 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { val leftName = getScreenName(getLeftScreenId()) // clearRows(2) - textGraphics.putString((width - title.length) / 2 - "$leftName << ".length, 2, "$leftName << ") + textGraphics.putString((width - title.actualLength()) / 2 - "$leftName << ".length, 2, "$leftName << ") textGraphics.foregroundColor = TextColor.ANSI.WHITE textGraphics.backgroundColor = TextColor.ANSI.YELLOW - textGraphics.putString((width - title.length) / 2, 2, title, SGR.BOLD) + textGraphics.putString((width - title.actualLength()) / 2, 2, title, SGR.BOLD) textGraphics.foregroundColor = TextColor.ANSI.DEFAULT textGraphics.backgroundColor = TextColor.ANSI.DEFAULT val rightName = getScreenName(getRightScreenId()) - textGraphics.putString((width + title.length) / 2 + 1, 2, ">> $rightName") + textGraphics.putString((width + title.actualLength()) / 2 + 1, 2, ">> $rightName") } fun drawMainFrame( @@ -401,7 +441,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { clearRows(4) textGraphics.putString(2, 4, "|Online Bots: $onlineBotCount") textGraphics.putString( - width - 2 - "Powered By Mamoe Technologies|".length, + width - 2 - "Powered By Mamoe Technologies|".actualLength(), 4, "Powered By Mamoe Technologies|" ) @@ -417,7 +457,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { textGraphics.backgroundColor = TextColor.ANSI.DEFAULT clearRows(4) textGraphics.putString(2, 4, "|Admins: $adminCount") - textGraphics.putString(width - 2 - "Add admins via commands|".length, 4, "Add admins via commands|") + textGraphics.putString(width - 2 - "Add admins via commands|".actualLength(), 4, "Add admins via commands|") } @@ -426,20 +466,25 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { fun drawLog(string: String, flush: Boolean = true) { val maxHeight = terminal.terminalSize.rows - 4 - val heightNeed = (string.length / (terminal.terminalSize.columns - 6)) + 1 + val heightNeed = (string.actualLength() / (terminal.terminalSize.columns - 6)) + 1 if (heightNeed - 1 > maxHeight) { return//拒绝打印 } if (currentHeight + heightNeed > maxHeight) { cleanPage() } - val width = terminal.terminalSize.columns - 7 + val width = terminal.terminalSize.columns - 6 var x = string while (true) { if (x == "") break - val toWrite = if (x.length > width) { - x.substring(0, width).also { - x = x.substring(width) + val toWrite = if (x.actualLength() > width) { + val index = x.getSubStringIndexByActualLength(width) + x.substring(0, index).also { + x = if (index < x.length) { + x.substring(index) + } else { + "" + } } } else { x.also { @@ -479,7 +524,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { var vara = 0 val toPrint = mutableListOf() toDraw.forEach { - val heightNeed = (it.length / (terminal.terminalSize.columns - 6)) + 1 + val heightNeed = (it.actualLength() / (terminal.terminalSize.columns - 6)) + 1 vara += heightNeed if (currentHeight + vara < terminal.terminalSize.rows - 4) { logsToDraw++ From a2ae001fe1a63b76983482aab03b108cf1960397 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 22:44:56 +0800 Subject: [PATCH 05/19] Console Terminal Chinese Supported --- .../mirai/console/MiraiConsoleTerminalUI.kt | 74 ++++++++++++------- .../mamoe/mirai/utils/BotConfigurationJvm.kt | 2 +- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt index 7c4355503..5fe7a4dd4 100644 --- a/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt +++ b/mirai-console-terminal/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleTerminalUI.kt @@ -15,11 +15,13 @@ import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame import kotlinx.coroutines.* import kotlinx.coroutines.io.close import kotlinx.io.core.IoBuffer +import kotlinx.io.core.use 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 net.mamoe.mirai.utils.LoginSolver +import net.mamoe.mirai.utils.createCharImg import net.mamoe.mirai.utils.writeChannel import java.awt.Font import java.io.File @@ -29,6 +31,7 @@ import java.nio.charset.Charset import java.util.* import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedDeque +import javax.imageio.ImageIO import kotlin.concurrent.thread import kotlin.system.exitProcess @@ -156,7 +159,17 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { error("[Login Solver]验证码无法保存[Error0001]") } } - pushLog(0, "[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车") + + var toLog = "" + tempFile.inputStream().use { + val img = ImageIO.read(it) + if (img == null) { + toLog += "无法创建字符图片. 请查看文件\n" + } else { + toLog += img.createCharImg((terminal.terminalSize.columns / 1.5).toInt()) + } + } + pushLog(0, "$toLog[Login Solver]请输验证码. ${tempFile.absolutePath}") return requestInput("[Login Solver]请输入 4 位字母验证码. 若要更换验证码, 请直接回车")!! .takeUnless { it.isEmpty() || it.length != 4 } .also { @@ -468,40 +481,47 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { val maxHeight = terminal.terminalSize.rows - 4 val heightNeed = (string.actualLength() / (terminal.terminalSize.columns - 6)) + 1 if (heightNeed - 1 > maxHeight) { + pushLog(0, "[UI ERROR]: 您的屏幕太小, 有一条超长LOG无法显示") return//拒绝打印 } if (currentHeight + heightNeed > maxHeight) { - cleanPage() + cleanPage()//翻页 } - val width = terminal.terminalSize.columns - 6 - var x = string - while (true) { - if (x == "") break - val toWrite = if (x.actualLength() > width) { - val index = x.getSubStringIndexByActualLength(width) - x.substring(0, index).also { - x = if (index < x.length) { - x.substring(index) - } else { - "" + if (string.contains("\n")) { + string.split("\n").forEach { + drawLog(string, false) + } + } else { + val width = terminal.terminalSize.columns - 6 + var x = string + while (true) { + if (x == "") break + val toWrite = if (x.actualLength() > width) { + val index = x.getSubStringIndexByActualLength(width) + x.substring(0, index).also { + x = if (index < x.length) { + x.substring(index) + } else { + "" + } + } + } else { + x.also { + x = "" } } - } else { - x.also { - x = "" + try { + textGraphics.foregroundColor = TextColor.ANSI.GREEN + textGraphics.backgroundColor = TextColor.ANSI.DEFAULT + textGraphics.putString( + 3, + currentHeight, toWrite, SGR.ITALIC + ) + } catch (ignored: Exception) { + // } + ++currentHeight } - try { - textGraphics.foregroundColor = TextColor.ANSI.GREEN - textGraphics.backgroundColor = TextColor.ANSI.DEFAULT - textGraphics.putString( - 3, - currentHeight, toWrite, SGR.ITALIC - ) - } catch (ignored: Exception) { - // - } - ++currentHeight } if (flush && terminal is SwingTerminalFrame) { terminal.flush() diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt index 3aa3d1f56..fe4402025 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/BotConfigurationJvm.kt @@ -134,7 +134,7 @@ private val loginSolverLock = Mutex() /** * @author NaturalHG */ -private fun BufferedImage.createCharImg(outputWidth: Int = 100, ignoreRate: Double = 0.95): String { +public fun BufferedImage.createCharImg(outputWidth: Int = 100, ignoreRate: Double = 0.95): String { val newHeight = (this.height * (outputWidth.toDouble() / this.width)).toInt() val tmp = this.getScaledInstance(outputWidth, newHeight, Image.SCALE_SMOOTH) val image = BufferedImage(outputWidth, newHeight, BufferedImage.TYPE_INT_ARGB) From 5e0fb8c90e7ae1a097b6f22c899fd06fffc7c2e0 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:16:28 +0800 Subject: [PATCH 06/19] change readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fcfe92cb7..ff626045b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Mirai + +#
Mirai
+ [![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/) From aed2f3f7d9373a8f3008fb4540440108833386dd Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:24:02 +0800 Subject: [PATCH 07/19] change readme --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ff626045b..1d77e4f79 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ - -#
Mirai
+
+ + logo + +

Mirai

[![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/) + +
+ **[English](README-eng.md)** 多平台 **QQ Android 和 TimPC** 协议支持库与高效率的机器人框架. From a1a921c65d286c135eebdfd876f14987d7330be5 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:33:02 +0800 Subject: [PATCH 08/19] update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1d77e4f79..d8ebdb5c6 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@
- - logo - -

Mirai

- + + logo + logo + [![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/)
+###Mirai **[English](README-eng.md)** 多平台 **QQ Android 和 TimPC** 协议支持库与高效率的机器人框架. From caaadbbb86899476b52c6f72ce4ecad101ce30b8 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:34:10 +0800 Subject: [PATCH 09/19] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d8ebdb5c6..7fa13f147 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- logo + logo
logo [![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) From c77926b2dba77191b31feb674f84708ba277c7dd Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:35:46 +0800 Subject: [PATCH 10/19] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7fa13f147..43b458dfc 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@
-###Mirai +### Mirai **[English](README-eng.md)** 多平台 **QQ Android 和 TimPC** 协议支持库与高效率的机器人框架. From 44607c4a9df64f36264d5f4412554508f318615b Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:36:22 +0800 Subject: [PATCH 11/19] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43b458dfc..f3d26615b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ -### Mirai +## Mirai **[English](README-eng.md)** 多平台 **QQ Android 和 TimPC** 协议支持库与高效率的机器人框架. From 04a51b72648b07b6709bac31e1a8043ad982908b Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Sun, 16 Feb 2020 23:54:49 +0800 Subject: [PATCH 12/19] update readme --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index f3d26615b..1b9d4247c 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,25 @@ [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/) +Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持库与高效率的机器人框架 + +这个项目的名字和图标来源于 + + + + ## Mirai From 1a1b625ad4196ae1d1d3e92499687431afd68064 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:04:05 +0800 Subject: [PATCH 13/19] update readme --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1b9d4247c..07d4afbd2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持库与高效率的机器人框架 -这个项目的名字和图标来源于 +这个项目的名字来源于 + + - - - + + + 图标以及形象由画师DazeCake绘制 ## Mirai From 46570f288373761e78f77d2800d36c87600c1600 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:04:44 +0800 Subject: [PATCH 14/19] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 07d4afbd2..bb36ae3bc 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持 From 41c470675efa404a459e10b74c049e97953a6a33 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:05:29 +0800 Subject: [PATCH 15/19] update readme --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bb36ae3bc..c2c1de9ad 100644 --- a/README.md +++ b/README.md @@ -10,23 +10,22 @@ Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持库与高效率的机器人框架 这个项目的名字来源于 - + + - + + 图标以及形象由画师DazeCake绘制 From 9db1577fdc1bfa3b0122d06b3db25e13b1f531fa Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:07:29 +0800 Subject: [PATCH 16/19] update readme --- README.md | 21 +++---------------- .../src/main/kotlin/demo/gentleman/a.html | 17 +++++++++++++++ 2 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/a.html diff --git a/README.md b/README.md index c2c1de9ad..532721095 100644 --- a/README.md +++ b/README.md @@ -10,24 +10,9 @@ Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持库与高效率的机器人框架 这个项目的名字来源于 - - - -
- - 初音未来 - 的线下创作文化活动 - (Magical Mirai) - -
- - 图标以及形象由画师DazeCake绘制 +

京都动画作品《境界的彼方》栗山未来(Kuriyama Mirai)

+

初音未来的线下创作文化活动(Magical Mirai)

+图标以及形象由画师DazeCake绘制 ## Mirai diff --git a/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/a.html b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/a.html new file mode 100644 index 000000000..b999fbdbb --- /dev/null +++ b/mirai-demos/mirai-demo-gentleman/src/main/kotlin/demo/gentleman/a.html @@ -0,0 +1,17 @@ + + + + + + + + +

京都动画作品《境界的彼方》栗山未来(Kuriyama Mirai)

+

初音未来的线下创作文化活动(Magical + Mirai)

+ + + + \ No newline at end of file From c74dfe7ee12a94ba7f58c1f4c158addabd14f61f Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 17 Feb 2020 00:10:13 +0800 Subject: [PATCH 17/19] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 532721095..3e964e5ea 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/) -Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持库与高效率的机器人框架 +Mirai 是一个在全平台下运行,提供 QQ Android 和 TIM PC 协议支持的高效率机器人框架 这个项目的名字来源于

京都动画作品《境界的彼方》栗山未来(Kuriyama Mirai)

From 38baca0b4e7ed6c815471899822b618c78db0bbc Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:10:14 +0800 Subject: [PATCH 18/19] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 532721095..e5ebe876d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Mirai 是一个在全平台下运行,提供QQ Android 和 TimPC 协议支持 这个项目的名字来源于

京都动画作品《境界的彼方》栗山未来(Kuriyama Mirai)

-

初音未来的线下创作文化活动(Magical Mirai)

+

CRYPTON初音未来的线下创作文化活动(Magical Mirai)

图标以及形象由画师DazeCake绘制 From 37caec9954d393462b46dd13cdecd05d8a913221 Mon Sep 17 00:00:00 2001 From: "jiahua.liu" Date: Mon, 17 Feb 2020 00:13:43 +0800 Subject: [PATCH 19/19] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 084023735..214b999dc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@
logo
- logo - + title +---- [![Gitter](https://badges.gitter.im/mamoe/mirai.svg)](https://gitter.im/mamoe/mirai?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Actions Status](https://github.com/mamoe/mirai/workflows/CI/badge.svg)](https://github.com/mamoe/mirai/actions) [![Download](https://api.bintray.com/packages/him188moe/mirai/mirai-core/images/download.svg)](https://bintray.com/him188moe/mirai/mirai-core/)