sealdice/sealdice-core

[Bug]: 未使用的插件配置项仍会展示为使用中

Closed this issue · 0 comments

在提问之前...

  • 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决
  • 我填写了简短且清晰明确的标题,以便开发者在翻阅 issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
  • 我已查看master branch或最新测试版的更新内容,并未提及该 bug 已被修复的情况
  • 已有issue中并没有看见其他人与我反馈相同的问题

问题描述

未使用的插件配置项仍会展示为使用中

如何复现

任意插件注册任意配置项,随后删除注册函数/删除插件后重载

你期望发生的

原有的配置项被标记为不再使用

实际上发生的

原有的配置项无变化

日志文件

截图

No response

海豹核心版本

main

操作系统

NA

帐号类型

NA

使用协议

No response

附加内容

// Mark all loaded configs as deprecated
for i := range cm.Plugins {
for j := range cm.Plugins[i].Configs {
temp := cm.Plugins[i].Configs[j]
// 将 json 数值反序列化到 any 类型时,即使数值是整数也会使用 float64。因此新增的配置项(int64)和从文件里恢复的配置项(float64)类型不同。
if f64v, ok := temp.Value.(float64); ok && temp.Type == "int" {
temp.Value = int64(f64v)
}
// 修复无法从[]interface{}断言[]string
if infv, ok := temp.Value.([]interface{}); ok && temp.Type == "template" {
var strarr []string
for _, strv := range infv {
strarr = append(strarr, strv.(string))
}
temp.Value = strarr
}
temp.Deprecated = true
cm.Plugins[i].Configs[j] = temp
}
}
return nil
}

原有的实现在从硬盘读取配置项时,会将所有配置项标记为未使用,直到加载插件时,插件主动注册配置项为止。通过这种方式识别插件不再使用或已删除插件的配置项。

if v, ok := raw["deprecated"]; ok {
if i.Deprecated, ok = v.(bool); !ok {
return errors.New("'deprecated' must be a bool")
}
}

在实现 Unmarshal 后,由于 deprecated 字段未落盘/或落盘为 false,导致行为与此前不一致。