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

49 lines
1.4 KiB
Python

from __future__ import annotations
import logging
from typing import Any
from yuxi.channels.models import ChatType
logger = logging.getLogger(__name__)
def resolve_session_route(
token: str,
conversation_info: dict[str, Any] | None,
default_agent_id: str,
) -> dict[str, str]:
room_type = conversation_info.get("type") if conversation_info else None
if room_type == 1:
route = f"agent:{default_agent_id}:nextcloudtalk:dm:{token}"
else:
route = f"agent:{default_agent_id}:nextcloudtalk:group:{token}"
return {"route": route, "token": token}
def resolve_chat_type(room_type: int | None) -> ChatType:
if room_type == 1:
return ChatType.DIRECT
if room_type in (2, 3):
return ChatType.GROUP
return ChatType.GROUP
def make_thread_key(agent_id: str, token: str, room_type: int | None) -> str:
if room_type == 1:
return f"agent:{agent_id}:nextcloudtalk:dm:{token}"
return f"agent:{agent_id}:nextcloudtalk:group:{token}"
def resolve_conversation_label(conv_info: dict[str, Any]) -> str:
room_type = conv_info.get("type") if conv_info else None
display_name = conv_info.get("display_name", conv_info.get("displayName", "")) if conv_info else ""
name = conv_info.get("name", "") if conv_info else ""
if room_type == 1:
return display_name or name or "Direct Message"
label = display_name or name or "Group"
return f"room:{label}"