Fix live server map name normalization

This commit is contained in:
devRaGonSa
2026-03-20 21:27:16 +01:00
parent aae99ac64e
commit abf0890029
5 changed files with 147 additions and 4 deletions

View File

@@ -9,6 +9,31 @@ if TYPE_CHECKING:
from .a2s_client import A2SServerInfo
MAP_NAME_ALIASES = {
"stmarie": "Sainte-Marie-du-Mont",
"sainte-mariedumont": "Sainte-Marie-du-Mont",
"sainte-marie-du-mont": "Sainte-Marie-du-Mont",
"stmereeglise": "Sainte-Mere-Eglise",
"sainte-mere-eglise": "Sainte-Mere-Eglise",
"purpleheartlane": "Purple Heart Lane",
"utahbeach": "Utah Beach",
"omahabeach": "Omaha Beach",
"hurtgenforest": "Hurtgen Forest",
"hill400": "Hill 400",
"foy": "Foy",
"kursk": "Kursk",
"kharkov": "Kharkov",
"kharkiv": "Kharkiv",
"stalingrad": "Stalingrad",
"remagen": "Remagen",
"driel": "Driel",
"elalamein": "El Alamein",
"mortain": "Mortain",
"carentan": "Carentan",
"devq": "Developer Test Map",
}
def normalize_server_record(
raw_record: Mapping[str, object],
*,
@@ -22,7 +47,7 @@ def normalize_server_record(
"status": _normalize_status(raw_record.get("status")),
"players": _coerce_int(raw_record.get("players")),
"max_players": _coerce_int(raw_record.get("max_players")),
"current_map": _string_or_none(raw_record.get("current_map")),
"current_map": normalize_map_name(raw_record.get("current_map")),
"region": _string_or_none(raw_record.get("region")),
"source_name": source_name,
"snapshot_origin": "controlled-fallback",
@@ -47,7 +72,7 @@ def normalize_a2s_server_info(
"status": "online",
"players": server_info.players,
"max_players": server_info.max_players,
"current_map": server_info.map_name,
"current_map": normalize_map_name(server_info.map_name),
"region": region,
"source_name": source_name,
"snapshot_origin": "real-a2s",
@@ -55,6 +80,16 @@ def normalize_a2s_server_info(
}
def normalize_map_name(value: object) -> str | None:
"""Normalize internal or abbreviated HLL map labels into a stable display name."""
normalized = _string_or_none(value)
if normalized is None:
return None
alias_key = "".join(character.lower() for character in normalized if character.isalnum())
return MAP_NAME_ALIASES.get(alias_key, normalized)
def _normalize_status(value: object) -> str:
if not isinstance(value, str):
return "unknown"

View File

@@ -6,6 +6,8 @@ from datetime import datetime, timezone
from .collector import collect_server_snapshots
from .config import get_refresh_interval_seconds
from .historical_storage import list_weekly_top_kills
from .normalizers import normalize_map_name
from .server_targets import load_a2s_targets
from .storage import list_latest_snapshots, list_server_history, list_snapshot_history
@@ -181,6 +183,28 @@ def build_error_payload(message: str) -> dict[str, str]:
}
def build_weekly_top_kills_payload(
*,
limit: int = 10,
server_id: str | None = None,
) -> dict[str, object]:
"""Return weekly top kills grouped by real community server."""
result = list_weekly_top_kills(limit=limit, server_id=server_id)
return {
"status": "ok",
"data": {
"title": "Top kills semanales por servidor",
"context": "historical-top-kills",
"metric": "kills",
"window_days": 7,
"window_start": result["window_start"],
"window_end": result["window_end"],
"limit": limit,
"items": result["items"],
},
}
def _enrich_server_items(items: list[dict[str, object]]) -> list[dict[str, object]]:
target_index = {
target.external_server_id: target
@@ -207,6 +231,7 @@ def _enrich_server_item(
target_index: dict[str, object],
) -> dict[str, object]:
enriched = dict(item)
enriched["current_map"] = normalize_map_name(enriched.get("current_map"))
external_server_id = enriched.get("external_server_id")
snapshot_origin = enriched.get("snapshot_origin")
target = target_index.get(external_server_id)