Replace server roster with live game scoreboard

This commit is contained in:
2026-09-18 16:14:08 -04:00
parent 5bb49a776e
commit 0f55fa5f77
4 changed files with 143 additions and 127 deletions
+7 -7
View File
@@ -11,10 +11,10 @@
import ListFooter from '$ui/components/primitives/ListFooter.svelte';
import { page } from '$app/stores';
import DestroyServerModal from '$ui/components/DestroyServerModal.svelte';
import { uiNow } from '$ui/stores/servers.js';
import { telemetryByServer, uiNow } from '$ui/stores/servers.js';
import type { RosterPlayer, Health, RconEndpoint, RconFailure } from '$ui/stores/servers.js';
import { elapsedSince } from '$ui/duration.js';
import PlayerRoster from '$ui/components/PlayerRoster.svelte';
import PlayerScoreboard from '$ui/components/PlayerScoreboard.svelte';
import LogPanel from '$ui/components/LogPanel.svelte';
import { gametypeLabel } from '$ui/gametype.js';
import { decodeRconError, rconFixHint } from '$ui/rconError.js';
@@ -99,7 +99,7 @@
let rconProbe = $state<RconProbeResult | null>(null);
let probingRcon = $state(false);
let destroyOpen = $state(false);
let activeTab = $state('roster');
let activeTab = $state('scoreboard');
let tabLoading = $state(false);
let tabError = $state('');
let historyLimit = $state(25);
@@ -131,7 +131,7 @@
let effectivePlayers = $derived(fresh ? server?.last_players ?? null : null);
let effectiveMap = $derived(server?.last_map ?? null);
let effectiveGametype = $derived(server?.last_gametype ?? null);
let effectiveRoster = $derived(server?.roster ?? null);
const scoreboard = $derived($telemetryByServer.get(name));
let effectiveHealth = $derived<Health>(server?.health === 'online' && !fresh ? 'stale' : server?.health ?? 'offline');
let effectiveSeen = $derived(server?.last_seen_at ?? null);
let effectiveErr = $derived(server?.last_error ?? null);
@@ -202,7 +202,7 @@
}
// Tab config — Diagnostics gets a warning badge when there's an issue.
let tabs = $derived([
{ id: 'roster', label: 'Roster', badge: effectiveRoster?.length ?? null },
{ id: 'scoreboard', label: 'Scoreboard', badge: scoreboard?.players.length ?? null },
{ id: 'logs', label: 'Logs' },
{ id: 'config', label: 'Config' },
{ id: 'inventory', label: 'Inventory', badge: inventory.length || null },
@@ -286,9 +286,9 @@
<div class="tab-panel" role="tabpanel" id="server-panel" aria-labelledby={"server-tabs-" + activeTab}>
{#if tabError}<div class="ui-error" role="alert">{tabError}<Button size="sm" onclick={() => loadTab(name, activeTab)}>Retry</Button></div>{/if}
{#if activeTab === 'roster'}
{#if activeTab === 'scoreboard'}
<Card padding="lg">
<PlayerRoster roster={effectiveRoster} health={effectiveHealth} />
{#key name}<PlayerScoreboard report={scoreboard} mapLabel={scoreboard ? fleetIdentity({ ...server, last_map: scoreboard.map }).map : undefined} />{/key}
</Card>
{:else if activeTab === 'logs'}
<Card padding="lg">