Clarify server actions and group maintenance failures

This commit is contained in:
2026-10-07 19:21:53 -04:00
parent bcecc42dd1
commit c39563daef
15 changed files with 559 additions and 111 deletions
+28
View File
@@ -0,0 +1,28 @@
import type { FleetServer } from '../fleet-overview.js';
import { actionLabels, type RuntimeAction } from '../provisioning.js';
import { freshStatusTimestamp } from '../server-freshness.js';
import { serverHealth } from './server-health.js';
/** UI affordances only: the queue still checks ownership, conflicts and occupancy. */
export function applicableRuntimeActions(server: FleetServer, now: number): RuntimeAction[] {
const health = serverHealth(server, now).state;
if (health === 'stopped') return ['start', 'rebuild'];
const currentRunningContainer = server.container_state === 'running'
&& freshStatusTimestamp(server.container_checked_at ?? null, now)
&& (!server.telemetry_after || Date.parse(server.container_checked_at!) > Date.parse(server.telemetry_after));
if (health === 'online' || health === 'not-responding' && currentRunningContainer) return ['restart', 'stop', 'rebuild'];
return [];
}
/** Counts must come from fresh observations; null must never read as an empty lobby. */
export function lifecycleImpact(action: RuntimeAction | 'destroy', players: number | null, round: number | null): string {
if (action === 'start') return 'Start the existing container, then verify that the game is responding.';
const label = action === 'destroy' ? 'Removal' : actionLabels[action];
if (players === null || !Number.isSafeInteger(players) || players < 0) {
return `Player count is unknown. ${label} waits for a live check confirming the lobby is empty.`;
}
if (players === 0) return `The lobby is currently empty. A live check will confirm this before ${label.toLowerCase()} begins.`;
const subject = `${players.toLocaleString('en-US')} ${players === 1 ? 'player is' : 'players are'}`;
const activity = round !== null && Number.isSafeInteger(round) && round >= 0 ? `in round ${round.toLocaleString('en-US')}` : 'currently online';
return `${subject} ${activity}. ${label} waits until the lobby is empty.`;
}