diff --git a/README.md b/README.md index 935a965..a5fc78d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ [![maven-central](https://img.shields.io/maven-central/v/xyz.cssxsh.mirai/mirai-device-generator)](https://search.maven.org/artifact/xyz.cssxsh.mirai/mirai-device-generator) -作为插件运行时会检测 `mcl/bots/.../device.json`, `mcl/device.json` 是否存在,不存在则生成。 +作为插件运行时会提供 `BotConfigurationAlterer` 服务,自动替换 `configuration.deviceInfo = generator::load` +作为 `mirai-core` 库引用时, 请自行调用 `configuration.deviceInfo = generator::load` ## board 编号 diff --git a/build.gradle.kts b/build.gradle.kts index 81ce413..a90986b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } group = "xyz.cssxsh.mirai" -version = "1.0.0-dev-3" +version = "1.0.0" mavenCentralPublish { useCentralS01() diff --git a/src/main/kotlin/net/mamoe/mirai/spi/DeviceInfoService.kt b/src/main/kotlin/net/mamoe/mirai/spi/DeviceInfoService.kt deleted file mode 100644 index 5d77b9e..0000000 --- a/src/main/kotlin/net/mamoe/mirai/spi/DeviceInfoService.kt +++ /dev/null @@ -1,51 +0,0 @@ -package net.mamoe.mirai.spi - -import net.mamoe.mirai.Bot -import net.mamoe.mirai.utils.* - -/** - * 生成设备信息 - * - * @author cssxsh - */ -@MiraiExperimentalApi -@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") -public interface DeviceInfoService : BaseService { - - public fun load(bot: Bot): DeviceInfo - - public fun generate(): DeviceInfo - - public object Default : DeviceInfoService { - override fun load(bot: Bot): DeviceInfo { - val file = bot.configuration.workingDir.resolve("device.json") - if (!file.exists() || file.length() == 0L) { - return generate().also { - file.writeText(DeviceInfoManager.serialize(it)) - } - } - return DeviceInfoManager.deserialize(file.readText()) - } - - override fun generate(): DeviceInfo { - return DeviceInfo.random() - } - } - - public companion object INSTANCE : DeviceInfoService { - private val loader = SPIServiceLoader(Default, DeviceInfoService::class.java) - - override fun load(bot: Bot): DeviceInfo { - return loader.service.load(bot) - } - - override fun generate(): DeviceInfo { - return loader.service.generate() - } - - @JvmStatic - public fun setService(service: DeviceInfoService) { - loader.service = service - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/xyz/cssxsh/mirai/MiraiDeviceGenerator.kt b/src/main/kotlin/xyz/cssxsh/mirai/MiraiDeviceGenerator.kt index aa5f349..6680352 100644 --- a/src/main/kotlin/xyz/cssxsh/mirai/MiraiDeviceGenerator.kt +++ b/src/main/kotlin/xyz/cssxsh/mirai/MiraiDeviceGenerator.kt @@ -2,15 +2,11 @@ package xyz.cssxsh.mirai import kotlinx.serialization.* import net.mamoe.mirai.* -import net.mamoe.mirai.spi.* import net.mamoe.mirai.utils.* import kotlin.random.* -@OptIn(MiraiExperimentalApi::class) @Suppress("unused") -public class MiraiDeviceGenerator : DeviceInfoService { - - override val priority: Int get() = super.priority - 1 +public class MiraiDeviceGenerator { internal var random: Random = Random.Default @@ -49,7 +45,7 @@ public class MiraiDeviceGenerator : DeviceInfoService { ) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - public override fun load(bot: Bot): DeviceInfo { + public fun load(bot: Bot): DeviceInfo { val file = bot.configuration.workingDir.resolve("device.json") if (!file.exists() || file.length() == 0L) { return generate().also { @@ -59,7 +55,7 @@ public class MiraiDeviceGenerator : DeviceInfoService { return DeviceInfoManager.deserialize(file.readText()) } - public override fun generate(): DeviceInfo { + public fun generate(): DeviceInfo { val model = models.random(random) val sdk = model.sdks.randomOrNull(random) ?: sdks.random(random) return DeviceInfo( diff --git a/src/main/kotlin/xyz/cssxsh/mirai/plugin/MiraiDevicePlugin.kt b/src/main/kotlin/xyz/cssxsh/mirai/plugin/MiraiDevicePlugin.kt index 6cfe639..8600960 100644 --- a/src/main/kotlin/xyz/cssxsh/mirai/plugin/MiraiDevicePlugin.kt +++ b/src/main/kotlin/xyz/cssxsh/mirai/plugin/MiraiDevicePlugin.kt @@ -1,13 +1,10 @@ package xyz.cssxsh.mirai.plugin -import kotlinx.coroutines.* import kotlinx.serialization.* import kotlinx.serialization.json.* -import net.mamoe.mirai.Bot -import net.mamoe.mirai.console.* import net.mamoe.mirai.console.extension.* +import net.mamoe.mirai.console.extensions.* import net.mamoe.mirai.console.plugin.jvm.* -import net.mamoe.mirai.spi.* import net.mamoe.mirai.utils.* import xyz.cssxsh.mirai.* @@ -15,65 +12,43 @@ public object MiraiDevicePlugin : KotlinPlugin( JvmPluginDescription( id = "xyz.cssxsh.mirai.mirai-device-generator", name = "mirai-device-generator", - version = "1.0.0-dev-3", + version = "1.0.0", ) { author("cssxsh") } ) { private val generator = MiraiDeviceGenerator() + private val json = Json { prettyPrint = true } @OptIn(MiraiExperimentalApi::class) override fun PluginComponentStorage.onLoad() { - DeviceInfoService.setService(generator) + contribute(BotConfigurationAlterer) { + BotConfigurationAlterer { _, configuration -> + configuration.deviceInfo = generator::load + configuration + } + } } @OptIn(MiraiExperimentalApi::class, ExperimentalSerializationApi::class) override fun onEnable() { - val json = Json { prettyPrint = true } - with(dataFolder.resolve("models.json")) { if (exists().not()) { writeText(getResource("xyz/cssxsh/mirai/plugin/models.json") ?: throw NoSuchElementException("models.json")) } generator.models = json.decodeFromString(readText()) } - with(dataFolder.resolve("sdks.json")) { if (exists().not()) { writeText(getResource("xyz/cssxsh/mirai/plugin/sdks.json") ?: throw NoSuchElementException("sdks.json")) } generator.sdks = json.decodeFromString(readText()) } - with(dataFolder.resolve("mac.json")) { if (exists().not()) { writeText(getResource("xyz/cssxsh/mirai/plugin/mac.json") ?: throw NoSuchElementException("mac.json")) } generator.addr = json.decodeFromString(readText()) } - - launch { - while (isActive) { - val device = MiraiConsole.rootDir.resolve("device.json") - if (device.exists().not()) { - @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - device.writeText(DeviceInfoManager.serialize(generator.generate())) - } - delay(10_000) - } - } - - launch { - while (isActive) { - Bot.instances.forEach { bot -> - val device = bot.configuration.workingDir.resolve("device.json") - if (device.exists().not()) { - @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") - device.writeText(DeviceInfoManager.serialize(generator.generate())) - } - } - delay(10_000) - } - } } } \ No newline at end of file