diff --git a/BOT/match_logs.py b/BOT/match_logs.py index 9e59720..56331dd 100644 --- a/BOT/match_logs.py +++ b/BOT/match_logs.py @@ -53,10 +53,11 @@ def build_event_log(game: dict[str, Any]) -> dict[str, Any]: """Return the raw event slices the website needs for per-unit state.""" events = _decompress_events(game.get("events", {})) if not isinstance(events, dict): - return {"kills": [], "damage": []} + return {"kills": [], "damage": [], "chat": list(game.get("chat") or [])} return { "kills": list(events.get("kills") or []), "damage": list(events.get("damage") or []), + "chat": list(game.get("chat") or []), } @@ -70,17 +71,23 @@ def _strip_tag(tag: str) -> str: def build_match_logs(game: dict[str, Any]) -> tuple[list[str], list[str]]: """Return (chat_log, battle_log) as pre-formatted string lists.""" players = game.get("players", {}) or {} - winner_winged = str(game.get("winner") or "") - loser_winged = str(game.get("loser") or "") - winner_sq = _strip_tag(winner_winged) - loser_sq = _strip_tag(loser_winged) + tss = game.get("tss") or {} + winner_slot = str(game.get("winner") or "") + loser_slot = str(game.get("loser") or "") + + def _team_name(slot: str) -> str: + raw = tss.get(slot) + if isinstance(raw, dict) and raw.get("name"): + return str(raw["name"]) + return f"Team {slot}" if slot else "" uid_lookup: dict[str, dict[str, str]] = {} for uid_str, p in players.items(): - tag = p.get("tag", "") or "" + slot = str(p.get("team") or "") uid_lookup[str(uid_str)] = { "name": p.get("name", "") or "", - "tag_stripped": tag[1:-1] if tag else "", + "team_slot": slot, + "team_name": _team_name(slot), } translate = None @@ -99,29 +106,29 @@ def build_match_logs(game: dict[str, Any]) -> tuple[list[str], list[str]]: return apply_vehicle_name_filters(t) return cdk - def _player(uid: str | None) -> tuple[str, str]: + def _player(uid: str | None) -> tuple[str, str, str]: if uid is None: - return "Unknown", "" + return "Unknown", "", "" info = uid_lookup.get(str(uid)) if info: - return info["name"], info["tag_stripped"] - return f"Player#{uid}", "" + return info["name"], info["team_name"], info["team_slot"] + return f"Player#{uid}", "", "" - def _prefix(sq: str) -> str: - if sq == winner_sq: + def _prefix(slot: str) -> str: + if slot == winner_slot: return "+" - if sq == loser_sq: + if slot == loser_slot: return "-" return " " chat_log: list[str] = [] for c in game.get("chat", []) or []: info = uid_lookup.get( - str(c.get("uid", "")), {"name": "Unknown", "tag_stripped": "???"} + str(c.get("uid", "")), {"name": "Unknown", "team_name": "??", "team_slot": ""} ) chat_log.append( - f"[{_fmt_time(c.get('time', 0))}] [{c.get('type', 'ALL')}] " - f"[{info['tag_stripped']}] `{info['name']}`: {c.get('message', '')}" + f"{_prefix(info['team_slot'])}[{_fmt_time(c.get('time', 0))}] [{c.get('type', 'ALL')}] " + f"[{info['team_name']}] `{info['name']}`: {c.get('message', '')}" ) events = _decompress_events(game.get("events", {})) @@ -149,27 +156,27 @@ def build_match_logs(game: dict[str, Any]) -> tuple[list[str], list[str]]: battle_log: list[str] = [] for ev in merged: ts = _fmt_time(ev["time"]) - vic_name, vic_sq = _player(ev["vic_uid"]) + vic_name, vic_team, vic_slot = _player(ev["vic_uid"]) vic_veh = _veh(ev["vic_unit"]) if ev["kind"] == "kill": if ev["off_uid"] is None or ev["crashed"]: battle_log.append( - f"{_prefix(vic_sq)}[{ts}] {f'[{vic_sq}]':<7} " + f"{_prefix(vic_slot)}[{ts}] {f'[{vic_team}]':<14} " f"{vic_name} ({vic_veh}) crashed" ) else: - name, sq = _player(ev["off_uid"]) + name, team, slot = _player(ev["off_uid"]) battle_log.append( - f"{_prefix(sq)}[{ts}] {f'[{sq}]':<7} {name} ({_veh(ev['off_unit'])}) " + f"{_prefix(slot)}[{ts}] {f'[{team}]':<14} {name} ({_veh(ev['off_unit'])}) " f"destroyed {vic_name} ({vic_veh})" ) else: if ev["off_uid"] is None: continue - name, sq = _player(ev["off_uid"]) + name, team, slot = _player(ev["off_uid"]) afire = "(FIRE) " if ev["afire"] else "" battle_log.append( - f"{_prefix(sq)}[{ts}] {f'[{sq}]':<7} {name} ({_veh(ev['off_unit'])}) " + f"{_prefix(slot)}[{ts}] {f'[{team}]':<14} {name} ({_veh(ev['off_unit'])}) " f"damaged {afire}{vic_name} ({vic_veh})" ) diff --git a/tests/test_match_logs.py b/tests/test_match_logs.py index 95ce7c8..85aea0d 100644 --- a/tests/test_match_logs.py +++ b/tests/test_match_logs.py @@ -10,7 +10,8 @@ from BOT.match_logs import build_event_log, build_match_logs def _game(): return { "_id": "abc", - "winner": "[WIN]", "loser": "[LOS]", + "winner": "1", "loser": "2", + "tss": {"1": {"name": "TeamWin"}, "2": {"name": "TeamLose"}}, "players": { "1": {"name": "alice", "tag": "[WIN]", "team": "1", "units": [{"unit": "ussr_t_34", "used": True}], @@ -31,14 +32,14 @@ def _game(): def test_chat_log_format(): chat, _ = build_match_logs(_game()) - assert chat == ["[01:05] [ALL] [WIN] `alice`: gg"] + assert chat == ["+[01:05] [ALL] [TeamWin] `alice`: gg"] def test_battle_log_kill_prefix_and_text(): _, battle = build_match_logs(_game()) assert len(battle) == 1 line = battle[0] - assert line.startswith("+[01:00] [WIN]") + assert line.startswith("+[01:00] [TeamWin]") assert "alice" in line and "destroyed" in line and "bob" in line @@ -57,6 +58,7 @@ def test_event_log_preserves_kill_victim_unit(): event_log = build_event_log(_game()) assert event_log["kills"][0]["offended_uid"] == 2 assert event_log["kills"][0]["offended_unit"] == "germ_pz_iv" + assert event_log["chat"][0]["message"] == "gg" if __name__ == "__main__":