diff --git a/backend/codegen/src/main/kotlin/net/mamoe/mirai/console/codegen/SettingValueUseSiteCodegen.kt b/backend/codegen/src/main/kotlin/net/mamoe/mirai/console/codegen/SettingValueUseSiteCodegen.kt index 87af74d6a..3906cf4d1 100644 --- a/backend/codegen/src/main/kotlin/net/mamoe/mirai/console/codegen/SettingValueUseSiteCodegen.kt +++ b/backend/codegen/src/main/kotlin/net/mamoe/mirai/console/codegen/SettingValueUseSiteCodegen.kt @@ -101,7 +101,11 @@ fun genAllValueUseSite(): String = buildString { require(this::class != default::class) { "Recursive nesting is prohibited" } - return valueImpl(default) + return valueImpl(default).also { + if (default is Setting.NestedSetting) { + default.attachedValue = it + } + } } inline fun Setting.value(default: T, crossinline initializer: T.() -> Unit): Value = diff --git a/backend/mirai-console/src/main/java/net/mamoe/mirai/console/utils/BotManager.java b/backend/mirai-console/src/main/java/net/mamoe/mirai/console/utils/BotManager.java index c30422724..285bcfb48 100644 --- a/backend/mirai-console/src/main/java/net/mamoe/mirai/console/utils/BotManager.java +++ b/backend/mirai-console/src/main/java/net/mamoe/mirai/console/utils/BotManager.java @@ -25,7 +25,7 @@ public class BotManager { } public static List getManagers(Bot bot) { - return BotHelperKt.getBotManagers(bot); + return BotManagers.getManagers(bot); } public static boolean isManager(Bot bot, long target) { diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt index c1dc3257d..8cab73f5b 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/MiraiConsole.kt @@ -17,6 +17,7 @@ import net.mamoe.mirai.console.plugin.PluginLoader import net.mamoe.mirai.console.plugin.jvm.JarPluginLoader import net.mamoe.mirai.console.plugin.jvm.JvmPlugin import net.mamoe.mirai.console.setting.SettingStorage +import net.mamoe.mirai.console.setting.internal.ConsoleBuiltInSetting import net.mamoe.mirai.utils.DefaultLogger import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiLogger @@ -75,6 +76,10 @@ object MiraiConsole : CoroutineScope, IMiraiConsole { internal override val jvmSettingStorage: SettingStorage get() = instance.jvmSettingStorage + @Suppress("CANNOT_WEAKEN_ACCESS_PRIVILEGE") + override val consoleBuiltIntSettingStorage: SettingStorage + get() = instance.consoleBuiltIntSettingStorage + init { DefaultLogger = { identity -> this.newLogger(identity) } this.coroutineContext[Job]!!.invokeOnCompletion { @@ -116,6 +121,11 @@ internal interface IMiraiConsole : CoroutineScope { * 内建的供 [JvmPlugin] 使用的 [SettingStorage] */ val jvmSettingStorage: SettingStorage + + /** + * 内建的供 [ConsoleBuiltInSetting] 使用的 [SettingStorage] + */ + val consoleBuiltIntSettingStorage: SettingStorage } /** diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt index 13ae9f943..4e32f1a1a 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt @@ -36,6 +36,16 @@ typealias Comment = net.mamoe.yamlkt.Comment @Suppress("EXPOSED_SUPER_CLASS") abstract class Setting : SettingImpl() { + /** + * 表示这个配置的嵌套对象, 自动绑定数据更新. + */ + abstract inner class Inner : Setting() { + internal lateinit var attachedValue: Value<*> + override fun onElementChanged(value: Value<*>) { + this@Setting.onElementChanged(attachedValue) + } + } + data class PropertyInfo( val serialName: String, val annotations: List, diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/_Setting.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/_Setting.kt index 1fd951369..4706684f9 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/_Setting.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/_Setting.kt @@ -124,7 +124,11 @@ fun Setting.value(default: T): Value { require(this::class != default::class) { "Recursive nesting is prohibited" } - return valueImpl(default) + return valueImpl(default).also { + if (default is Setting.Inner) { + default.attachedValue = it + } + } } inline fun Setting.value(default: T, crossinline initializer: T.() -> Unit): Value = diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/ConsoleBuiltInSetting.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/ConsoleBuiltInSetting.kt new file mode 100644 index 000000000..5597e81cb --- /dev/null +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/ConsoleBuiltInSetting.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.console.setting.internal + +import kotlinx.coroutines.Job +import net.mamoe.mirai.console.MiraiConsole +import net.mamoe.mirai.console.setting.Setting +import net.mamoe.mirai.console.setting.Value + + +internal abstract class ConsoleBuiltInSetting : Setting() { + private val track = + @Suppress("LeakingThis") + MiraiConsole.jvmSettingStorage.trackOn(this) + + init { + MiraiConsole.coroutineContext[Job]!!.invokeOnCompletion { + track.close() + } + } + + override fun onElementChanged(value: Value<*>) { + TODO() + } +} \ No newline at end of file diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/internalValueImpl.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/internalValueImpl.kt index 0942f9fdd..113a9da03 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/internalValueImpl.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/internalValueImpl.kt @@ -17,7 +17,9 @@ import net.mamoe.mirai.console.setting.* import net.mamoe.yamlkt.YamlDynamicSerializer import kotlin.internal.LowPriorityInOverloadResolution import kotlin.reflect.KClass +import kotlin.reflect.KType import kotlin.reflect.full.createInstance +import kotlin.reflect.typeOf /// region MUTABLE LIST @@ -291,6 +293,7 @@ internal fun Setting.valueImpl( /** * For primitives and serializable only */ +@OptIn(ExperimentalStdlibApi::class) @PublishedApi @LowPriorityInOverloadResolution internal inline fun Setting.valueImpl(default: T): Value = diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotHelper.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotManagers.kt similarity index 62% rename from backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotHelper.kt rename to backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotManagers.kt index 8932df2a0..65be10639 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotHelper.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/utils/BotManagers.kt @@ -6,11 +6,21 @@ * * https://github.com/mamoe/mirai/blob/master/LICENSE */ +@file:JvmName("BotManagers") package net.mamoe.mirai.console.utils +import kotlinx.atomicfu.locks.withLock import net.mamoe.mirai.Bot +import net.mamoe.mirai.console.setting.Value +import net.mamoe.mirai.console.setting.internal.ConsoleBuiltInSetting +import net.mamoe.mirai.console.setting.value import net.mamoe.mirai.contact.User +import java.util.concurrent.TimeUnit +import java.util.concurrent.locks.Condition +import java.util.concurrent.locks.Lock +import java.util.concurrent.locks.ReentrantLock +import kotlin.properties.ReadWriteProperty /** @@ -29,15 +39,4 @@ fun Bot.removeManager(long: Long) { } val Bot.managers: List - get() { - TODO() - } - -fun Bot.checkManager(long: Long): Boolean { - return this.managers.contains(long) -} - - -fun getBotManagers(bot: Bot): List { - return bot.managers -} + get() = TODO()