From 342edac692ae31b5da4828060bcc2c64f11bff3a Mon Sep 17 00:00:00 2001 From: only52607 Date: Wed, 20 Apr 2022 21:28:32 +0800 Subject: [PATCH 01/11] docs: update docs url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43e398d..7c766c0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ 支持lua语言的qq bot快速开发框架,使用lua轻松创造qq bot。 ## 开发文档 -[lua mirai doc](https://ooooonly.gitee.io/lua-mirai-doc) +[lua mirai doc](https://only52607.github.io/lua-mirai/) ## Android From ae82b44dfa6fc6b608fa8295c3572659d2061e27 Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 09:52:04 +0800 Subject: [PATCH 02/11] update mirai core version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 633bd4e..2cce73a 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ subprojects { apply plugin: 'org.jetbrains.kotlin.jvm' dependencies { - def mirai_core_version = "2.9.2" + def mirai_core_version = "2.11.0" implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" implementation "net.mamoe:mirai-core-api:$mirai_core_version" From 3ae84dab342760f15258a71f7a00c90ee8ef1c2e Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 10:03:00 +0800 Subject: [PATCH 03/11] subdivide bot script exceptions --- .../luamirai/core/script/AbstractBotScript.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lua-mirai-core/src/main/kotlin/com/github/only52607/luamirai/core/script/AbstractBotScript.kt b/lua-mirai-core/src/main/kotlin/com/github/only52607/luamirai/core/script/AbstractBotScript.kt index 0e67c9c..8521142 100644 --- a/lua-mirai-core/src/main/kotlin/com/github/only52607/luamirai/core/script/AbstractBotScript.kt +++ b/lua-mirai-core/src/main/kotlin/com/github/only52607/luamirai/core/script/AbstractBotScript.kt @@ -24,8 +24,8 @@ abstract class AbstractBotScript : BotScript { get() = _stopped override fun start(): Job { - if (_stopped) throw BotScriptException("Stopped script could not be start again") - if (_active) throw BotScriptException("Script has already been started") + if (_stopped) throw ScriptAlreadyStoppedException("Stopped script could not be start again") + if (_active) throw ScriptAlreadyStartedException() val job = launch { onStart() } @@ -36,8 +36,8 @@ abstract class AbstractBotScript : BotScript { abstract suspend fun onStart() override fun stop(): Job { - if (_stopped) throw BotScriptException("Script has already stopped") - if (!_active) throw BotScriptException("Script has not been started") + if (_stopped) throw ScriptAlreadyStoppedException() + if (!_active) throw ScriptNotYetStartedException() val job = launch { onStop() } @@ -50,4 +50,10 @@ abstract class AbstractBotScript : BotScript { abstract suspend fun onStop() } -class BotScriptException(message: String) : RuntimeException(message) \ No newline at end of file +open class BotScriptException(message: String) : RuntimeException(message) + +class ScriptAlreadyStoppedException(message: String = "Script has already stopped") : BotScriptException(message) + +class ScriptNotYetStartedException(message: String = "Script has not been started") : BotScriptException(message) + +class ScriptAlreadyStartedException(message: String = "Script has already stopped") : BotScriptException(message) \ No newline at end of file From 187ceeefdb991282f7aea42a2fade0426f78c8f5 Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 10:15:06 +0800 Subject: [PATCH 04/11] catch acceptable bot stop exceptions --- .../luamirai/console/LuaMiraiCommand.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt index 300a1da..94f0ae6 100644 --- a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt +++ b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt @@ -2,15 +2,15 @@ package com.github.only52607.luamirai.console import com.github.only52607.luamirai.core.integration.BotScriptList import com.github.only52607.luamirai.core.integration.BotScriptSourceList -import com.github.only52607.luamirai.core.script.* +import com.github.only52607.luamirai.core.script.BotScriptSource +import com.github.only52607.luamirai.core.script.ScriptAlreadyStoppedException +import com.github.only52607.luamirai.core.script.ScriptNotYetStartedException import kotlinx.coroutines.runBlocking import kotlinx.serialization.encodeToString import kotlinx.serialization.json.* import net.mamoe.mirai.console.command.CompositeCommand import net.mamoe.mirai.console.command.ConsoleCommandSender import net.mamoe.mirai.console.util.ConsoleExperimentalApi -import net.mamoe.mirai.utils.MiraiExperimentalApi -import net.mamoe.mirai.utils.MiraiInternalApi import net.mamoe.mirai.utils.MiraiLogger import java.io.File import java.net.URL @@ -18,9 +18,7 @@ import java.net.URL private const val LUA = "lua" @OptIn( - MiraiExperimentalApi::class, ConsoleExperimentalApi::class, - MiraiInternalApi::class, kotlinx.serialization.ExperimentalSerializationApi::class ) @Suppress("UNUSED") @@ -105,7 +103,15 @@ class LuaMiraiCommand( @SubCommand("script stop") @Description("停用一个运行中的脚本(该操作会停止脚本以及脚本内注册的所有事件监听器)") fun ConsoleCommandSender.stop(@Name("脚本编号") scriptId: Int) { - scriptList[scriptId].stop() + try { + scriptList[scriptId].stop() + } catch (_: ScriptAlreadyStoppedException) { + logger.error("脚本[${scriptList[scriptId]}]已经停用,请勿重复操作") + return + } catch (_: ScriptNotYetStartedException) { + logger.error("脚本[${scriptList[scriptId]}]没有被启动,无需停止") + return + } logger.info("停用脚本[${scriptList[scriptId]}]成功") scriptList.removeAt(scriptId) } @@ -120,7 +126,11 @@ class LuaMiraiCommand( @Description("重新读入脚本源以启动脚本") suspend fun ConsoleCommandSender.restart(@Name("脚本编号") scriptId: Int) { val source = scriptList[scriptId].source - scriptList[scriptId].stop() + try { + scriptList[scriptId].stop() + } catch (_: ScriptAlreadyStoppedException) { + } catch (_: ScriptNotYetStartedException) { + } scriptList.removeAt(scriptId) scriptList.addFromSource(source).start() } @@ -128,8 +138,7 @@ class LuaMiraiCommand( @SubCommand("script info") @Description("查看运行中的脚本信息") fun ConsoleCommandSender.info(@Name("脚本编号") scriptId: Int) { - val source = scriptList[scriptId].header - source ?: return + val source = scriptList[scriptId].header ?: return logger.info("名称:${source["name"]}") logger.info("版本:${source["version"]}") logger.info("作者:${source["author"]}") From 05a4dbb35950c775407efd60d6df126bede70b75 Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 10:25:50 +0800 Subject: [PATCH 05/11] update console version --- lua-mirai-mcl-plugin/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua-mirai-mcl-plugin/build.gradle b/lua-mirai-mcl-plugin/build.gradle index d7621c5..0ec10fd 100644 --- a/lua-mirai-mcl-plugin/build.gradle +++ b/lua-mirai-mcl-plugin/build.gradle @@ -5,8 +5,8 @@ plugins { dependencies { implementation project(":lua-mirai-core") runtimeOnly project(":lua-mirai-adapter-luakt") - compileOnly "net.mamoe:mirai-console:2.0.0" - testImplementation "net.mamoe:mirai-console-terminal:2.0.0" + compileOnly 'net.mamoe:mirai-console:2.10.3' + testImplementation 'net.mamoe:mirai-console-terminal:2.10.3' } task createPluginYml(dependsOn: processResources) { From 1ca13429fd42152584afa79fc8ecc9a9b04aa4e4 Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 11:22:49 +0800 Subject: [PATCH 06/11] add configuration module --- build.gradle | 8 ++++++++ lua-mirai-configuration/build.gradle | 9 +++++++++ lua-mirai-mcl-plugin/build.gradle | 1 + settings.gradle | 6 ++++-- 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 lua-mirai-configuration/build.gradle diff --git a/build.gradle b/build.gradle index 2cce73a..4c0cd71 100644 --- a/build.gradle +++ b/build.gradle @@ -74,5 +74,13 @@ publishing { artifact luaktAdapterProject.tasks.sourcesJar artifact luaktAdapterProject.tasks.javadocJar } + + configuration(MavenPublication) { + setArtifactId("configuration") + def luaktAdapterProject = project(':lua-mirai-configuration') + from luaktAdapterProject.components.java + artifact luaktAdapterProject.tasks.sourcesJar + artifact luaktAdapterProject.tasks.javadocJar + } } } \ No newline at end of file diff --git a/lua-mirai-configuration/build.gradle b/lua-mirai-configuration/build.gradle new file mode 100644 index 0000000..e276dfd --- /dev/null +++ b/lua-mirai-configuration/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.10' +} + +dependencies { + implementation project(":lua-mirai-core") + runtimeOnly project(":lua-mirai-adapter-luakt") + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" +} \ No newline at end of file diff --git a/lua-mirai-mcl-plugin/build.gradle b/lua-mirai-mcl-plugin/build.gradle index 0ec10fd..43a8451 100644 --- a/lua-mirai-mcl-plugin/build.gradle +++ b/lua-mirai-mcl-plugin/build.gradle @@ -4,6 +4,7 @@ plugins { dependencies { implementation project(":lua-mirai-core") + implementation project(":lua-mirai-configuration") runtimeOnly project(":lua-mirai-adapter-luakt") compileOnly 'net.mamoe:mirai-console:2.10.3' testImplementation 'net.mamoe:mirai-console-terminal:2.10.3' diff --git a/settings.gradle b/settings.gradle index 4d507af..87c5624 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,7 +4,9 @@ include ':lua-mirai-adapter-luakt' include ':lua-mirai-mcl-plugin' include ':lua-mirai-executable' include ':lua-mirai-executable-mcl' - +include 'lua-mirai-configuration' if (file("local.settings.gradle").exists()) { apply from: 'local.settings.gradle' -} \ No newline at end of file +} + + From 066e192692f61f897f26851d081c1c1c4d93f3a1 Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 14:27:31 +0800 Subject: [PATCH 07/11] add kotlin serialization to resolve config --- lua-mirai-mcl-plugin/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lua-mirai-mcl-plugin/build.gradle b/lua-mirai-mcl-plugin/build.gradle index 43a8451..b444ecb 100644 --- a/lua-mirai-mcl-plugin/build.gradle +++ b/lua-mirai-mcl-plugin/build.gradle @@ -1,5 +1,6 @@ plugins { id 'com.github.johnrengelman.shadow' version "5.2.0" + id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.10' } dependencies { @@ -8,6 +9,7 @@ dependencies { runtimeOnly project(":lua-mirai-adapter-luakt") compileOnly 'net.mamoe:mirai-console:2.10.3' testImplementation 'net.mamoe:mirai-console-terminal:2.10.3' + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2" } task createPluginYml(dependsOn: processResources) { From c6b53ca0184ff10cf997313d1dd0d4387060532e Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 14:28:16 +0800 Subject: [PATCH 08/11] add ConfigurableBotScriptSource --- .../configuration/ConfigurableScriptSource.kt | 32 +++++++ .../ConfigurableScriptSourceSerializer.kt | 90 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSource.kt create mode 100644 lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSourceSerializer.kt diff --git a/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSource.kt b/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSource.kt new file mode 100644 index 0000000..b8498df --- /dev/null +++ b/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSource.kt @@ -0,0 +1,32 @@ +package com.github.only52607.luamirai.configuration + +import com.github.only52607.luamirai.core.script.BotScriptSource +import kotlinx.serialization.Serializable +import java.io.InputStream +import java.nio.charset.Charset + +/** + * ClassName: ConfigurableScriptSource + * Description: + * date: 2022/5/21 10:42 + * @author ooooonly + * @version + */ +@Serializable(ConfigurableScriptSourceSerializer::class) +class ConfigurableScriptSource( + val source: BotScriptSource, + var alias: String? = null, + var autoStart: Boolean = false +) : BotScriptSource( + lang = source.lang, + name = source.name, + size = source.size, + charset = source.charset, +) { + override val inputStream: InputStream + get() = source.inputStream + + override fun toString(): String { + return source.toString() + } +} \ No newline at end of file diff --git a/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSourceSerializer.kt b/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSourceSerializer.kt new file mode 100644 index 0000000..1a19f3c --- /dev/null +++ b/lua-mirai-configuration/src/main/kotlin/com/github/only52607/luamirai/configuration/ConfigurableScriptSourceSerializer.kt @@ -0,0 +1,90 @@ +package com.github.only52607.luamirai.configuration + +import com.github.only52607.luamirai.core.script.BotScriptSource +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.jsonPrimitive +import java.io.File +import java.net.URL + +/** + * ClassName: ConfigurableScriptSourceSerializer + * Description: + * date: 2022/5/21 10:47 + * @author ooooonly + * @version + */ +object ConfigurableScriptSourceSerializer : KSerializer { + private const val TYPE_FILE = "file" + private const val TYPE_CONTENT = "content" + private const val TYPE_URL = "url" + private const val TYPE_UNKNOWN = "unknown" + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ConfigurableScriptSource") { + element("type") + element("value") + element("alias") + element("autoStart") + element("lang") + } + + override fun deserialize(decoder: Decoder): ConfigurableScriptSource { + decoder.decodeStructure(descriptor) { + var type = "unknown" + var value = "" + var alias = "" + var autoStart = false + var lang = "lua" + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> type = decodeStringElement(descriptor, 0) + 1 -> value = decodeStringElement(descriptor, 1) + 2 -> alias = decodeStringElement(descriptor, 2) + 3 -> autoStart = decodeBooleanElement(descriptor, 3) + 4 -> lang = decodeStringElement(descriptor, 4) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + val source = when (type) { + TYPE_FILE -> BotScriptSource.FileSource(File(value), lang) + TYPE_CONTENT -> BotScriptSource.StringSource(value, lang) + TYPE_URL -> BotScriptSource.URLSource(URL(value), lang) + else -> throw IllegalArgumentException("Unsupported script type $type") + } + return ConfigurableScriptSource(source, alias, autoStart) + } + } + + override fun serialize(encoder: Encoder, value: ConfigurableScriptSource) { + return encoder.encodeStructure(descriptor) { + when (value.source) { + is BotScriptSource.FileSource -> { + encodeStringElement(descriptor, 0, TYPE_FILE) + encodeStringElement(descriptor, 1, value.source.file.path) + } + is BotScriptSource.StringSource -> { + encodeStringElement(descriptor, 0, TYPE_CONTENT) + encodeStringElement(descriptor, 1, value.source.content) + } + is BotScriptSource.URLSource -> { + encodeStringElement(descriptor, 0, TYPE_URL) + encodeStringElement(descriptor, 1, value.source.url.toString()) + } + else -> { + encodeStringElement(descriptor, 0, TYPE_UNKNOWN) + encodeStringElement(descriptor, 1, "") + } + } + encodeStringElement(descriptor, 2, value.alias ?: "") + encodeBooleanElement(descriptor, 3, value.autoStart) + encodeStringElement(descriptor, 4, value.source.lang) + } + } + +} \ No newline at end of file From f54024705522449f99149e6b438119a47cd6b1bf Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 14:29:07 +0800 Subject: [PATCH 09/11] add PluginConfig --- .../luamirai/console/config/PluginConfig.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/config/PluginConfig.kt diff --git a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/config/PluginConfig.kt b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/config/PluginConfig.kt new file mode 100644 index 0000000..839e379 --- /dev/null +++ b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/config/PluginConfig.kt @@ -0,0 +1,15 @@ +package com.github.only52607.luamirai.console.config + +import com.github.only52607.luamirai.configuration.ConfigurableScriptSource + +/** + * ClassName: PluginConfig + * Description: + * date: 2022/5/21 12:12 + * @author ooooonly + * @version + */ +@kotlinx.serialization.Serializable +class PluginConfig( + val sources: List +) \ No newline at end of file From cfc1c17f84a8d523125cb248417b1b2902bd7fee Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 14:29:48 +0800 Subject: [PATCH 10/11] change default config file name --- .../com/github/only52607/luamirai/console/LuaMiraiPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiPlugin.kt b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiPlugin.kt index 6404800..0e7306e 100644 --- a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiPlugin.kt +++ b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiPlugin.kt @@ -14,7 +14,7 @@ object LuaMiraiPlugin : KotlinPlugin(LuaMiraiPluginDescription) { Class.forName("com.github.only52607.luamirai.lua.LuaMiraiScriptBuilder") } - private const val scriptConfigFile = "scripts.json" + private const val scriptConfigFile = "lua-mirai.json" private val command: LuaMiraiCommand by lazy { LuaMiraiCommand(logger, resolveConfigFile(scriptConfigFile)) From 8a8f7c278e2c0532afc08648948762be8914470f Mon Sep 17 00:00:00 2001 From: only52607 Date: Sat, 21 May 2022 14:30:31 +0800 Subject: [PATCH 11/11] add script autostart by ConfigurableBotScriptSource --- .../luamirai/console/LuaMiraiCommand.kt | 109 ++++++++---------- 1 file changed, 49 insertions(+), 60 deletions(-) diff --git a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt index 94f0ae6..9e88833 100644 --- a/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt +++ b/lua-mirai-mcl-plugin/src/main/kotlin/com/github/only52607/luamirai/console/LuaMiraiCommand.kt @@ -1,13 +1,15 @@ package com.github.only52607.luamirai.console +import com.github.only52607.luamirai.configuration.ConfigurableScriptSource +import com.github.only52607.luamirai.console.config.PluginConfig import com.github.only52607.luamirai.core.integration.BotScriptList -import com.github.only52607.luamirai.core.integration.BotScriptSourceList import com.github.only52607.luamirai.core.script.BotScriptSource import com.github.only52607.luamirai.core.script.ScriptAlreadyStoppedException import com.github.only52607.luamirai.core.script.ScriptNotYetStartedException import kotlinx.coroutines.runBlocking -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.* +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import kotlinx.serialization.json.encodeToStream import net.mamoe.mirai.console.command.CompositeCommand import net.mamoe.mirai.console.command.ConsoleCommandSender import net.mamoe.mirai.console.util.ConsoleExperimentalApi @@ -25,26 +27,23 @@ private const val LUA = "lua" class LuaMiraiCommand( private val logger: MiraiLogger, private val configFile: File? -): CompositeCommand( - owner = LuaMiraiPlugin, - primaryName = "lua", - description = "lua mirai 指令集" - ) { +) : CompositeCommand( + owner = LuaMiraiPlugin, + primaryName = "lua", + description = "lua mirai 插件相关指令" +) { private val scriptList = BotScriptList() - - private val sourceList = BotScriptSourceList() - - private val sourceAutoStart = mutableMapOf() + private val sourceList = mutableListOf() fun enable() { - runBlocking { loadScriptsByConfigFile() } + runBlocking { initConfig() } } fun disable() { scriptList.forEach { if (it.isActive) it.stop() } } - @SubCommand + @SubCommand("doc") @Description("打开lua mirai开发文档") fun ConsoleCommandSender.doc() { val website = "https://ooooonly.gitee.io/lua-mirai-doc/#/" @@ -66,7 +65,7 @@ class LuaMiraiCommand( @SubCommand("source add") @Description("新增脚本源") - suspend fun ConsoleCommandSender.add(@Name("文件名或URL") fileName: String) { + fun ConsoleCommandSender.add(@Name("文件名或URL") fileName: String) { val source = if (!fileName.contains("://")) { val file = File(fileName) if (!file.exists()) { @@ -77,9 +76,8 @@ class LuaMiraiCommand( } else { BotScriptSource.URLSource(URL(fileName), LUA) } - sourceList.add(source) + sourceList.add(ConfigurableScriptSource(source)) logger.info("添加脚本源[${sourceList.size - 1}] $fileName 成功") - scriptList.addFromSource(source) updateConfig() } @@ -90,6 +88,20 @@ class LuaMiraiCommand( updateConfig() } + @SubCommand("source autostart") + @Description("设置脚本源自动启动") + fun ConsoleCommandSender.autostart(@Name("索引") index: Int, @Name("是否开启") autostart: Boolean) { + sourceList[index].autoStart = autostart + updateConfig() + } + + @SubCommand("source alias") + @Description("设置脚本源别名") + fun ConsoleCommandSender.alias(@Name("索引") index: Int, @Name("别名") alias: String) { + sourceList[index].alias = alias + updateConfig() + } + // Script Commands @SubCommand("script list") @@ -116,7 +128,7 @@ class LuaMiraiCommand( scriptList.removeAt(scriptId) } - @SubCommand("script start") + @SubCommand("script start", "source start") @Description("使用脚本源启动一个新脚本") suspend fun ConsoleCommandSender.start(@Name("脚本源编号") sourceId: Int) { scriptList.addFromSource(sourceList[sourceId]).start() @@ -145,61 +157,38 @@ class LuaMiraiCommand( logger.info("描述:${source["description"]}") } + private val json by lazy { + Json { prettyPrint = true } + } /** * 从配置文件读取已加载脚本信息 */ - private suspend fun loadScriptsByConfigFile() { + private suspend fun initConfig() { if (configFile == null || !configFile.exists()) return - val jsonConfigArray = Json.parseToJsonElement(configFile.readText()).jsonArray - jsonConfigArray.forEachIndexed { _, itemElement -> - kotlin.runCatching { - val item = itemElement.jsonObject - val source: BotScriptSource = when (val typeName = item["type"]?.jsonPrimitive?.contentOrNull) { - "file" -> BotScriptSource.FileSource(File(item["file"]?.jsonPrimitive?.contentOrNull!!), LUA) - "content" -> BotScriptSource.StringSource(item["content"]?.jsonPrimitive?.contentOrNull!!, LUA) - "url" -> BotScriptSource.URLSource(URL(item["url"]?.jsonPrimitive?.contentOrNull!!), LUA) - else -> throw IllegalArgumentException("Unsupported script type $typeName") - } - sourceList.add(source) - if (item["enable"]?.jsonPrimitive?.booleanOrNull == true) { - scriptList.addFromSource(source).start() - } + val pluginConfig = json.decodeFromStream(PluginConfig.serializer(), configFile.inputStream()) + sourceList.clear() + sourceList.addAll(pluginConfig.sources) + for (source in pluginConfig.sources) { + if (!source.autoStart) continue + try { + val script = scriptList.addFromSource(source) + script.start() + logger.info("$source 自动启动成功") + } catch (e: Exception) { + logger.error("$source 自动启动失败", e) } } } - private val jsonFormat by lazy { - Json { prettyPrint = true } - } - /** * 写出脚本信息到配置文件 */ private fun updateConfig() { configFile ?: return - val configArray = buildJsonArray { - sourceList.forEach { source: BotScriptSource -> - add(buildJsonObject { - when (source) { - is BotScriptSource.FileSource -> { - this@buildJsonObject.put("type", "file") - this@buildJsonObject.put("file", source.file.path) - } - is BotScriptSource.StringSource -> { - this@buildJsonObject.put("type", "content") - this@buildJsonObject.put("content", source.content) - } - is BotScriptSource.URLSource -> { - this@buildJsonObject.put("type", "url") - this@buildJsonObject.put("url", source.url.toString()) - } - else -> {} - } - this@buildJsonObject.put("enable", sourceAutoStart[source] == true) - }) - } - } - configFile.writeText(jsonFormat.encodeToString(configArray)) + val pluginConfig = PluginConfig( + sources = sourceList + ) + json.encodeToStream(pluginConfig, configFile.outputStream()) } } \ No newline at end of file