ForcePilot/backend/package/yuxi/channels/adapters/line/bindings.py

57 lines
2.0 KiB
Python
Raw Normal View History

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