新增 iMessage 通道适配器完整实现,包含: 1. 核心适配器与工具工厂导出 2. 运行时存储、反射防护、会话路由等基础组件 3. 消息信封、线程管理、回复上下文格式化 4. Tapback 表情反应处理、自定义异常体系 5. 审批按钮、联系人解析、速率限制功能 6. 文本净化、目标解析、缓存管理模块 7. 配置 schema、多账户支持、安装向导等配置模块 8. 审计日志、媒体AI处理等扩展功能
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from yuxi.utils.logging_config import logger
|
|
|
|
|
|
async def resolve_contact(bridge, address: str) -> dict[str, Any]:
|
|
try:
|
|
contacts = await bridge.query_contacts([address])
|
|
if contacts:
|
|
contact = contacts[0]
|
|
return {
|
|
"address": contact.get("address", address),
|
|
"display_name": contact.get("displayName", ""),
|
|
"first_name": contact.get("firstName", ""),
|
|
"last_name": contact.get("lastName", ""),
|
|
}
|
|
return {"address": address, "display_name": ""}
|
|
except Exception as e:
|
|
logger.warning(f"[iMessage] Contact resolution failed for {address}: {e}")
|
|
return {"address": address, "display_name": ""}
|
|
|
|
|
|
async def resolve_contacts_batch(bridge, addresses: list[str]) -> dict[str, dict[str, Any]]:
|
|
if not addresses:
|
|
return {}
|
|
|
|
try:
|
|
contacts = await bridge.query_contacts(addresses)
|
|
resolved: dict[str, dict[str, Any]] = {}
|
|
for contact in contacts:
|
|
addr = contact.get("address", "")
|
|
resolved[addr] = {
|
|
"address": addr,
|
|
"display_name": contact.get("displayName", ""),
|
|
"first_name": contact.get("firstName", ""),
|
|
"last_name": contact.get("lastName", ""),
|
|
}
|
|
for addr in addresses:
|
|
if addr not in resolved:
|
|
resolved[addr] = {"address": addr, "display_name": ""}
|
|
return resolved
|
|
except Exception as e:
|
|
logger.warning(f"[iMessage] Batch contact resolution failed: {e}")
|
|
return {addr: {"address": addr, "display_name": ""} for addr in addresses}
|