fix some scoreboard shit (#1364)
This commit is contained in:
+46
-2
@@ -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
@@ -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"),
|
||||||
|
|||||||
@@ -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")
|
||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user