fix some scoreboard shit (#1364)

This commit is contained in:
NotSoToothless
2026-06-30 07:22:13 -07:00
committed by GitHub
parent c417226e9e
commit cfd2458ab3
4 changed files with 81 additions and 3 deletions
+46 -2
View File
@@ -23,8 +23,48 @@ from typing import Any, Dict, List, Optional
import aiosqlite import aiosqlite
from spectra_replay_normalize import strip_model_prefix
log = logging.getLogger("tssbot.storage") 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 # Paths
@@ -377,14 +417,18 @@ async def insert_player_games(game: Dict[str, Any]) -> None:
continue continue
for unit in used_units: for unit in used_units:
vehicle_fields = _unit_vehicle_fields(unit)
if vehicle_fields is None:
continue
vehicle, internal = vehicle_fields
rows.append(( rows.append((
str(uid_str), str(uid_str),
str(p.get("name") or ""), str(p.get("name") or ""),
str(tss_team.get("team_name") or tss_team.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") str(p.get("team") or ""), # team_slot ("1" or "2")
session_id, session_id,
str(unit.get("unit_normalized") or ""), vehicle,
str(unit.get("unit") or ""), internal,
int(p.get("ground_kills") or 0), int(p.get("ground_kills") or 0),
int(p.get("air_kills") or 0), int(p.get("air_kills") or 0),
int(p.get("assists") or 0), int(p.get("assists") or 0),
+1 -1
View File
@@ -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 is_dead = bool(flag) if flag is not None else internal.lower() in dead_lc
out.append({ out.append({
"internal": internal, "internal": internal,
"name": translate(internal) or u.get("unit_normalized") or internal, "name": translate(internal) or internal,
"used": bool(u.get("used")), "used": bool(u.get("used")),
"dead": is_dead, "dead": is_dead,
"unit_type": u.get("unit_type"), "unit_type": u.get("unit_type"),
+21
View File
@@ -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")
+13
View File
@@ -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]["dead"] is True
assert bob["units"][0]["unit_type"] == "tank" assert bob["units"][0]["unit_type"] == "tank"
assert bob["units"][0]["unit_class"] == "medium 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, "<English>")
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"