ForcePilot/backend/package/yuxi/channels/adapters/nextcloudtalk/config.py
Kris b018ad25da feat(backend): add Nextcloud Talk channel adapter implementation
实现了完整的Nextcloud Talk聊天适配器,包含以下核心功能:
1. 基础客户端通信与认证
2. 会话路由与聊天类型解析
3. 消息分块与格式转换
4. 用户配对与权限校验
5. 轮询式消息监听
6. 配置验证与诊断工具
7. 安全策略与去重缓存
8. 指标统计与状态快照

新增配套的配对用户缓存文件与模块导出入口。
2026-05-12 00:47:06 +08:00

92 lines
2.9 KiB
Python

from __future__ import annotations
from typing import Any, Literal
MatchSource = Literal["direct", "wildcard", "none"]
def resolve_room_config(
token: str,
config: dict[str, Any],
) -> dict[str, Any]:
rooms_cfg = config.get("rooms", {})
if not rooms_cfg:
return {"_match_source": "none"}
match_source: MatchSource = "wildcard"
merged: dict[str, Any] = dict(rooms_cfg.get("*", {}))
if rooms_cfg.get("*"):
match_source = "wildcard"
if token in rooms_cfg:
merged.update(rooms_cfg[token])
match_source = "direct"
merged["_match_source"] = match_source
return merged
def resolve_room_enabled(token: str, config: dict[str, Any]) -> bool:
room_cfg = resolve_room_config(token, config)
return room_cfg.get("enabled", room_cfg.get("enabled_", True))
def resolve_room_require_mention(token: str, config: dict[str, Any]) -> bool:
room_cfg = resolve_room_config(token, config)
return room_cfg.get("requireMention", room_cfg.get("require_mention", True))
def resolve_room_system_prompt(token: str, config: dict[str, Any]) -> str | None:
room_cfg = resolve_room_config(token, config)
return room_cfg.get("systemPrompt", room_cfg.get("system_prompt"))
def resolve_room_allow_from(token: str, config: dict[str, Any]) -> list[str]:
room_cfg = resolve_room_config(token, config)
return room_cfg.get("allowFrom", room_cfg.get("allow_from", []))
def resolve_room_skills(token: str, config: dict[str, Any]) -> list[str]:
room_cfg = resolve_room_config(token, config)
return room_cfg.get("skills", [])
def resolve_dm_config(user_id: str, config: dict[str, Any]) -> dict[str, Any]:
dms_cfg = config.get("dms", {})
if not dms_cfg:
return {}
merged: dict[str, Any] = dict(dms_cfg.get("*", {}))
if user_id in dms_cfg:
merged.update(dms_cfg[user_id])
return merged
def resolve_dm_enabled(user_id: str, config: dict[str, Any]) -> bool:
dm_cfg = resolve_dm_config(user_id, config)
return dm_cfg.get("enabled", True)
def resolve_dm_system_prompt(user_id: str, config: dict[str, Any]) -> str | None:
dm_cfg = resolve_dm_config(user_id, config)
return dm_cfg.get("systemPrompt", dm_cfg.get("system_prompt"))
def resolve_dm_skills(user_id: str, config: dict[str, Any]) -> list[str]:
dm_cfg = resolve_dm_config(user_id, config)
return dm_cfg.get("skills", [])
def resolve_history_limit(token: str, config: dict[str, Any], chat_type: str = "group") -> int:
if chat_type == "direct":
dm_limit = resolve_dm_config(token, config).get("historyLimit")
if dm_limit is not None:
return int(dm_limit)
return config.get("dmHistoryLimit", config.get("dm_history_limit", 0))
room_cfg = resolve_room_config(token, config)
room_limit = room_cfg.get("historyLimit")
if room_limit is not None:
return int(room_limit)
return config.get("historyLimit", config.get("history_limit", 0))