新增 LINE 官方账号对接的全套功能,包括: 1. 基础的 Bot 探测、会话解析、消息格式化能力 2. 富媒体消息模板、快速回复、卡片指令支持 3. Webhook 签名验证、重放防护、多账户路由管理 4. 消息发送、回复、分块传输、用户绑定管理 5. 交互式配置向导与诊断工具
57 lines
2.0 KiB
Python
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
|