Fix
This commit is contained in:
78
backend/app/rcon_scoreboard_relink.py
Normal file
78
backend/app/rcon_scoreboard_relink.py
Normal file
@@ -0,0 +1,78 @@
|
||||
"""Report safe scoreboard links for existing materialized RCON matches."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
from collections.abc import Iterable
|
||||
from pathlib import Path
|
||||
|
||||
from .rcon_admin_log_materialization import list_materialized_rcon_matches
|
||||
from .rcon_historical_read_model import build_materialized_scoreboard_correlation_input
|
||||
from .rcon_scoreboard_correlation import resolve_rcon_scoreboard_correlation
|
||||
|
||||
|
||||
DEFAULT_LIMIT = 500
|
||||
|
||||
|
||||
def relink_materialized_matches(
|
||||
*,
|
||||
server_key: str | None = None,
|
||||
limit: int = DEFAULT_LIMIT,
|
||||
db_path: Path | None = None,
|
||||
) -> dict[str, object]:
|
||||
"""Scan existing matches against trusted candidates used by the detail read model."""
|
||||
matches = list_materialized_rcon_matches(
|
||||
target_key=server_key,
|
||||
only_ended=True,
|
||||
limit=limit,
|
||||
db_path=db_path,
|
||||
)
|
||||
report: dict[str, object] = {
|
||||
"matches_scanned": len(matches),
|
||||
"candidates_scanned": 0,
|
||||
"matches_linked": 0,
|
||||
"matches_skipped_no_candidate": 0,
|
||||
"matches_skipped_ambiguous": 0,
|
||||
"errors": [],
|
||||
}
|
||||
for match in matches:
|
||||
try:
|
||||
resolution = resolve_rcon_scoreboard_correlation(
|
||||
**build_materialized_scoreboard_correlation_input(match),
|
||||
db_path=db_path,
|
||||
)
|
||||
except Exception as exc:
|
||||
report["errors"].append(
|
||||
{"match_key": match.get("match_key"), "message": str(exc)}
|
||||
)
|
||||
continue
|
||||
report["candidates_scanned"] += int(resolution.get("candidate_count") or 0)
|
||||
if resolution.get("match_url"):
|
||||
report["matches_linked"] += 1
|
||||
elif resolution.get("reason") == "ambiguous-candidate":
|
||||
report["matches_skipped_ambiguous"] += 1
|
||||
else:
|
||||
report["matches_skipped_no_candidate"] += 1
|
||||
return report
|
||||
|
||||
|
||||
def main(argv: Iterable[str] | None = None) -> int:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Resolve trusted scoreboard links for materialized RCON matches."
|
||||
)
|
||||
parser.add_argument("--server", dest="server_key")
|
||||
parser.add_argument("--limit", type=int, default=DEFAULT_LIMIT)
|
||||
parser.add_argument("--db-path", type=Path, default=None)
|
||||
args = parser.parse_args(list(argv) if argv is not None else None)
|
||||
report = relink_materialized_matches(
|
||||
server_key=args.server_key,
|
||||
limit=max(1, args.limit),
|
||||
db_path=args.db_path,
|
||||
)
|
||||
print(json.dumps(report, ensure_ascii=False, indent=2))
|
||||
return 0 if not report["errors"] else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user