from __future__ import annotations from typing import Any from yuxi.utils.logging_config import logger class LINEBindingsProvider: """LINE 用户 ↔ ForcePilot 用户绑定配置。""" def __init__(self, adapter=None): self._adapter = adapter self._bindings: dict[str, str] = {} def load_bindings(self, bindings_config: dict[str, str]) -> None: for line_user_id, fp_user_id in bindings_config.items(): self._bindings[line_user_id] = fp_user_id logger.info(f"[LINE Bindings] Loaded {len(self._bindings)} bindings") def get_binding(self, line_user_id: str) -> str | None: return self._bindings.get(line_user_id) def set_binding(self, line_user_id: str, fp_user_id: str) -> None: self._bindings[line_user_id] = fp_user_id logger.info(f"[LINE Bindings] Bound {line_user_id} → {fp_user_id}") def remove_binding(self, line_user_id: str) -> bool: if line_user_id in self._bindings: del self._bindings[line_user_id] logger.info(f"[LINE Bindings] Removed binding for {line_user_id}") return True return False def list_bindings(self) -> dict[str, str]: return dict(self._bindings) def resolve_fp_user(self, line_user_id: str) -> str | None: return self._bindings.get(line_user_id) def resolve_line_user(self, fp_user_id: str) -> str | None: for line_id, fp_id in self._bindings.items(): if fp_id == fp_user_id: return line_id return None async def enrich_message(self, line_user_id: str, metadata: dict[str, Any]) -> dict[str, Any]: fp_user = self.resolve_fp_user(line_user_id) if fp_user: metadata["fp_user_id"] = fp_user if self._adapter: try: user_info = await self._adapter.get_user_info(line_user_id) metadata["line_user_info"] = user_info except Exception: pass return metadata