Files
HeXi/hexi/plugins/nonebot_plugin_bf_bot/config.py
T

123 lines
4.7 KiB
Python
Raw Normal View History

"""配置:按《插件配置文件标准》注册到统一 Web 管理台。
3 个配置项都与 BF2042 取数通道有关:浏览器扩展桥的端口 / token
(``services/fetchers/tracker_bridge.py``),以及取数浏览器专用配置目录
(登录态所在,诊断提示用)。来源是模块运行态,Web 保存后由 setter 热更新、
立即生效;重启后依次按 plugin_config.json 值、`HEXI_BF_*` 环境变量、默认值回退。
读取一律走本模块的 helper(内部 `get_effective_value`),不要在别处缓存值。
"""
from __future__ import annotations
import os
from hexi.web_hub.config_standard import register_config_items
from hexi.web_hub.web_config import get_effective_value
from .paths import DEFAULT_COOKIES_PATH, EDGE_PROFILE_DIR
_PLUGIN_ID = __package__ or __name__.rsplit(".", 1)[0]
_KEY_EDGE_PROFILE = "bf_edge_profile_dir"
_KEY_EXT_WS_PORT = "bf_ext_ws_port"
_KEY_EXT_WS_TOKEN = "bf_ext_ws_token"
# 旧 cookie 通道的配置键:仅保留读取 helper 兼容旧调用,不再注册
_KEY_COOKIES = "bf_tracker_cookies_path"
# 运行态现值:启动时用环境变量兜底初始化(ENV 名与 Web 写回的 .env 名一致)
_state: dict[str, object] = {
_KEY_EDGE_PROFILE: os.environ.get("HEXI_BF_EDGE_PROFILE") or str(EDGE_PROFILE_DIR),
_KEY_EXT_WS_PORT: os.environ.get("HEXI_BF_EXT_WS_PORT") or "39272",
_KEY_EXT_WS_TOKEN: os.environ.get("HEXI_BF_EXT_WS_TOKEN") or "hexi-bf2042",
_KEY_COOKIES: os.environ.get("HEXI_BF_TRACKER_COOKIES")
or str(DEFAULT_COOKIES_PATH),
}
def edge_profile_dir() -> str:
"""BF2042 取数浏览器专用配置目录(内含登录态、CF 信任与捕获桥扩展)。"""
value = get_effective_value(_PLUGIN_ID, _KEY_EDGE_PROFILE, None)
if value:
return str(value)
return str(_state[_KEY_EDGE_PROFILE] or EDGE_PROFILE_DIR)
def ext_ws_port() -> int:
"""扩展桥 WS 服务端端口(仅本机回环)。"""
value = get_effective_value(_PLUGIN_ID, _KEY_EXT_WS_PORT, None)
if value is None:
value = _state[_KEY_EXT_WS_PORT]
try:
return int(str(value))
except (TypeError, ValueError):
return 39272
def ext_ws_token() -> str:
"""扩展桥共享 token(扩展 background.js 顶部常量需与之保持一致)。"""
value = get_effective_value(_PLUGIN_ID, _KEY_EXT_WS_TOKEN, None)
if value:
return str(value)
return str(_state[_KEY_EXT_WS_TOKEN] or "hexi-bf2042")
def tracker_cookies_path() -> str:
"""[旧通道兼容] Netscape 格式 cookie 文件路径。"""
value = get_effective_value(_PLUGIN_ID, _KEY_COOKIES, None)
if value:
return str(value)
return str(_state[_KEY_COOKIES] or DEFAULT_COOKIES_PATH)
def _set(key: str, value: object) -> None:
_state[key] = value
def register_config() -> None:
"""注册 3 个取数通道配置项(Web 可读可改,保存即生效)。"""
register_config_items(
_PLUGIN_ID,
[
{
"key": _KEY_EXT_WS_PORT,
"label": "扩展桥 WS 端口",
"type": "string",
"default": "39272",
"env": "HEXI_BF_EXT_WS_PORT",
"description": (
"扩展桥在本机 127.0.0.1 的监听端口(仅回环)。"
"改后需重启 bot,且扩展 background.js 顶部常量要同步。"
),
"getter": lambda: _state[_KEY_EXT_WS_PORT],
"setter": lambda v: _set(_KEY_EXT_WS_PORT, v),
},
{
"key": _KEY_EXT_WS_TOKEN,
"label": "扩展桥 token",
"type": "password",
"default": "hexi-bf2042",
"env": "HEXI_BF_EXT_WS_TOKEN",
"description": (
"扩展连接时的共享密钥(防本机其它程序误连)。"
"与扩展 background.js 顶部 WS_TOKEN 保持一致;保存即生效。"
),
"getter": lambda: _state[_KEY_EXT_WS_TOKEN],
"setter": lambda v: _set(_KEY_EXT_WS_TOKEN, v),
},
{
"key": _KEY_EDGE_PROFILE,
"label": "取数浏览器配置目录",
"type": "path",
"default": str(EDGE_PROFILE_DIR),
"env": "HEXI_BF_EDGE_PROFILE",
"description": (
"取数浏览器的专用用户数据目录(登录态 + CF 信任 + 捕获桥扩展都在这)。"
"会话过期时用它打开 Edge 手动登录一次即可。"
),
"getter": lambda: _state[_KEY_EDGE_PROFILE],
"setter": lambda v: _set(_KEY_EDGE_PROFILE, v),
},
],
)