meow
This commit is contained in:
+50
-2
@@ -2834,6 +2834,24 @@ function logLookups(participants) {
|
|||||||
return players
|
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) {
|
function logPlayer(players, uid) {
|
||||||
return players.get(String(uid)) || {
|
return players.get(String(uid)) || {
|
||||||
name: uid === undefined || uid === null ? 'Unknown' : `Player#${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))
|
].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 }) {
|
function GamePage({ gameId, navigate }) {
|
||||||
const [gameState, setGameState] = useState({ status: 'loading', data: null, error: null })
|
const [gameState, setGameState] = useState({ status: 'loading', data: null, error: null })
|
||||||
const [logs, setLogs] = useState({ chat_log: [], battle_log: [], event_log: { kills: [], damage: [], chat: [] } })
|
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 participants = useMemo(() => gameState.data?.participants || [], [gameState.data?.participants])
|
||||||
const deadVehicleKeys = useMemo(() => deadVehicleKeysFromEventLog(logs.event_log), [logs.event_log])
|
const deadVehicleKeys = useMemo(() => deadVehicleKeysFromEventLog(logs.event_log), [logs.event_log])
|
||||||
const playersByUid = useMemo(() => logLookups(participants), [participants])
|
const playersByUid = useMemo(() => logLookups(participants), [participants])
|
||||||
|
const playersByName = useMemo(() => logNameLookups(participants), [participants])
|
||||||
const battleEvents = useMemo(() => structuredBattleEvents(logs.event_log), [logs.event_log])
|
const battleEvents = useMemo(() => structuredBattleEvents(logs.event_log), [logs.event_log])
|
||||||
const chatEvents = Array.isArray(logs.event_log?.chat) ? logs.event_log.chat : []
|
const chatEvents = Array.isArray(logs.event_log?.chat) ? logs.event_log.chat : []
|
||||||
const participantNames = participants.length
|
const participantNames = participants.length
|
||||||
@@ -3077,7 +3107,7 @@ function GamePage({ gameId, navigate }) {
|
|||||||
))
|
))
|
||||||
) : (
|
) : (
|
||||||
logs.chat_log.map((line, i) => (
|
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>
|
</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 }) {
|
function BattleEventLine({ event, players }) {
|
||||||
const offender = logPlayer(players, event.offender_uid)
|
const offender = logPlayer(players, event.offender_uid)
|
||||||
const victim = logPlayer(players, event.offended_uid)
|
const victim = logPlayer(players, event.offended_uid)
|
||||||
const ts = formatLogTime(event.time)
|
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)) {
|
if (event.kind === 'kill' && (event.crashed || event.offender_uid === undefined || event.offender_uid === null)) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user