实现了完整的Nextcloud Talk聊天适配器,包含以下核心功能: 1. 基础客户端通信与认证 2. 会话路由与聊天类型解析 3. 消息分块与格式转换 4. 用户配对与权限校验 5. 轮询式消息监听 6. 配置验证与诊断工具 7. 安全策略与去重缓存 8. 指标统计与状态快照 新增配套的配对用户缓存文件与模块导出入口。
92 lines
2.9 KiB
Python
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))
|