import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs' export interface StarboardPost { channelID: string messageID: string signature: string deleted?: boolean } export interface ScanJob { kind: 'messages' | 'publicThreads' | 'privateThreads' | 'joinedThreads' channelID: string before?: string } export interface Candidate { channelID: string } export interface Backfill { phase: 'collecting' | 'posting' candidates: Record pending: Record processed: number startedAt: string completedAt?: string initialized: boolean jobs: ScanJob[] channels: string[] scanned: number skipped: string[] error?: string } export interface StarboardState { destinationID?: string posts: Record backfill?: Backfill archivedBoards?: Record; backfill?: unknown }> } const FILE = new URL('../data/starboard.json', import.meta.url) export function loadStarboard(): StarboardState { try { return JSON.parse(readFileSync(FILE, 'utf8')) as StarboardState } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { posts: {} } throw error } } export function saveStarboard(state: StarboardState): void { mkdirSync(new URL('.', FILE), { recursive: true }) const temporary = new URL(`${FILE.href}.tmp`) writeFileSync(temporary, JSON.stringify(state, null, 2)) renameSync(temporary, FILE) }