From 8062cf406a2ee7df6d951687c8cef08356dcb1d7 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Tue, 10 Jun 2025 23:30:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=80=A7=E6=A3=80=E6=9F=A5=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E8=AF=81=E9=85=8D=E7=BD=AE=E9=A1=B9=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E7=9A=84=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/astrbot_config.py | 48 ++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/astrbot/core/config/astrbot_config.py b/astrbot/core/config/astrbot_config.py index 3f97bf333..5d1f6fbe7 100644 --- a/astrbot/core/config/astrbot_config.py +++ b/astrbot/core/config/astrbot_config.py @@ -83,29 +83,61 @@ class AstrBotConfig(dict): return conf def check_config_integrity(self, refer_conf: Dict, conf: Dict, path=""): - """检查配置完整性,如果有新的配置项则返回 True""" + """检查配置完整性,如果有新的配置项或顺序不一致则返回 True""" has_new = False + + # 创建一个新的有序字典以保持参考配置的顺序 + new_conf = {} + + # 先按照参考配置的顺序添加配置项 for key, value in refer_conf.items(): if key not in conf: - # logger.info(f"检查到配置项 {path + "." + key if path else key} 不存在,已插入默认值 {value}") + # 配置项不存在,插入默认值 path_ = path + "." + key if path else key logger.info(f"检查到配置项 {path_} 不存在,已插入默认值 {value}") - conf[key] = value + new_conf[key] = value has_new = True else: if conf[key] is None: - conf[key] = value + # 配置项为 None,使用默认值 + new_conf[key] = value has_new = True elif isinstance(value, dict): - has_new |= self.check_config_integrity( - value, conf[key], path + "." + key if path else key - ) + # 递归检查子配置项 + if not isinstance(conf[key], dict): + # 类型不匹配,使用默认值 + new_conf[key] = value + has_new = True + else: + # 递归检查并同步顺序 + child_has_new = self.check_config_integrity( + value, conf[key], path + "." + key if path else key + ) + new_conf[key] = conf[key] + has_new |= child_has_new + else: + # 直接使用现有配置 + new_conf[key] = conf[key] + + # 检查是否存在参考配置中没有的配置项 for key in list(conf.keys()): if key not in refer_conf: path_ = path + "." + key if path else key logger.info(f"检查到配置项 {path_} 不存在,将从当前配置中删除") - del conf[key] has_new = True + + # 顺序不一致也算作变更 + if list(conf.keys()) != list(new_conf.keys()): + if path: + logger.info(f"检查到配置项 {path} 的子项顺序不一致,已重新排序") + else: + logger.info("检查到配置项顺序不一致,已重新排序") + has_new = True + + # 更新原始配置 + conf.clear() + conf.update(new_conf) + return has_new def save_config(self, replace_config: Dict = None):