diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e365cd46c..70e881e1f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,9 +9,15 @@ jobs: steps: - uses: actions/checkout@v1 - - name: setup-android - uses: msfjarvis/setup-android@0.2 + - name: Setup Java JDK + uses: actions/setup-java@v1.3.0 with: - # Gradle tasks to run - If you want to run ./gradlew assemble, specify assemble here. - gradleTasks: build -x mirai-core:jvmTest - + # The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x) + java-version: 11 + # The package type (jre, jdk, jdk+fx) + java-package: jdk+fx + - name: Gradle Command + uses: eskatos/gradle-command-action@v1 + with: + # Gradle command line arguments, see gradle --help + arguments: build -x mirai-core:jvmTest diff --git a/README.md b/README.md index 5de5177bf..62d24d219 100644 --- a/README.md +++ b/README.md @@ -187,3 +187,4 @@ bot.subscribeAlways { ## Acknowledgement 特别感谢 [JetBrains](https://www.jetbrains.com/?from=mirai) 为开源项目提供免费的 [IntelliJ IDEA](https://www.jetbrains.com/idea/?from=mirai) 等 IDE 的授权 [](https://www.jetbrains.com/?from=mirai) + \ No newline at end of file diff --git a/mirai-console-graphical/build.gradle.kts b/mirai-console-graphical/build.gradle.kts index e52642d61..ab92cffa2 100644 --- a/mirai-console-graphical/build.gradle.kts +++ b/mirai-console-graphical/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { api(project(":mirai-console")) runtimeOnly(files("../mirai-core-qqandroid/build/classes/kotlin/jvm/main")) api(group = "no.tornado", name = "tornadofx", version = "1.7.19") + api(group = "com.jfoenix", name = "jfoenix", version = "9.0.8") api("org.bouncycastle:bcprov-jdk15on:1.64") // classpath is not set correctly by IDE } diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt index 1900e25cc..51e229cbd 100644 --- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt @@ -2,7 +2,6 @@ package net.mamoe.mirai.console.graphical.view import javafx.scene.control.TabPane import javafx.stage.Modality -import net.mamoe.mirai.Bot import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController import tornadofx.* 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 33ca3c002..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 @@ -6,14 +6,24 @@ class MiraiConsoleTerminalLoader { companion object { @JvmStatic fun main(args: Array) { - MiraiConsoleTerminalUI.start() - thread { - MiraiConsole.start( - MiraiConsoleTerminalUI - ) + if (args.contains("pure") || args.contains("-pure") || System.getProperty( + "os.name", + "" + ).toLowerCase().contains("windows") + ) { + println("[MiraiConsoleTerminalLoader]: 将以Pure[兼容模式]启动Console") + MiraiConsole.start(MiraiConsoleUIPure()) + } else { + MiraiConsoleTerminalUI.start() + thread { + MiraiConsole.start( + MiraiConsoleTerminalUI + ) + } } Runtime.getRuntime().addShutdownHook(thread(start = false) { MiraiConsole.stop() + MiraiConsoleTerminalUI.exit() }) } } 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 5fe7a4dd4..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 @@ -227,19 +227,6 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { hasStart = true val defaultTerminalFactory = DefaultTerminalFactory(internalPrinter, System.`in`, Charset.defaultCharset()) - - val fontSize = 12 - defaultTerminalFactory - .setInitialTerminalSize( - TerminalSize( - 101, 60 - ) - ) - .setTerminalEmulatorFontConfiguration( - SwingTerminalFontConfiguration.newInstance( - Font("Monospaced", Font.PLAIN, fontSize) - ) - ) try { terminal = defaultTerminalFactory.createTerminal() terminal.enterPrivateMode() @@ -353,7 +340,7 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { emptyCommand() } KeyType.Escape -> { - exitProcess(0) + exit() } else -> { if (keyStroke.character != null) { @@ -649,6 +636,16 @@ object MiraiConsoleTerminalUI : MiraiConsoleUI { } redrawLogs(log[screens[currentScreenId]]!!) } + + fun exit() { + try { + terminal.exitPrivateMode() + terminal.close() + exitProcess(0) + } catch (ignored: Exception) { + + } + } } diff --git a/mirai-console/README.MD b/mirai-console/README.MD index 3a6ae7272..75bb84696 100644 --- a/mirai-console/README.MD +++ b/mirai-console/README.MD @@ -1,7 +1,43 @@ # Mirai Console -#### Mirai Console allows you to run Mirai in command lines/terminal. -#### 你可以终端中或命令行环境下运行在Mirai -
+你可以在全平台运行Mirai高效率机器人框架 +### Mirai Console提供了6个版本以满足各种需要 +#### 所有版本的Mirai Console API相同 插件系统相同 + +| 名字 | 介绍 | +| --- | --- | +| Mirai-Console-Pure | 最纯净版, CLI环境, 通过标准输入与标准输出 交互 | +| Mirai-Console-Terminal | (UNIX)Terminal环境 提供简介好用的富文本控制台 | +| Mirai-Console-Android | 安卓APP (TODO) | +| Mirai-Console-Graphical | JavaFX的图形化界面, 有Native版本(.jar/.exe/.dmg) | +| Mirai-Console-WebPanel | Web Panel操作(TODO) | +| Mirai-Console-Ios | IOS APP (TODO) | + + + +### 如何选择版本 +1: Mirai-Console-Pure 兼容性最高, 在其他都表现不佳的时候请使用
+2: 以系统区分 +```kotlin + return when(operatingSystem){ + WINDOWS -> listOf("Graphical","WebPanel","Pure") + MAC_OS -> listOf("Graphical","Terminal","WebPanel","Pure") + LINUX -> listOf("Terminal","Pure") + ANDROID -> listOf("Android","Pure","WebPanel") + IOS -> listOf("Ios") + else -> listOf("Pure") + } +``` +3: 以策略区分 +```kotlin + return when(task){ + 体验 -> listOf("Graphical","Terminal","WebPanel","Android","Pure") + 测试插件 -> listOf("Pure") + 调试插件 -> byOperatingSystem() + 稳定挂机 -> listOf("Terminal","Pure") + else -> listOf("Pure") + } +``` + #### More Importantly, Mirai Console support Plugins, tells the bot what to do #### Mirai Console 支持插件系统, 你可以自己开发或使用公开的插件来逻辑化机器人, 如群管 diff --git a/mirai-console/build.gradle.kts b/mirai-console/build.gradle.kts index 540eeb6ff..76632b6b0 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 @@ -23,6 +22,11 @@ fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$v fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version" +tasks.withType() { + manifest { + attributes["Main-Class"] = "net.mamoe.mirai.console.MiraiConsolePureLoader" + } +} dependencies { @@ -35,7 +39,6 @@ dependencies { 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") implementation("no.tornado:tornadofx:1.7.17") 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 4b46a63c0..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 @@ -49,6 +49,8 @@ object MiraiConsole { var coreVersion = "v0.15.1" val build = "Beta" + var allDown = false + lateinit var frontEnd: MiraiConsoleUI fun start( frontEnd: MiraiConsoleUI @@ -80,6 +82,14 @@ object MiraiConsole { fun stop() { PluginManager.disableAllPlugins() + allDown = true + try { + bots.forEach { + it.get()?.close() + } + } catch (ignored: Exception) { + + } } object HTTPAPIAdaptar { @@ -287,6 +297,9 @@ object MiraiConsole { } tailrec fun processNextCommandLine() { + if (allDown) { + return + } var fullCommand = commandChannel.poll() if (fullCommand != null) { if (!fullCommand.startsWith("/")) { 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 new file mode 100644 index 000000000..b361e3ce4 --- /dev/null +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsoleUIPure.kt @@ -0,0 +1,74 @@ +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 + +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) + } + + override fun prePushBot(identity: Long) { + + } + + override fun pushBot(bot: Bot) { + + } + + override fun pushVersion(consoleVersion: String, consoleBuild: String, coreVersion: String) { + + } + + override suspend fun requestInput(question: String): String { + requesting = true + while (true) { + delay(50) + if (!requesting) { + return requestStr + } + } + } + + override fun pushBotAdminStatus(identity: Long, admins: List) { + + } + + override fun createLoginSolver(): LoginSolver { + return DefaultLoginSolver() + } + +} + + +class MiraiConsolePureLoader { + companion object { + @JvmStatic + fun main(args: Array) { + MiraiConsole.start(MiraiConsoleUIPure()) + Runtime.getRuntime().addShutdownHook(thread(start = false) { + MiraiConsole.stop() + }) + } + } +} \ No newline at end of file