40 lines
1.6 KiB
TypeScript
40 lines
1.6 KiB
TypeScript
import type { RealtimeConnectionSnapshot } from '../features/operations/realtime-client.js';
|
|
|
|
interface ShellStatusInput {
|
|
stats?: { isRunning: boolean; dryRunMode: boolean; invitationCooldown: { reason: string } | null };
|
|
reddit?: { ready: boolean; loggedIn?: boolean; status?: string; error?: string };
|
|
realtime: RealtimeConnectionSnapshot;
|
|
sync?: { syncing: boolean; syncingKind?: string | null };
|
|
}
|
|
|
|
export interface ShellStatus {
|
|
bot: string;
|
|
reddit: string;
|
|
realtime: string;
|
|
cooldown: string | null;
|
|
sync: string;
|
|
controlAction: 'start' | 'stop';
|
|
controlDisabled: boolean;
|
|
}
|
|
|
|
function sentence(value: string): string { return value.charAt(0).toUpperCase() + value.slice(1); }
|
|
|
|
export function deriveShellStatus(input: ShellStatusInput): ShellStatus {
|
|
const stats = input.stats;
|
|
const realtime = input.realtime.status === 'connected'
|
|
? 'Realtime connected'
|
|
: `Realtime ${input.realtime.status}${input.realtime.isStale ? ' (stale)' : ''}`;
|
|
const reddit = input.reddit?.ready
|
|
? input.reddit.loggedIn ? `Reddit ${input.reddit.status ?? 'authenticated'}` : 'Reddit login required'
|
|
: 'Reddit session unavailable';
|
|
return {
|
|
bot: stats ? `${stats.isRunning ? 'Running' : 'Stopped'}${stats.dryRunMode ? ' (dry run)' : ''}` : 'Bot state unavailable',
|
|
reddit,
|
|
realtime,
|
|
cooldown: stats?.invitationCooldown?.reason ?? null,
|
|
sync: input.sync?.syncing ? `${sentence(input.sync.syncingKind ?? 'unknown')} sync active` : 'No active sync',
|
|
controlAction: stats?.isRunning ? 'stop' : 'start',
|
|
controlDisabled: stats === undefined,
|
|
};
|
|
}
|