This commit is contained in:
qsc
2026-09-07 15:48:05 +08:00
parent 670164b804
commit 8e48869c6d
12 changed files with 52 additions and 33 deletions
+15 -8
View File
@@ -154,22 +154,29 @@ class CacheService:
@staticmethod
def _build_asset_signature(roots: Iterable[Path]) -> str:
parts: list[str] = []
for root in roots:
signature = hashlib.sha256()
for root_index, root in enumerate(roots):
path = Path(root)
if not path.exists():
continue
for item in sorted(
candidate for candidate in path.rglob("*") if candidate.is_file()
(candidate for candidate in path.rglob("*") if candidate.is_file()),
key=lambda candidate: candidate.relative_to(path).as_posix(),
):
try:
stat = item.stat()
content_hash = hashlib.sha256()
with item.open("rb") as file:
while chunk := file.read(1024 * 1024):
content_hash.update(chunk)
except OSError:
continue
parts.append(
f"{item.relative_to(path)}:{stat.st_size}:{stat.st_mtime_ns}"
)
return hashlib.sha256("|".join(parts).encode("utf-8")).hexdigest()
relative_path = item.relative_to(path).as_posix()
signature.update(str(root_index).encode("ascii"))
signature.update(b"\0")
signature.update(relative_path.encode("utf-8"))
signature.update(b"\0")
signature.update(content_hash.digest())
return signature.hexdigest()
async def initialize(self):
self.image_dir.mkdir(parents=True, exist_ok=True)
+2
View File
@@ -334,6 +334,7 @@ class EventPushService:
self.session_control = session_control
self.url = str(config.get("jx3api_wss", "") or DEFAULT_WSS_URL).strip()
self.token = str(config.get("jx3api_wss_token", "") or "").strip()
self.tls_verify = config.get("tls_verify", True) is not False
self._runner: asyncio.Task | None = None
self._session: ClientSession | None = None
self._websocket: aiohttp.ClientWebSocketResponse | None = None
@@ -408,6 +409,7 @@ class EventPushService:
connection_url,
heartbeat=45,
autoping=True,
ssl=self.tls_verify,
) as websocket:
self._websocket = websocket
retry_count = 0
+4 -2
View File
@@ -86,10 +86,12 @@ class JX3APIService:
sqlite: AsyncSQLiteDB,
cache: Optional["CacheService"] = None,
):
# 实例化 API Client
self._api: APIClient = APIClient()
# 引用插件配置文件
self._config = config
# 仅显式配置为 false 时关闭证书验证,旧配置默认安全开启。
self._api: APIClient = APIClient(
ssl_verify=self._config.get("tls_verify", True) is not False
)
# 引用sqlite
self._sql_db = sqlite
self._cache = cache
+4 -2
View File
@@ -23,10 +23,12 @@ JX3BOX_API_BASE_URLS = {
class JX3BOXService:
def __init__(self, config: AstrBotConfig, sqlite: AsyncSQLiteDB, cache_sqlite: Optional[AsyncSQLiteDB] = None):
# 实例化 API Client
self._api: APIClient = APIClient()
# 引用插件配置文件
self._config = config
# 仅显式配置为 false 时关闭证书验证,旧配置默认安全开启。
self._api: APIClient = APIClient(
ssl_verify=self._config.get("tls_verify", True) is not False
)
# 引用sqlite
self._sql_db = sqlite
self._cache_db = cache_sqlite or sqlite
+1 -1
View File
@@ -26,7 +26,7 @@ class APIClient:
3. 支持异步上下文管理器 (Async Context Manager)。
"""
def __init__(self, base_timeout: int = 10, ssl_verify: bool = False):
def __init__(self, base_timeout: int = 10, ssl_verify: bool = True):
self.base_timeout = base_timeout
self.ssl_verify = ssl_verify
self._session: Optional[ClientSession] = None
+1 -9
View File
@@ -62,7 +62,6 @@ class WebUIService:
("aliases/restore", self.restore_aliases, ["POST"], "恢复默认区服别名"),
("kungfu/save", self.save_kungfu, ["POST"], "保存心法别名"),
("kungfu/restore", self.restore_kungfu, ["POST"], "恢复默认心法别名"),
("servers/refresh", self.refresh_servers, ["POST"], "刷新区服目录"),
(
"session-control/mode",
self.save_session_control_mode,
@@ -141,7 +140,7 @@ class WebUIService:
"subscriptions": subscriptions,
"aliases": aliases,
"kungfu": kungfu,
"servers": self.server_binding.standard_servers(),
"servers": [item["server"] for item in aliases],
"events": {str(action): name for action, name in EVENT_NAMES.items()},
"free_event_actions": sorted(FREE_EVENT_ACTIONS),
"session_control": session_control,
@@ -244,13 +243,6 @@ class WebUIService:
return error_response(str(exc), status_code=500)
return json_response({"restored": restored})
async def refresh_servers(self):
servers = await self.jx3api.server_list(force_refresh=True)
if not servers:
return error_response("区服目录刷新失败", status_code=502)
await self.server_binding.update_server_catalog(servers)
return json_response({"servers": self.server_binding.standard_servers()})
async def save_session_control_mode(self):
try:
payload = await self._json_payload()