fix(config): 临时修复 master_users 加载失败问题

问题描述:
由于未明原因,配置文件(bot_config.toml)中的 `permission.master_users` 字段在加载过程中被意外清空,导致权限系统无法正确识别 Master 用户。初步排查指向复杂的配置版本自动更新与迁移逻辑。

解决方案:
在 `config.py` 的 `load_config` 函数中,于 Pydantic 模型验证完成后,增加了一段临时修复代码。该代码会从 `tomlkit` 解析出的原始配置数据中,重新读取 `master_users` 的值,并将其强制赋给最终的 `config` 对象。

具体实现:
1.  使用 `config_data.unwrap()` 将 `tomlkit` 对象安全地转换为标准 Python 字典。
2.  从字典中提取 `permission.master_users` 的值。
3.  将提取到的值直接赋给 `config.permission.master_users`。
4.  添加了详细的日志,以便追踪此修复操作的执行情况。

影响:
-   **正面**:立即恢复了 Master 用户的识别功能,解决了权限检查失效的核心问题。
-   **注意**:这是一个临时性的解决方案(workaround),并未从根本上解决配置更新逻辑中可能存在的缺陷。后续仍需对该逻辑进行深入排查和重构。
This commit is contained in:
tt-P607
2025-11-20 14:39:27 +08:00
parent 5374c26732
commit 5a93867417
2 changed files with 46 additions and 9 deletions

View File

@@ -34,20 +34,39 @@ class PermissionManager(IPermissionManager):
def _load_master_users(self):
"""从配置文件加载Master用户列表"""
logger.info("开始从配置文件加载Master用户...")
try:
master_users_config = global_config.permission.master_users
if not isinstance(master_users_config, list):
logger.warning(f"配置文件中的 permission.master_users 不是一个列表,已跳过加载。")
self._master_users = set()
return
self._master_users = set()
for user_info in master_users_config:
if isinstance(user_info, list) and len(user_info) == 2:
platform, user_id = user_info
self._master_users.add((str(platform), str(user_id)))
logger.info(f"已加载 {len(self._master_users)} 个Master用户")
for i, user_info in enumerate(master_users_config):
if not isinstance(user_info, list) or len(user_info) != 2:
logger.warning(f"Master用户配置项格式错误 (索引: {i}): {user_info},应为 [\"platform\", \"user_id\"]")
continue
platform, user_id = user_info
if not isinstance(platform, str) or not isinstance(user_id, str):
logger.warning(
f"Master用户配置项 platform 或 user_id 类型错误 (索引: {i}): [{type(platform).__name__}, {type(user_id).__name__}],应为字符串"
)
continue
self._master_users.add((platform, user_id))
logger.debug(f"成功加载Master用户: platform={platform}, user_id={user_id}")
logger.info(f"成功加载 {len(self._master_users)} 个Master用户")
except Exception as e:
logger.warning(f"加载Master用户配置失败: {e}")
logger.error(f"加载Master用户配置时发生严重错误: {e}", exc_info=True)
self._master_users = set()
def reload_master_users(self):
"""重新加载Master用户配置"""
logger.info("正在重新加载Master用户配置...")
self._load_master_users()
logger.info("Master用户配置已重新加载")
@@ -62,10 +81,10 @@ class PermissionManager(IPermissionManager):
bool: 是否为Master用户
"""
user_tuple = (user.platform, user.user_id)
is_master = user_tuple in self._master_users
if is_master:
is_master_flag = user_tuple in self._master_users
if is_master_flag:
logger.debug(f"用户 {user.platform}:{user.user_id} 是Master用户")
return is_master
return is_master_flag
async def check_permission(self, user: UserInfo, permission_node: str) -> bool:
"""