#!/usr/bin/env python3 """Compare a read-only 40250 database name export with the older Chinese tables.""" import argparse import json from pathlib import Path REPO = Path(__file__).resolve().parents[1] DEFAULT_EXPORT = REPO / "build/zh-locale/server-audit" DEFAULT_TABLES = REPO.parent / "server_extracted/40250_deploy" def live_names(path: Path): names = {} for number, line in enumerate(path.read_text(encoding="ascii").splitlines(), 1): try: vnum, encoded = line.split("\t", 1) name = bytes.fromhex(encoded).decode("gbk") if int(vnum) in names: raise ValueError("duplicate VNUM") names[int(vnum)] = name except (ValueError, UnicodeDecodeError) as error: raise ValueError(f"{path}:{number}: {error}") from error return names def older_names(path: Path): names = {} for line in path.read_text(encoding="utf-8").splitlines()[1:]: vnum, name = line.split("\t", 1) names[int(vnum)] = name return names def audit(export_dir: Path, tables_dir: Path): result = {} for kind in ("item", "mob"): live = live_names(export_dir / f"{kind}_names_hex.tsv") older = older_names(tables_dir / f"{kind}_names_zh.txt") shared = live.keys() & older.keys() conflicts = [ {"vnum": vnum, "server": live[vnum], "older_table": older[vnum]} for vnum in sorted(shared) if live[vnum] != older[vnum] ] result[kind] = { "server_rows": len(live), "older_table_rows": len(older), "shared_vnums": len(shared), "server_only_vnums": len(live.keys() - older.keys()), "older_only_vnums": len(older.keys() - live.keys()), "server_names_without_hanzi": sum( not any("\u4e00" <= char <= "\u9fff" for char in name) for name in live.values() ), "conflicts": conflicts, } return result def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--export-dir", type=Path, default=DEFAULT_EXPORT) parser.add_argument("--tables-dir", type=Path, default=DEFAULT_TABLES) parser.add_argument("--output", type=Path, default=DEFAULT_EXPORT / "name-audit.json") args = parser.parse_args() report = audit(args.export_dir, args.tables_dir) args.output.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") for kind, data in report.items(): print(f"{kind}: rows={data['server_rows']} no_hanzi={data['server_names_without_hanzi']} " f"conflicts={len(data['conflicts'])}") if __name__ == "__main__": main()