ForcePilot/backend/package/yuxi/channels/adapters/imessage/contact_resolver.py
Kris 068cf70fe9 feat(imessage): 实现完整的 iMessage 适配器基础模块
新增 iMessage 通道适配器完整实现,包含:
1. 核心适配器与工具工厂导出
2. 运行时存储、反射防护、会话路由等基础组件
3. 消息信封、线程管理、回复上下文格式化
4. Tapback 表情反应处理、自定义异常体系
5. 审批按钮、联系人解析、速率限制功能
6. 文本净化、目标解析、缓存管理模块
7. 配置 schema、多账户支持、安装向导等配置模块
8. 审计日志、媒体AI处理等扩展功能
2026-05-12 00:44:44 +08:00

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}