先上代码。这可能对大多数人来说没有必要,仅仅是我个人奇怪的操作习惯。
// 添加下面的代码到你继承了 ReadOnlyPluginData 或者 ReadOnlyPluginConfig 的配置类即可 @OptIn(ConsoleExperimentalApi::class) private lateinit var owner_: PluginDataHolder @OptIn(ConsoleExperimentalApi::class) private lateinit var storage_: PluginDataStorage @OptIn(ConsoleExperimentalApi::class) override fun onInit(owner: PluginDataHolder, storage: PluginDataStorage) { owner_ = owner storage_ = storage } // 不需要设为 public,直接调用扩展方法 save 即可 @OptIn(ConsoleExperimentalApi::class) private fun save() { kotlin.runCatching { storage_.store(owner_, this) }.onFailure { e -> // 记得处理异常 }如果你只想关闭定时保存,不想关闭属性修改后自动保存,请用 AutoSavePluginData 或 AutoSavePluginConfig 并重写 shouldPerformAutoSaveWheneverChanged() 使它返回 false
mirai 的只读配置文件曾让我陷入了两难的局地,按照我的个人理解,PluginConfig 是给用户确定插件的一些参数的,插件不应该去修改数值,所以我没用 AutoSavePluginConfig 而是用了 ReadOnlyPluginConfig,在我编写插件调试的过程中我发现一个问题,它真的是只读的 —— 这很正常,因为它就叫只读配置,它在配置文件不存在时会保存默认配置文件,但在我添加新的配置键到类之后,却因为它的只读而没有在配置文件里更新不存在的配置键……
这不符合我的预期,由于我当时没看到 AutoSavePluginData 里可以关定时保存,故着手研究如何保存只读配置,最后在 AutoSavePluginData 里找到了……
重载配置文件时,reload() 再 save(),即可更新不存在的配置键。
补充我只能以「简化成了我想要的样子不像 AutoSavePluginData 有我不需要的功能」来安慰自己了 :(
经过讨论,ReadOnlyPluginData 无法保存是在旧版本 mirai 中的问题,在新版本 mirai 可正常保存(具体哪个版本我还没去验证)。添加上述代码可兼容在旧版本 mirai 保存只读配置文件。