ForcePilot/backend/package/yuxi/channels/adapters/imessage/contact_resolver.py

47 lines
1.7 KiB
Python
Raw Normal View History

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}