import fs from "fs"; import path from "path"; import { BotConfig, Nation } from "../types"; const CONFIG_PATH = path.join(__dirname, "../../data/config.json"); // Function instead of const so env vars are read lazily at call time function getDefaults(): Required { return { officerRoles: ["Ice King"], configRoles: ["Ice King"], tagRoles: ["Ice King", "Ice", "Rebellion"], lockMessage: "🔒 This poll has been locked.", confirmYesMessage: "⚔️ TG is confirmed for tonight!", confirmNoMessage: "❌ TG is cancelled for tonight.", pollChannelId: process.env.POLL_CHANNEL_ID ?? "", resultsChannelId: process.env.RESULTS_CHANNEL_ID ?? "", scoreChannelId: process.env.SCORE_CHANNEL_ID ?? "", slots: [ { tgHour: 20, pollOpens: "10:00", closesAfter: 35, active: true }, ], scoreWindowHours: 2, tgDurationMinutes: 35, nationSource: "Procyon" as Nation, wRankPostOnReset: false, wRankGoal: 7, wRankYellowColor: "#BA7517", wRankGrayColor: "#888888", deltaUpColor: "#A32D2D", deltaDownColor: "#185FA5", stormBringerColor: "#185FA5", luminousBringerColor: "#8B4CB8", showClassInMessages: false, showLevelInMessages: false, charDisplayFormat: "{wrank} {class} {level} {name}", showNationTotalsInHeader: false, showNoInNationField: false, borrowRequestExpiryMs: 0, // 0 = never expire }; } let _cfg: BotConfig = {}; export function loadConfig(): void { try { _cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8")); } catch { _cfg = {}; } } export function saveConfig(): void { try { fs.writeFileSync(CONFIG_PATH, JSON.stringify(_cfg, null, 2)); } catch (err) { console.error("Failed to save config.json:", err); } } export function cfg(key: K): Required[K] { return (_cfg[key] !== undefined ? _cfg[key] : getDefaults()[key]) as Required[K]; } export function setCfg(key: K, value: BotConfig[K]): void { _cfg[key] = value; saveConfig(); } export function resetCfg(key: K): void { delete _cfg[key]; saveConfig(); }