This commit is contained in:
FURRO404
2026-06-18 03:14:47 -07:00
parent a86d762fe2
commit 8e53646275
+50 -2
View File
@@ -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) => (
<div className={`whitespace-pre-wrap ${battleLineColor(line)}`} key={i}>{line}</div>
<FormattedChatLine key={i} line={line} players={playersByName} />
))
)}
</div>
@@ -3087,11 +3117,29 @@ function GamePage({ gameId, navigate }) {
)
}
function FormattedChatLine({ line, players }) {
const parsed = parseFormattedChatLine(line)
if (!parsed) {
return <div className={`whitespace-pre-wrap ${battleLineColor(line)}`}>{line}</div>
}
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 (
<div className={`whitespace-pre-wrap ${className}`}>
{parsed.head}[{team}] `{name}`: {parsed.message}
</div>
)
}
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 (