ForcePilot/backend/package/yuxi/channels/adapters/mattermost/config_writes.py
Kris 1f78c44b03 refactor: 整理并清理项目中的冗余代码与格式问题
这是一个批量整理提交,包含以下主要改动:
1.  删除多处冗余的空行和未使用的导入
2.  修复文件末尾缺少换行符的问题
3.  调整部分模块的导入顺序与代码排版
4.  修复部分配置默认值与策略逻辑
5.  新增多个功能模块与辅助工具
6.  完善异常处理与日志记录
7.  修复速率限制、消息缓存、权限校验等逻辑bug
8.  废弃部分旧有API与配置项并添加警告提示
2026-05-12 14:51:53 +08:00

104 lines
3.4 KiB
Python

from __future__ import annotations
from collections.abc import Callable
from typing import Any
from yuxi.utils.logging_config import logger
class ConfigWritesManager:
"""配置写入管理 — 允许通过命令动态修改 Mattermost 渠道配置。
支持的写操作:
- dm_policy、group_policy 安全策略切换
- allow_from / group_allow_from 白名单管理
- chatmode / require_mention 行为配置
- reply_to_mode 回复模式
- auto_register_commands 命令注册开关
"""
ALLOWED_WRITE_KEYS = frozenset(
{
"dm_policy",
"group_policy",
"allow_from",
"group_allow_from",
"chatmode",
"require_mention",
"onchar_prefixes",
"reply_to_mode",
"auto_register_commands",
"dangerously_allow_name_matching",
}
)
def __init__(self, config: dict[str, Any] | None = None):
self._config = config or {}
self._observers: list[Callable[[str, Any], None]] = []
def register_observer(self, observer: Callable[[str, Any], None]) -> None:
self._observers.append(observer)
def is_config_writes_enabled(self) -> bool:
return bool(self._config.get("config_writes", False))
def write_config(self, key: str, value: Any) -> bool:
if not self.is_config_writes_enabled():
logger.warning("[Mattermost] Config writes are disabled")
return False
if key not in self.ALLOWED_WRITE_KEYS:
logger.warning(f"[Mattermost] Config write denied for key '{key}'")
return False
self._config[key] = value
logger.info(f"[Mattermost] Config updated: {key} = {value}")
for observer in self._observers:
try:
observer(key, value)
except Exception as e:
logger.error(f"[Mattermost] Config observer error for key '{key}': {e}")
return True
def add_to_allowlist(self, target: str, list_type: str = "dm") -> bool:
key = "allow_from" if list_type == "dm" else "group_allow_from"
if not self.is_config_writes_enabled():
return False
current = self._config.get(key, [])
if not isinstance(current, list):
current = []
from .security import normalize_allow_entry
normalized = normalize_allow_entry(target)
if not normalized:
return False
if normalized not in current:
current.append(normalized)
self._config[key] = current
logger.info(f"[Mattermost] Added '{target}' to {key}")
return True
def remove_from_allowlist(self, target: str, list_type: str = "dm") -> bool:
key = "allow_from" if list_type == "dm" else "group_allow_from"
if not self.is_config_writes_enabled():
return False
current = self._config.get(key, [])
if not isinstance(current, list):
return False
from .security import normalize_allow_entry
normalized = normalize_allow_entry(target)
if normalized in current:
current.remove(normalized)
self._config[key] = current
logger.info(f"[Mattermost] Removed '{target}' from {key}")
return True
def get_config(self) -> dict[str, Any]:
return {k: v for k, v in self._config.items() if k in self.ALLOWED_WRITE_KEYS}