ForcePilot/backend/package/yuxi/channels/adapters/nextcloudtalk/normalize.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

60 lines
1.7 KiB
Python

from __future__ import annotations
import logging
import re
logger = logging.getLogger(__name__)
CHANNEL_PREFIX = "nextcloud-talk"
_PURE_TOKEN_PATTERN = re.compile(r"^[a-z0-9]{20,64}$")
def is_pure_token(target: str) -> bool:
return bool(_PURE_TOKEN_PATTERN.match(target.strip()))
def resolve_target_with_hint(target: str) -> tuple[str, dict[str, str]]:
target = target.strip().lower()
hints: dict[str, str] = {}
if is_pure_token(target):
hints["resolver_hint"] = "direct_token"
return f"{CHANNEL_PREFIX}:{target}", hints
if target.startswith("room:"):
hints["resolver_hint"] = "room_token"
elif target.startswith("user:"):
hints["resolver_hint"] = "user_id"
result = normalize_nc_target(target)
return result, hints
def normalize_nc_target(target: str) -> str:
target = target.strip().lower()
for prefix in ("nextcloud-talk:", "nextcloudtalk:", "nc-talk:", "nc:"):
if target.startswith(prefix):
target = target[len(prefix) :]
break
return f"{CHANNEL_PREFIX}:{target}"
def strip_nc_prefix(target: str) -> str:
target = target.strip().lower()
for prefix in ("nextcloud-talk:", "nextcloudtalk:", "nc-talk:", "nc:"):
if target.startswith(prefix):
return target[len(prefix) :]
return target
def looks_like_nc_target(target_id: str) -> bool:
target_id = target_id.strip().lower()
prefixes = ("nextcloud-talk:", "nextcloudtalk:", "nc-talk:", "nc:")
return any(target_id.startswith(p) for p in prefixes)
def normalize_room_target(token: str) -> str:
return f"{CHANNEL_PREFIX}:room:{token}"
def normalize_user_target(user_id: str) -> str:
return f"{CHANNEL_PREFIX}:{user_id}"