last changes (#1334)

This commit is contained in:
NotSoToothless
2026-06-18 04:04:12 -07:00
committed by GitHub
parent d490c1c8d5
commit f4cb72cb78
2 changed files with 35 additions and 26 deletions
+30 -23
View File
@@ -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.""" """Return the raw event slices the website needs for per-unit state."""
events = _decompress_events(game.get("events", {})) events = _decompress_events(game.get("events", {}))
if not isinstance(events, dict): if not isinstance(events, dict):
return {"kills": [], "damage": []} return {"kills": [], "damage": [], "chat": list(game.get("chat") or [])}
return { return {
"kills": list(events.get("kills") or []), "kills": list(events.get("kills") or []),
"damage": list(events.get("damage") 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]]: def build_match_logs(game: dict[str, Any]) -> tuple[list[str], list[str]]:
"""Return (chat_log, battle_log) as pre-formatted string lists.""" """Return (chat_log, battle_log) as pre-formatted string lists."""
players = game.get("players", {}) or {} players = game.get("players", {}) or {}
winner_winged = str(game.get("winner") or "") tss = game.get("tss") or {}
loser_winged = str(game.get("loser") or "") winner_slot = str(game.get("winner") or "")
winner_sq = _strip_tag(winner_winged) loser_slot = str(game.get("loser") or "")
loser_sq = _strip_tag(loser_winged)
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]] = {} uid_lookup: dict[str, dict[str, str]] = {}
for uid_str, p in players.items(): for uid_str, p in players.items():
tag = p.get("tag", "") or "" slot = str(p.get("team") or "")
uid_lookup[str(uid_str)] = { uid_lookup[str(uid_str)] = {
"name": p.get("name", "") or "", "name": p.get("name", "") or "",
"tag_stripped": tag[1:-1] if tag else "", "team_slot": slot,
"team_name": _team_name(slot),
} }
translate = None 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 apply_vehicle_name_filters(t)
return cdk return cdk
def _player(uid: str | None) -> tuple[str, str]: def _player(uid: str | None) -> tuple[str, str, str]:
if uid is None: if uid is None:
return "Unknown", "" return "Unknown", "", ""
info = uid_lookup.get(str(uid)) info = uid_lookup.get(str(uid))
if info: if info:
return info["name"], info["tag_stripped"] return info["name"], info["team_name"], info["team_slot"]
return f"Player#{uid}", "" return f"Player#{uid}", "", ""
def _prefix(sq: str) -> str: def _prefix(slot: str) -> str:
if sq == winner_sq: if slot == winner_slot:
return "+" return "+"
if sq == loser_sq: if slot == loser_slot:
return "-" return "-"
return " " return " "
chat_log: list[str] = [] chat_log: list[str] = []
for c in game.get("chat", []) or []: for c in game.get("chat", []) or []:
info = uid_lookup.get( 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( chat_log.append(
f"[{_fmt_time(c.get('time', 0))}] [{c.get('type', 'ALL')}] " f"{_prefix(info['team_slot'])}[{_fmt_time(c.get('time', 0))}] [{c.get('type', 'ALL')}] "
f"[{info['tag_stripped']}] `{info['name']}`: {c.get('message', '')}" f"[{info['team_name']}] `{info['name']}`: {c.get('message', '')}"
) )
events = _decompress_events(game.get("events", {})) 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] = [] battle_log: list[str] = []
for ev in merged: for ev in merged:
ts = _fmt_time(ev["time"]) 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"]) vic_veh = _veh(ev["vic_unit"])
if ev["kind"] == "kill": if ev["kind"] == "kill":
if ev["off_uid"] is None or ev["crashed"]: if ev["off_uid"] is None or ev["crashed"]:
battle_log.append( 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" f"{vic_name} ({vic_veh}) crashed"
) )
else: else:
name, sq = _player(ev["off_uid"]) name, team, slot = _player(ev["off_uid"])
battle_log.append( 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})" f"destroyed {vic_name} ({vic_veh})"
) )
else: else:
if ev["off_uid"] is None: if ev["off_uid"] is None:
continue continue
name, sq = _player(ev["off_uid"]) name, team, slot = _player(ev["off_uid"])
afire = "(FIRE) " if ev["afire"] else "" afire = "(FIRE) " if ev["afire"] else ""
battle_log.append( 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})" f"damaged {afire}{vic_name} ({vic_veh})"
) )
+5 -3
View File
@@ -10,7 +10,8 @@ from BOT.match_logs import build_event_log, build_match_logs
def _game(): def _game():
return { return {
"_id": "abc", "_id": "abc",
"winner": "[WIN]", "loser": "[LOS]", "winner": "1", "loser": "2",
"tss": {"1": {"name": "TeamWin"}, "2": {"name": "TeamLose"}},
"players": { "players": {
"1": {"name": "alice", "tag": "[WIN]", "team": "1", "1": {"name": "alice", "tag": "[WIN]", "team": "1",
"units": [{"unit": "ussr_t_34", "used": True}], "units": [{"unit": "ussr_t_34", "used": True}],
@@ -31,14 +32,14 @@ def _game():
def test_chat_log_format(): def test_chat_log_format():
chat, _ = build_match_logs(_game()) 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(): def test_battle_log_kill_prefix_and_text():
_, battle = build_match_logs(_game()) _, battle = build_match_logs(_game())
assert len(battle) == 1 assert len(battle) == 1
line = battle[0] 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 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()) event_log = build_event_log(_game())
assert event_log["kills"][0]["offended_uid"] == 2 assert event_log["kills"][0]["offended_uid"] == 2
assert event_log["kills"][0]["offended_unit"] == "germ_pz_iv" assert event_log["kills"][0]["offended_unit"] == "germ_pz_iv"
assert event_log["chat"][0]["message"] == "gg"
if __name__ == "__main__": if __name__ == "__main__":