Add active/inactive/game-time timers to fleet + server pages
Fleet cards and the per-server detail hero now show three live-ticking timers: Active (since players > 0), Inactive (since server emptied), and Game (since InitGame in games_sp.log, back-computed from the log's own MM:SS prefix so it stays accurate across restarts). Anchors are persisted on `servers` and fanned out via the SSE bus; a single 1s ticker feeds every card. Idle map cycles are filtered out so the game timer doesn't flicker.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { writable } from 'svelte/store';
|
||||
import { writable, readonly } from 'svelte/store';
|
||||
import { browser } from '$app/environment';
|
||||
|
||||
export interface RosterPlayer {
|
||||
@@ -29,10 +29,21 @@ export interface ServerStatus {
|
||||
endpoint: RconEndpoint | null;
|
||||
reason: RconFailure | null;
|
||||
replySnippet: string | null;
|
||||
activeSince: string | null;
|
||||
inactiveSince: string | null;
|
||||
gameStartedAt: string | null;
|
||||
gameEndedAt: string | null;
|
||||
}
|
||||
|
||||
export const statusByServer = writable<Map<string, ServerStatus>>(new Map());
|
||||
|
||||
// Shared 1s ticker for elapsed-time displays. One interval feeds every card
|
||||
// on the page instead of N per-card timers. Timer starts on the first
|
||||
// startServerStream() call in the browser.
|
||||
const _uiNow = writable(Date.now());
|
||||
export const uiNow = readonly(_uiNow);
|
||||
let tickInterval: ReturnType<typeof setInterval> | null = null;
|
||||
|
||||
let source: EventSource | null = null;
|
||||
|
||||
export function startServerStream(): void {
|
||||
@@ -46,4 +57,7 @@ export function startServerStream(): void {
|
||||
return m;
|
||||
});
|
||||
});
|
||||
if (tickInterval === null) {
|
||||
tickInterval = setInterval(() => _uiNow.set(Date.now()), 1000);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user