import type Database from 'better-sqlite3'; /** Accounts, receipts and audit evidence deliberately outlive matches and servers. */ export function migrateAfk(handle: Database.Database): void { handle.exec(` CREATE TABLE IF NOT EXISTS afk_accounts ( guid TEXT PRIMARY KEY, free_seconds INTEGER NOT NULL CHECK(free_seconds >= 0), saved_seconds INTEGER NOT NULL DEFAULT 0 CHECK(saved_seconds >= 0), free_started_at INTEGER NOT NULL, active_seconds INTEGER NOT NULL DEFAULT 0, kill_progress INTEGER NOT NULL DEFAULT 0, headshot_progress INTEGER NOT NULL DEFAULT 0, bonus_hour INTEGER NOT NULL DEFAULT 0, bonus_seconds INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS afk_operations ( server TEXT NOT NULL, request_id TEXT NOT NULL, instance_id TEXT NOT NULL, guid TEXT NOT NULL, fingerprint TEXT NOT NULL, result TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY(server,request_id) ); CREATE TABLE IF NOT EXISTS afk_progress ( instance_id TEXT NOT NULL, match_key TEXT NOT NULL, guid TEXT NOT NULL, seq INTEGER NOT NULL, active_seconds INTEGER NOT NULL, kills INTEGER NOT NULL, headshots INTEGER NOT NULL, rounds INTEGER NOT NULL, revives INTEGER NOT NULL, PRIMARY KEY(instance_id,match_key,guid) ); CREATE TABLE IF NOT EXISTS afk_bonus_rewards ( guid TEXT NOT NULL, active_second INTEGER NOT NULL, seconds INTEGER NOT NULL ); CREATE INDEX IF NOT EXISTS afk_bonus_rewards_guid ON afk_bonus_rewards(guid,active_second); CREATE TABLE IF NOT EXISTS afk_sessions ( session_id TEXT PRIMARY KEY, server TEXT NOT NULL, instance_id TEXT NOT NULL, guid TEXT NOT NULL, match_key TEXT NOT NULL, match_id INTEGER, state TEXT NOT NULL CHECK(state IN ('reserved','started','settled','unresolved','corrected')), authorized_seconds INTEGER NOT NULL, free_seconds INTEGER NOT NULL, saved_seconds INTEGER NOT NULL, free_started_at INTEGER NOT NULL, consumed_seconds INTEGER, charged_seconds INTEGER, free_charge_at INTEGER, confirmed_seconds INTEGER NOT NULL DEFAULT 0, end_reason TEXT, created_at TEXT NOT NULL, started_at TEXT, ended_at TEXT ); CREATE UNIQUE INDEX IF NOT EXISTS afk_pending_guid ON afk_sessions(guid) WHERE state IN ('reserved','started','unresolved'); CREATE TABLE IF NOT EXISTS afk_ledger ( id INTEGER PRIMARY KEY AUTOINCREMENT, guid TEXT NOT NULL, server TEXT NOT NULL, match_id INTEGER, operation_id TEXT NOT NULL, session_id TEXT, kind TEXT NOT NULL, free_delta INTEGER NOT NULL, saved_delta INTEGER NOT NULL, free_seconds INTEGER NOT NULL, saved_seconds INTEGER NOT NULL, event_at TEXT NOT NULL, created_at TEXT NOT NULL, details TEXT NOT NULL DEFAULT '{}' ); CREATE INDEX IF NOT EXISTS afk_ledger_guid ON afk_ledger(guid,id DESC); CREATE INDEX IF NOT EXISTS afk_sessions_guid ON afk_sessions(guid,created_at DESC); `); }