From 924fa65f6a7ee00719a4c881ef638fd57170bfe4 Mon Sep 17 00:00:00 2001
From: "jiahua.liu" <n@mamoe.net>
Date: Mon, 17 Feb 2020 17:36:22 +0800
Subject: [PATCH] terminal console closable

---
 .../console/MiraiConsoleTerminalLoader.kt     |  2 +-
 .../mirai/console/MiraiConsoleTerminalUI.kt   |  2 +-
 mirai-console/build.gradle.kts                |  3 +-
 .../net/mamoe/mirai/console/MiraiConsole.kt   |  8 +++--
 .../mamoe/mirai/console/MiraiConsoleUIPure.kt | 30 +++++++++++++++++--
 5 files changed, 36 insertions(+), 9 deletions(-)

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
index 5e97c668e..25aebf0ed 100644
--- 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
@@ -12,7 +12,7 @@ class MiraiConsoleTerminalLoader {
                 ).toLowerCase().contains("windows")
             ) {
                 println("[MiraiConsoleTerminalLoader]: 将以Pure[兼容模式]启动Console")
-                MiraiConsole.start(MiraiConsoleUIPure)
+                MiraiConsole.start(MiraiConsoleUIPure())
             } else {
                 MiraiConsoleTerminalUI.start()
                 thread {
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 d27314170..029813bc6 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
@@ -643,7 +643,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI {
             terminal.close()
             exitProcess(0)
         } catch (ignored: Exception) {
-            exitProcess(0)
+
         }
     }
 }
diff --git a/mirai-console/build.gradle.kts b/mirai-console/build.gradle.kts
index ea4cb0589..8ab42c601 100644
--- a/mirai-console/build.gradle.kts
+++ b/mirai-console/build.gradle.kts
@@ -7,7 +7,6 @@ plugins {
 
 apply(plugin = "com.github.johnrengelman.shadow")
 
-
 val kotlinVersion: String by rootProject.ext
 val atomicFuVersion: String by rootProject.ext
 val coroutinesVersion: String by rootProject.ext
@@ -25,7 +24,7 @@ fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version"
 
 tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>() {
     manifest {
-        attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsoleUIPureLoader"
+        attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsolePureLoader"
     }
 }
 
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 9f886eccf..f4bbaafdb 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
@@ -83,8 +83,12 @@ object MiraiConsole {
     fun stop() {
         PluginManager.disableAllPlugins()
         allDown = true
-        bots.forEach {
-            it.get()?.close()
+        try {
+            bots.forEach {
+                it.get()?.close()
+            }
+        } catch (ignored: Exception) {
+
         }
     }
 
diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIPure.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIPure.kt
index de07c0c10..b361e3ce4 100644
--- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIPure.kt
+++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIPure.kt
@@ -1,11 +1,29 @@
 package net.mamoe.mirai.console
 
+import kotlinx.coroutines.delay
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.utils.DefaultLoginSolver
 import net.mamoe.mirai.utils.LoginSolver
 import kotlin.concurrent.thread
 
-object MiraiConsoleUIPure : MiraiConsoleUI {
+class MiraiConsoleUIPure() : MiraiConsoleUI {
+    var requesting = false
+    var requestStr = ""
+
+    init {
+        thread {
+            while (true) {
+                val input = readLine() ?: ""
+                if (requesting) {
+                    requestStr = input
+                    requesting = false
+                } else {
+                    MiraiConsole.CommandListener.commandChannel.offer(input)
+                }
+            }
+        }
+    }
+
     override fun pushLog(identity: Long, message: String) {
         println(message)
     }
@@ -23,7 +41,13 @@ object MiraiConsoleUIPure : MiraiConsoleUI {
     }
 
     override suspend fun requestInput(question: String): String {
-        return readLine() ?: ""
+        requesting = true
+        while (true) {
+            delay(50)
+            if (!requesting) {
+                return requestStr
+            }
+        }
     }
 
     override fun pushBotAdminStatus(identity: Long, admins: List<Long>) {
@@ -41,7 +65,7 @@ class MiraiConsolePureLoader {
     companion object {
         @JvmStatic
         fun main(args: Array<String>) {
-            MiraiConsole.start(MiraiConsoleUIPure)
+            MiraiConsole.start(MiraiConsoleUIPure())
             Runtime.getRuntime().addShutdownHook(thread(start = false) {
                 MiraiConsole.stop()
             })