ForcePilot/backend/package/yuxi/channel/extensions/matrix/room_resolver.py

81 lines
2.7 KiB
Python
Raw Normal View History

from __future__ import annotations
import logging
from .utils import is_room_alias, is_room_id
logger = logging.getLogger(__name__)
class RoomResolver:
def __init__(self):
self._room_cache: dict[str, dict] = {}
async def resolve_room_id(self, identifier: str, client=None) -> str | None:
if is_room_id(identifier):
return identifier
if is_room_alias(identifier):
return await self._resolve_alias(identifier, client)
return None
async def resolve_room_name(self, room_id: str, client=None) -> str:
cached = self._room_cache.get(room_id, {})
name = cached.get("name", "")
if name:
return name
if client is not None:
try:
resp = await client.room_get_state_event(room_id, "m.room.name")
name = resp.content.get("name", "")
if name:
self._update_cache(room_id, name=name)
except Exception:
logger.debug("Failed to resolve room name for %s", room_id)
return name or room_id
async def resolve_room_topic(self, room_id: str, client=None) -> str:
cached = self._room_cache.get(room_id, {})
topic = cached.get("topic", "")
if topic:
return topic
if client is not None:
try:
resp = await client.room_get_state_event(room_id, "m.room.topic")
topic = resp.content.get("topic", "")
if topic:
self._update_cache(room_id, topic=topic)
except Exception:
logger.debug("Failed to resolve room topic for %s", room_id)
return topic
async def search_user_directory(self, search_term: str, client=None) -> list[dict]:
if client is None:
return []
try:
resp = await client.search_user_directory(search_term)
return resp.results
except Exception:
logger.debug("Failed to search user directory for '%s'", search_term)
return []
async def _resolve_alias(self, alias: str, client) -> str | None:
if client is None:
return None
try:
resp = await client.room_resolve_alias(alias)
room_id = resp.room_id
self._update_cache(room_id, alias=alias)
return room_id
except Exception:
logger.debug("Failed to resolve alias %s", alias)
return None
def _update_cache(self, room_id: str, **kwargs) -> None:
entry = self._room_cache.setdefault(room_id, {})
entry.update(kwargs)
def clear(self) -> None:
self._room_cache.clear()