From 48143d7b3c0057a7344993a5d46ff735a03e1037 Mon Sep 17 00:00:00 2001
From: Karlatemp <kar@kasukusakura.com>
Date: Sun, 23 Oct 2022 12:53:26 +0800
Subject: [PATCH] [console] Process signals later if console not yet
 initialized; Ignore window resized signal

---
 .../src/MiraiConsoleTerminalLoader.kt         | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt b/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
index 3efb2fafc..8cf15e300 100644
--- a/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
+++ b/mirai-console/frontend/mirai-console-terminal/src/MiraiConsoleTerminalLoader.kt
@@ -198,6 +198,26 @@ private fun initSignalHandler(): (String) -> Unit {
     val shutdownMonitorLock = AtomicBoolean(false)
     val lastSignalTimestamp = AtomicLong(0)
     return handler@{ signalName ->
+        if (signalName == "WINCH") {
+            // Windows CMD.exe resized
+            return@handler
+        }
+        runCatching {
+            MiraiConsole.mainLogger
+        }.onFailure { // mirai-console not yet initialized
+            System.err.println("[TERMINAL] [WARNING] Received signal $signalName")
+            System.err.println("[TERMINAL] [WARNING] This signal will be processed later because mirai-console not yet initialized.")
+
+            // Try later
+            if (signalName in shutdownSignals) {
+                @OptIn(DelicateCoroutinesApi::class)
+                GlobalScope.launch {
+                    delay(500L)
+                    signalHandler(signalName)
+                }
+            }
+            return@handler
+        }
         // JLine may process other signals
         MiraiConsole.mainLogger.verbose { "Received signal $signalName" }
         if (signalName !in shutdownSignals) return@handler