Files
electric-cherry/src/lib/server/fleet/status-updates.ts
T
2026-10-09 19:41:55 -04:00

33 lines
1.3 KiB
TypeScript

import type { RconStatusResult } from '../integrations/rcon.js';
import type { ServerObservation } from '../../server-observation.js';
import type { ServerRow } from './servers.js';
/** Monitoring and provisioning publish the same complete RCON observation. */
export function successfulStatusFields(
result: Extract<RconStatusResult, { ok: true }>,
observedAt: string
): Partial<ServerRow> {
return {
last_checked_at: observedAt,
last_seen_at: observedAt,
last_players: result.status.players,
last_map: result.status.map,
last_gametype: result.status.gametype,
last_roster: JSON.stringify(result.status.roster),
last_reply_snippet: null,
last_error: null,
rcon_failures: 0
};
}
/** Occupancy follows the UI's source; only gameplay evidence changes match timing. */
export function activityFields(current: ServerRow, status: ServerObservation): Partial<ServerRow> {
if (status.health !== 'online' || status.last_players === null) return {};
return status.last_players > 0
? { active_since: current.active_since ?? status.last_seen_at, inactive_since: null }
: {
active_since: null,
inactive_since: current.inactive_since ?? status.last_seen_at
};
}