meow
This commit is contained in:
+50
-2
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user