ForcePilot/backend/package/yuxi/channels/adapters/line/bindings.py
Kris a4ec94ef9d feat(line): 实现完整的 LINE 聊天适配器功能
新增 LINE 官方账号对接的全套功能,包括:
1. 基础的 Bot 探测、会话解析、消息格式化能力
2. 富媒体消息模板、快速回复、卡片指令支持
3. Webhook 签名验证、重放防护、多账户路由管理
4. 消息发送、回复、分块传输、用户绑定管理
5. 交互式配置向导与诊断工具
2026-05-12 00:45:33 +08:00

57 lines
2.0 KiB
Python

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