From 8e53646275ed28d40a1112692199745dae4c7f9c Mon Sep 17 00:00:00 2001 From: FURRO404 Date: Thu, 18 Jun 2026 03:14:47 -0700 Subject: [PATCH] meow --- frontend/src/App.jsx | 52 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7cd36c6..da2bdac 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -2834,6 +2834,24 @@ function logLookups(participants) { return players } +function logNameLookups(participants) { + const players = new Map() + ;(participants || []).forEach((participant) => { + const result = String(participant.result || '').toLowerCase() === 'win' ? 'win' : 'loss' + ;(participant.players || []).forEach((player) => { + const name = String(player.nick || '').trim() + if (!name) return + players.set(name.toLowerCase(), { + name, + team: participant.team_name || '', + result, + className: result === 'win' ? 'text-win' : 'text-loss', + }) + }) + }) + return players +} + function logPlayer(players, uid) { return players.get(String(uid)) || { name: uid === undefined || uid === null ? 'Unknown' : `Player#${uid}`, @@ -2858,6 +2876,17 @@ function structuredBattleEvents(eventLog) { ].sort((a, b) => Number(a.time || 0) - Number(b.time || 0)) } +function parseFormattedChatLine(line) { + const match = String(line || '').match(/^([+-]?)(\[\d{2}:\d{2}\]\s+\[[^\]]+\]\s+)\[[^\]]*\]\s+`([^`]*)`:\s?(.*)$/) + if (!match) return null + return { + prefix: match[1], + head: match[2], + name: match[3], + message: match[4], + } +} + function GamePage({ gameId, navigate }) { const [gameState, setGameState] = useState({ status: 'loading', data: null, error: null }) const [logs, setLogs] = useState({ chat_log: [], battle_log: [], event_log: { kills: [], damage: [], chat: [] } }) @@ -2902,6 +2931,7 @@ function GamePage({ gameId, navigate }) { const participants = useMemo(() => gameState.data?.participants || [], [gameState.data?.participants]) const deadVehicleKeys = useMemo(() => deadVehicleKeysFromEventLog(logs.event_log), [logs.event_log]) const playersByUid = useMemo(() => logLookups(participants), [participants]) + const playersByName = useMemo(() => logNameLookups(participants), [participants]) const battleEvents = useMemo(() => structuredBattleEvents(logs.event_log), [logs.event_log]) const chatEvents = Array.isArray(logs.event_log?.chat) ? logs.event_log.chat : [] const participantNames = participants.length @@ -3077,7 +3107,7 @@ function GamePage({ gameId, navigate }) { )) ) : ( logs.chat_log.map((line, i) => ( -
{line}
+ )) )} @@ -3087,11 +3117,29 @@ function GamePage({ gameId, navigate }) { ) } +function FormattedChatLine({ line, players }) { + const parsed = parseFormattedChatLine(line) + if (!parsed) { + return
{line}
+ } + + const player = players.get(parsed.name.toLowerCase()) + const className = player?.className || battleLineColor(parsed.prefix) + const team = player?.team || '??' + const name = player?.name || parsed.name + + return ( +
+ {parsed.head}[{team}] `{name}`: {parsed.message} +
+ ) +} + function BattleEventLine({ event, players }) { const offender = logPlayer(players, event.offender_uid) const victim = logPlayer(players, event.offended_uid) const ts = formatLogTime(event.time) - const victimLabel = `${victim.name} (${logVehicle(victim, event.offended_unit)})` + const victimLabel = `[${victim.team}] ${victim.name} (${logVehicle(victim, event.offended_unit)})` if (event.kind === 'kill' && (event.crashed || event.offender_uid === undefined || event.offender_uid === null)) { return (