From f896913b51eb53f885fe58ea261e34b05ca84f56 Mon Sep 17 00:00:00 2001 From: HsiangNianian Date: Wed, 14 Jan 2026 11:12:54 +0800 Subject: feat: enhance logging in game launch process and update GameConsole to display launcher logs --- ui/src/lib/GameConsole.svelte | 62 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 10 deletions(-) (limited to 'ui/src/lib') diff --git a/ui/src/lib/GameConsole.svelte b/ui/src/lib/GameConsole.svelte index d6913a5..281dc85 100644 --- a/ui/src/lib/GameConsole.svelte +++ b/ui/src/lib/GameConsole.svelte @@ -4,30 +4,51 @@ export let visible = false; - let logs: { type: 'stdout' | 'stderr', line: string }[] = []; + let logs: { type: 'stdout' | 'stderr' | 'launcher', line: string, timestamp: string }[] = []; let consoleElement: HTMLDivElement; let unlistenStdout: () => void; let unlistenStderr: () => void; + let unlistenLauncher: () => void; + let unlistenGameExited: () => void; + + function getTimestamp(): string { + const now = new Date(); + return now.toTimeString().split(' ')[0]; // HH:MM:SS + } onMount(async () => { + // Listen for launcher logs (preparation, downloads, launch status) + unlistenLauncher = await listen("launcher-log", (event) => { + addLog('launcher', event.payload); + }); + + // Listen for game stdout unlistenStdout = await listen("game-stdout", (event) => { addLog('stdout', event.payload); }); + // Listen for game stderr unlistenStderr = await listen("game-stderr", (event) => { addLog('stderr', event.payload); }); + + // Listen for game exit event + unlistenGameExited = await listen("game-exited", (event) => { + addLog('launcher', `Game process exited with code: ${event.payload}`); + }); }); onDestroy(() => { + if (unlistenLauncher) unlistenLauncher(); if (unlistenStdout) unlistenStdout(); if (unlistenStderr) unlistenStderr(); + if (unlistenGameExited) unlistenGameExited(); }); - function addLog(type: 'stdout' | 'stderr', line: string) { - logs = [...logs, { type, line }]; - if (logs.length > 1000) { - logs = logs.slice(logs.length - 1000); + function addLog(type: 'stdout' | 'stderr' | 'launcher', line: string) { + logs = [...logs, { type, line, timestamp: getTimestamp() }]; + if (logs.length > 2000) { + logs = logs.slice(logs.length - 2000); } // Auto-scroll setTimeout(() => { @@ -40,25 +61,46 @@ function clearLogs() { logs = []; } + + function exportLogs() { + const logText = logs.map(l => `[${l.timestamp}] [${l.type.toUpperCase()}] ${l.line}`).join('\n'); + const blob = new Blob([logText], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `dropout-logs-${new Date().toISOString().split('T')[0]}.txt`; + a.click(); + URL.revokeObjectURL(url); + } {#if visible}
- Game Console +
+ Logs +
+ LAUNCHER + GAME + ERROR +
+
+
-
+
{#each logs as log} -
- {log.line} +
+ {log.timestamp} + [{log.type === 'launcher' ? 'LAUNCHER' : log.type === 'stderr' ? 'ERROR' : 'GAME'}] + {log.line}
{/each} {#if logs.length === 0} -
Waiting for game output...
+
Waiting for output... Click "Show Logs" and start a game to see logs here.
{/if}
-- cgit v1.2.3-70-g09d2