fxdyz
This commit is contained in:
+15
-8
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user