MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    保存只读配置文件

    技术交流板块
    kotlin console 配置文件
    2
    4
    398
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • MrXiaoM
      MrXiaoM 童心未泯 最后由 MrXiaoM 编辑

      先上代码。这可能对大多数人来说没有必要,仅仅是我个人奇怪的操作习惯。

          // 添加下面的代码到你继承了 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 保存只读配置文件。

      1 条回复 最后回复 回复 引用 0
      • cssxsh
        cssxsh 最后由 编辑

        为啥要 自己实现 save

        我记得 reload 和 save 都有 扩展函数来着

        MrXiaoM 1 条回复 最后回复 回复 引用 0
        • MrXiaoM
          MrXiaoM 童心未泯 @cssxsh 最后由 编辑

          @cssxsh ReadOnlyPluginData 执行 save 会报 NoSuchMethodError

          cssxsh 1 条回复 最后回复 回复 引用 0
          • cssxsh
            cssxsh @MrXiaoM 最后由 编辑

            @MrXiaoM
            ?

            1 条回复 最后回复 回复 引用 1
            • 1 / 1
            • First post
              Last post
            Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact