新增 Tlon 渠道扩展,支持在 Yuxi 平台中集成 Tlon/Urbit 去中心化通讯平台。 包含以下功能模块: - tlon_api: Tlon API 客户端封装 - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - sse_client: SSE 客户端 - outbound: 外发消息管理 - send: 消息发送 - security: 安全校验 - auth: 认证管理 - monitor: 渠道状态监控 - status: 会话状态管理 - session: 会话管理 - approval: 审批流程 - channel_mgmt: 频道管理 - channel_ops: 频道操作 - contacts: 联系人管理 - discovery: 服务发现 - doctor: 健康诊断 - expose: 服务暴露 - gallery: 图库管理 - history: 历史记录 - hooks: 钩子管理 - media: 媒体资源处理 - notebook: 笔记本功能 - settings_store: 设置存储 - setup: 初始化设置 - story: 故事功能 - targets: 目标管理 - cite_parser: 引用解析 - utils: 工具函数 - types: 类型定义
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
import logging
|
|
|
|
from yuxi.channel.extensions.tlon.utils import normalize_ship
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def list_contacts(api) -> list[dict]:
|
|
try:
|
|
data = await api.scry("/contacts/all.json")
|
|
if not data:
|
|
data = await api.scry("/contacts/v1/all.json")
|
|
result = []
|
|
contacts = data.get("contacts", data)
|
|
for ship, contact in contacts.items():
|
|
if not isinstance(contact, dict):
|
|
continue
|
|
result.append({
|
|
"ship": ship,
|
|
"nickname": contact.get("nickname", ""),
|
|
"bio": contact.get("bio", ""),
|
|
"status": contact.get("status", ""),
|
|
"avatar": contact.get("avatar", ""),
|
|
"cover": contact.get("cover", ""),
|
|
})
|
|
return result
|
|
except Exception as e:
|
|
logger.warning("[tlon] Failed to list contacts: %s", e)
|
|
return []
|
|
|
|
|
|
async def add_contact(api, ship: str, nickname: str = "",
|
|
bio: str = "", status: str = "") -> None:
|
|
payload = {"add": {"ship": normalize_ship(ship)}}
|
|
if nickname:
|
|
payload["add"]["nickname"] = nickname
|
|
if bio:
|
|
payload["add"]["bio"] = bio
|
|
if status:
|
|
payload["add"]["status"] = status
|
|
await api.poke(app="contacts", mark="contact-action-1", json_data=payload)
|
|
|
|
|
|
async def remove_contact(api, ship: str) -> None:
|
|
await api.poke(app="contacts",
|
|
mark="contact-action-1",
|
|
json_data={"del": {"ship": normalize_ship(ship)}})
|
|
|
|
|
|
async def update_profile(api, ship: str, nickname: str = "",
|
|
bio: str = "", status: str = "",
|
|
avatar: str = "", cover: str = "") -> None:
|
|
edit_payload = {"ship": normalize_ship(ship)}
|
|
if nickname:
|
|
edit_payload["nickname"] = nickname
|
|
if bio:
|
|
edit_payload["bio"] = bio
|
|
if status:
|
|
edit_payload["status"] = status
|
|
if avatar:
|
|
edit_payload["avatar"] = avatar
|
|
if cover:
|
|
edit_payload["cover"] = cover
|
|
await api.poke(app="contacts", mark="contact-action-1",
|
|
json_data={"edit": edit_payload})
|
|
|
|
|
|
async def sync_contacts(api) -> list[dict]:
|
|
await api.poke(app="contacts", mark="contact-action-1",
|
|
json_data={"sync": {}})
|
|
return await list_contacts(api) |