fxdyz
This commit is contained in:
+55
-9
@@ -14,7 +14,9 @@ class ServerBindingService:
|
||||
self.sql = sqlite
|
||||
self.seed_path = seed_path
|
||||
self._remote_servers: set[str] = set()
|
||||
self._standard_servers: set[str] = set()
|
||||
self._known_servers: set[str] = set()
|
||||
self._standard_lookup: dict[str, str] = {}
|
||||
self._server_lookup: dict[str, str] = {}
|
||||
|
||||
async def initialize(self):
|
||||
@@ -38,6 +40,17 @@ class ServerBindingService:
|
||||
await self._reload_cache()
|
||||
|
||||
async def _seed_aliases(self):
|
||||
records = self._load_seed_aliases()
|
||||
for server, aliases_json in records:
|
||||
await self.sql.execute(
|
||||
"""
|
||||
INSERT OR IGNORE INTO server_aliases (server, aliases)
|
||||
VALUES (?, ?)
|
||||
""",
|
||||
(server, aliases_json),
|
||||
)
|
||||
|
||||
def _load_seed_aliases(self) -> list[tuple[str, str]]:
|
||||
try:
|
||||
records = json.loads(self.seed_path.read_text(encoding="utf-8"))
|
||||
except (OSError, json.JSONDecodeError) as exc:
|
||||
@@ -46,13 +59,21 @@ class ServerBindingService:
|
||||
if not isinstance(records, list):
|
||||
raise RuntimeError("区服别名种子数据必须是数组")
|
||||
|
||||
normalized_records: list[tuple[str, str]] = []
|
||||
seen_servers: set[str] = set()
|
||||
for record in records:
|
||||
if not isinstance(record, dict):
|
||||
continue
|
||||
server = self._clean(record.get("server"))
|
||||
raw_aliases = record.get("aliases") or []
|
||||
if not server or not isinstance(raw_aliases, list):
|
||||
server_key = self._key(server)
|
||||
if (
|
||||
not server
|
||||
or not isinstance(raw_aliases, list)
|
||||
or server_key in seen_servers
|
||||
):
|
||||
continue
|
||||
seen_servers.add(server_key)
|
||||
aliases = []
|
||||
seen: set[str] = set()
|
||||
for value in raw_aliases:
|
||||
@@ -61,20 +82,35 @@ class ServerBindingService:
|
||||
if alias and key != self._key(server) and key not in seen:
|
||||
seen.add(key)
|
||||
aliases.append(alias)
|
||||
await self.sql.execute(
|
||||
"""
|
||||
INSERT OR IGNORE INTO server_aliases (server, aliases)
|
||||
VALUES (?, ?)
|
||||
""",
|
||||
(server, json.dumps(aliases, ensure_ascii=False)),
|
||||
normalized_records.append(
|
||||
(server, json.dumps(aliases, ensure_ascii=False))
|
||||
)
|
||||
return normalized_records
|
||||
|
||||
async def restore_default_aliases(self) -> int:
|
||||
"""使用随插件分发的 JSON 种子完整重写区服别名表。"""
|
||||
records = self._load_seed_aliases()
|
||||
statements: list[tuple[str, tuple[Any, ...]]] = [
|
||||
("DELETE FROM server_aliases", ()),
|
||||
]
|
||||
statements.extend(
|
||||
(
|
||||
"INSERT INTO server_aliases (server, aliases) VALUES (?, ?)",
|
||||
(server, aliases_json),
|
||||
)
|
||||
for server, aliases_json in records
|
||||
)
|
||||
await self.sql.execute_transaction(statements)
|
||||
await self._reload_cache()
|
||||
return len(records)
|
||||
|
||||
async def _reload_cache(self):
|
||||
bindings = await self.list_bindings()
|
||||
alias_rows = await self.list_aliases()
|
||||
known = set(self._remote_servers)
|
||||
standard = set(self._remote_servers)
|
||||
standard.update(row["server"] for row in alias_rows)
|
||||
known = set(standard)
|
||||
known.update(row["server"] for row in bindings)
|
||||
known.update(row["server"] for row in alias_rows)
|
||||
|
||||
lookup = {self._key(server): server for server in known}
|
||||
for row in alias_rows:
|
||||
@@ -84,7 +120,11 @@ class ServerBindingService:
|
||||
# 新增的官方区服名优先于历史别名,避免目录更新后误解析。
|
||||
lookup.setdefault(self._key(alias), server)
|
||||
|
||||
self._standard_servers = standard
|
||||
self._known_servers = known
|
||||
self._standard_lookup = {
|
||||
self._key(server): server for server in standard
|
||||
}
|
||||
self._server_lookup = lookup
|
||||
|
||||
async def update_server_catalog(self, servers: Iterable[str]):
|
||||
@@ -98,6 +138,12 @@ class ServerBindingService:
|
||||
def known_servers(self) -> list[str]:
|
||||
return sorted(self._known_servers)
|
||||
|
||||
def standard_servers(self) -> list[str]:
|
||||
return sorted(self._standard_servers)
|
||||
|
||||
def resolve_standard_server(self, value: Any) -> str:
|
||||
return self._standard_lookup.get(self._key(value), "")
|
||||
|
||||
def is_known_server(self, value: Any) -> bool:
|
||||
return self._key(value) in self._server_lookup
|
||||
|
||||
|
||||
Reference in New Issue
Block a user