50 lines
3.1 KiB
TypeScript
50 lines
3.1 KiB
TypeScript
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);
|
|
`);
|
|
}
|