From cfd2458ab3701adb4ec17c91133eb2f4126e6269 Mon Sep 17 00:00:00 2001 From: NotSoToothless <67082114+FURRO404@users.noreply.github.com> Date: Tue, 30 Jun 2026 07:22:13 -0700 Subject: [PATCH] fix some scoreboard shit (#1364) --- BOT/storage.py | 48 +++++++++++++++++++++++++++-- BOT/transform.py | 2 +- tests/test_storage_vehicle_names.py | 21 +++++++++++++ tests/test_transform_model.py | 13 ++++++++ 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 tests/test_storage_vehicle_names.py diff --git a/BOT/storage.py b/BOT/storage.py index 6007043..86dc7b0 100644 --- a/BOT/storage.py +++ b/BOT/storage.py @@ -23,8 +23,48 @@ from typing import Any, Dict, List, Optional import aiosqlite +from spectra_replay_normalize import strip_model_prefix + log = logging.getLogger("tssbot.storage") +try: + from data_parser import LangTableReader, apply_vehicle_name_filters # type: ignore +except Exception: # pragma: no cover - only when SHARED is unavailable + LangTableReader = None # type: ignore + + def apply_vehicle_name_filters(name, strip_decorations=True): # type: ignore + return name + +_EN_VEHICLE_TRANSLATOR = None + + +def _vehicle_display_name(internal: str) -> str: + """Return parser-translated English vehicle name, falling back to internal ID.""" + if not internal: + return "" + if LangTableReader is None: + return internal + global _EN_VEHICLE_TRANSLATOR + if _EN_VEHICLE_TRANSLATOR is None: + try: + _EN_VEHICLE_TRANSLATOR = LangTableReader("English") + except Exception as exc: # pragma: no cover + log.warning("LangTableReader('English') failed: %s", exc) + return internal + try: + translated = _EN_VEHICLE_TRANSLATOR.get_translate(internal) + except Exception: + translated = None + return apply_vehicle_name_filters(translated) if translated else internal + + +def _unit_vehicle_fields(unit: dict[str, Any]) -> tuple[str, str] | None: + """Return (display_name, internal_id) for a Spectra unit without using unit_normalized.""" + internal = strip_model_prefix(unit.get("unit")) + if not internal: + return None + return _vehicle_display_name(internal), internal + # --------------------------------------------------------------------------- # Paths @@ -377,14 +417,18 @@ async def insert_player_games(game: Dict[str, Any]) -> None: continue for unit in used_units: + vehicle_fields = _unit_vehicle_fields(unit) + if vehicle_fields is None: + continue + vehicle, internal = vehicle_fields rows.append(( str(uid_str), str(p.get("name") or ""), str(tss_team.get("team_name") or tss_team.get("name") or ""), str(p.get("team") or ""), # team_slot ("1" or "2") session_id, - str(unit.get("unit_normalized") or ""), - str(unit.get("unit") or ""), + vehicle, + internal, int(p.get("ground_kills") or 0), int(p.get("air_kills") or 0), int(p.get("assists") or 0), diff --git a/BOT/transform.py b/BOT/transform.py index 42f2d39..ecea6da 100644 --- a/BOT/transform.py +++ b/BOT/transform.py @@ -70,7 +70,7 @@ def _build_units(units: list[dict[str, Any]], translate, dead: set[str] | None = is_dead = bool(flag) if flag is not None else internal.lower() in dead_lc out.append({ "internal": internal, - "name": translate(internal) or u.get("unit_normalized") or internal, + "name": translate(internal) or internal, "used": bool(u.get("used")), "dead": is_dead, "unit_type": u.get("unit_type"), diff --git a/tests/test_storage_vehicle_names.py b/tests/test_storage_vehicle_names.py new file mode 100644 index 0000000..ac4d811 --- /dev/null +++ b/tests/test_storage_vehicle_names.py @@ -0,0 +1,21 @@ +import importlib +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "SHARED")) + + +def test_unit_vehicle_fields_translates_vehicle_and_strips_model_prefix(tmp_path, monkeypatch): + monkeypatch.setenv("STORAGE_VOL_PATH", str(tmp_path)) + + import BOT.storage as storage + importlib.reload(storage) + + unit = { + "unit": "tankModels/germ_pzkpfw_V_ausf_d_panther", + "unit_normalized": "Bad Spectra Name", + "used": True, + } + + assert storage._unit_vehicle_fields(unit) == ("Panther D", "germ_pzkpfw_V_ausf_d_panther") diff --git a/tests/test_transform_model.py b/tests/test_transform_model.py index 87abdb7..c7cd9fb 100644 --- a/tests/test_transform_model.py +++ b/tests/test_transform_model.py @@ -55,3 +55,16 @@ def test_model_strips_unit_model_prefixes_for_dead_matching(): assert bob["units"][0]["dead"] is True assert bob["units"][0]["unit_type"] == "tank" assert bob["units"][0]["unit_class"] == "medium tank" + + +def test_model_ignores_spectra_unit_normalized_for_vehicle_name(): + game = _game() + game["players"]["1"]["units"][0]["unit"] = "germ_pzkpfw_V_ausf_d_panther" + game["players"]["1"]["units"][0]["unit_normalized"] = "Bad Spectra Name" + + model = build_scoreboard_model(game, "") + + assert model is not None + alice = model["teams"][0]["players"][0] + assert alice["units"][0]["internal"] == "germ_pzkpfw_V_ausf_d_panther" + assert alice["units"][0]["name"] == "Panther D"