import path from "path"; import { BotConfig, Nation } from "../types"; import { Store } from "@systems/store"; import { Paths } from "@helpers/paths"; // 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: Nation.Procyon, 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 conflictReclaimBehavior: "revert", }; } let _cfg: BotConfig = {}; export function loadConfig(): void { _cfg = Store.readOrDefault(Paths.data("config.json"), {}); } export function saveConfig(): void { Store.write(Paths.data("config.json"), _cfg); } 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(); }