ForcePilot/backend/package/yuxi/channels/adapters/matrix/accounts.py
Kris 2063145ce1 feat(matrix): 新增完整的Matrix适配器工具集
新增了20+个Matrix相关工具模块,包含线程处理、自动加入、消息去重、配置管理、安全策略、媒体处理、命令解析等功能,完善Matrix适配器基础能力
2026-05-12 00:45:54 +08:00

109 lines
3.5 KiB
Python

from __future__ import annotations
from typing import Any
class MatrixAccount:
def __init__(self, account_id: str, config: dict[str, Any]):
self.account_id = account_id
self.config = config
self._selected = False
@property
def user_id(self) -> str:
return self.config.get("user_id", "")
@property
def homeserver(self) -> str:
return self.config.get("homeserver", "https://matrix.org")
@property
def is_default(self) -> bool:
return self.config.get("isDefault", False)
@property
def enabled(self) -> bool:
return self.config.get("enabled", True)
def to_dict(self) -> dict[str, Any]:
return {
"account_id": self.account_id,
"user_id": self.user_id,
"homeserver": self.homeserver,
"enabled": self.enabled,
"is_default": self.is_default,
}
def __repr__(self) -> str:
return f"MatrixAccount({self.account_id}: {self.user_id} @ {self.homeserver})"
class MultiAccountManager:
def __init__(self, config: dict[str, Any]):
self._config = config
self._accounts: dict[str, MatrixAccount] = {}
self._default_account_id: str | None = None
self._load_accounts()
def _load_accounts(self) -> None:
accounts_raw = self._config.get("accounts", {})
for account_id, account_config in accounts_raw.items():
if isinstance(account_config, dict):
account = MatrixAccount(account_id, account_config)
self._accounts[account_id] = account
if account.is_default:
self._default_account_id = account_id
if not self._default_account_id and self._accounts:
self._default_account_id = next(iter(self._accounts))
default_account = self._config.get("defaultAccount")
if default_account and default_account in self._accounts:
self._default_account_id = default_account
def get(self, account_id: str | None = None) -> MatrixAccount | None:
if account_id:
return self._accounts.get(account_id)
return self.default_account
@property
def default_account(self) -> MatrixAccount | None:
if self._default_account_id:
return self._accounts.get(self._default_account_id)
return None
@property
def default_account_id(self) -> str | None:
return self._default_account_id
def select_account(self, account_id: str) -> bool:
if account_id in self._accounts:
self._default_account_id = account_id
return True
return False
def list_accounts(self) -> list[MatrixAccount]:
return list(self._accounts.values())
def resolve_room_account(self, room_id: str) -> str | None:
rooms_config = self._config.get("rooms", {})
room_cfg = rooms_config.get(room_id, {})
return room_cfg.get("account")
def promote_to_default(self, account_id: str) -> bool:
if account_id in self._accounts:
self._default_account_id = account_id
self._accounts[account_id]._selected = True
for aid, acc in self._accounts.items():
acc.config["isDefault"] = aid == account_id
return True
return False
@property
def account_count(self) -> int:
return len(self._accounts)
@property
def has_multi_account(self) -> bool:
return len(self._accounts) > 1