这是一个批量整理提交,包含以下主要改动: 1. 删除多处冗余的空行和未使用的导入 2. 修复文件末尾缺少换行符的问题 3. 调整部分模块的导入顺序与代码排版 4. 修复部分配置默认值与策略逻辑 5. 新增多个功能模块与辅助工具 6. 完善异常处理与日志记录 7. 修复速率限制、消息缓存、权限校验等逻辑bug 8. 废弃部分旧有API与配置项并添加警告提示
138 lines
4.7 KiB
Python
138 lines
4.7 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
from yuxi.utils.logging_config import logger
|
|
|
|
|
|
@dataclass
|
|
class YuanbaoAccount:
|
|
account_id: str
|
|
app_key: str
|
|
app_secret: str
|
|
name: str = ""
|
|
enabled: bool = True
|
|
bot_app_id: str | None = None
|
|
token: str | None = None
|
|
api_domain: str = ""
|
|
ws_url: str = ""
|
|
log_upload_api_url: str = ""
|
|
route_env: str = ""
|
|
|
|
token_manager: Any = field(default=None, init=False)
|
|
monitor: Any = field(default=None, init=False)
|
|
|
|
@property
|
|
def display_name(self) -> str:
|
|
return self.name or self.account_id
|
|
|
|
|
|
@dataclass
|
|
class YuanbaoAccountManager:
|
|
accounts: dict[str, YuanbaoAccount] = field(default_factory=dict)
|
|
default_account_id: str = ""
|
|
|
|
def add_account(
|
|
self,
|
|
account_id: str,
|
|
app_key: str,
|
|
app_secret: str,
|
|
name: str = "",
|
|
enabled: bool = True,
|
|
bot_app_id: str | None = None,
|
|
token: str | None = None,
|
|
api_domain: str = "",
|
|
ws_url: str = "",
|
|
log_upload_api_url: str = "",
|
|
route_env: str = "",
|
|
) -> YuanbaoAccount:
|
|
account = YuanbaoAccount(
|
|
account_id=account_id,
|
|
app_key=app_key,
|
|
app_secret=app_secret,
|
|
name=name,
|
|
enabled=enabled,
|
|
bot_app_id=bot_app_id or account_id,
|
|
token=token,
|
|
api_domain=api_domain,
|
|
ws_url=ws_url,
|
|
log_upload_api_url=log_upload_api_url,
|
|
route_env=route_env,
|
|
)
|
|
self.accounts[account_id] = account
|
|
if not self.default_account_id:
|
|
self.default_account_id = account_id
|
|
return account
|
|
|
|
def get_account(self, account_id: str | None = None) -> YuanbaoAccount | None:
|
|
target = account_id or self.default_account_id
|
|
account = self.accounts.get(target)
|
|
if account and account.enabled:
|
|
return account
|
|
return None
|
|
|
|
def get_default_account(self) -> YuanbaoAccount | None:
|
|
return self.get_account(self.default_account_id)
|
|
|
|
def remove_account(self, account_id: str) -> None:
|
|
self.accounts.pop(account_id, None)
|
|
if self.default_account_id == account_id:
|
|
remaining = [a for a in self.accounts if self.accounts[a].enabled]
|
|
if remaining:
|
|
self.default_account_id = remaining[0]
|
|
else:
|
|
self.default_account_id = ""
|
|
logger.warning("[Yuanbao] All accounts removed, no default account available")
|
|
|
|
@property
|
|
def enabled_accounts(self) -> list[YuanbaoAccount]:
|
|
return [a for a in self.accounts.values() if a.enabled]
|
|
|
|
@property
|
|
def account_count(self) -> int:
|
|
return len(self.enabled_accounts)
|
|
|
|
|
|
def load_accounts_from_config(config: dict[str, Any]) -> YuanbaoAccountManager:
|
|
manager = YuanbaoAccountManager()
|
|
|
|
accounts_config = config.get("accounts", {})
|
|
default_account = config.get("defaultAccount", "")
|
|
|
|
if accounts_config:
|
|
for acc_id, acc_cfg in accounts_config.items():
|
|
if isinstance(acc_cfg, dict):
|
|
manager.add_account(
|
|
account_id=acc_id,
|
|
app_key=acc_cfg.get("appKey", acc_cfg.get("app_key", "")),
|
|
app_secret=acc_cfg.get("appSecret", acc_cfg.get("app_secret", "")),
|
|
name=acc_cfg.get("name", acc_id),
|
|
enabled=acc_cfg.get("enabled", True),
|
|
bot_app_id=acc_cfg.get("botAppId", acc_cfg.get("bot_app_id")),
|
|
token=acc_cfg.get("token"),
|
|
api_domain=acc_cfg.get("apiDomain", acc_cfg.get("api_domain", "")),
|
|
ws_url=acc_cfg.get("wsUrl", acc_cfg.get("ws_url", "")),
|
|
log_upload_api_url=acc_cfg.get("logUploadApiUrl", acc_cfg.get("log_upload_api_url", "")),
|
|
route_env=acc_cfg.get("routeEnv", acc_cfg.get("route_env", "")),
|
|
)
|
|
|
|
if default_account and default_account in manager.accounts:
|
|
manager.default_account_id = default_account
|
|
elif manager.enabled_accounts:
|
|
manager.default_account_id = manager.enabled_accounts[0].account_id
|
|
|
|
else:
|
|
manager.add_account(
|
|
account_id=config.get("bot_app_id", "default"),
|
|
app_key=config.get("app_key", ""),
|
|
app_secret=config.get("app_secret", ""),
|
|
name=config.get("account_name", "元宝"),
|
|
enabled=True,
|
|
bot_app_id=config.get("bot_app_id"),
|
|
)
|
|
manager.default_account_id = config.get("bot_app_id", "default")
|
|
|
|
logger.info(f"[Yuanbao] Loaded {manager.account_count} account(s), default={manager.default_account_id}")
|
|
return manager
|