90 lines
1.9 KiB
JavaScript
90 lines
1.9 KiB
JavaScript
// Live config objects — reload mutates in place so existing references stay valid.
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const yaml = require("js-yaml");
|
|
|
|
const CONFIG_DIR = path.join(__dirname, "../Configs");
|
|
|
|
const FILE_KEYS = [
|
|
"supportbot",
|
|
"commands",
|
|
"messages",
|
|
"ticket-panel",
|
|
"supportbot-ai",
|
|
"api",
|
|
];
|
|
|
|
function readConfig(name) {
|
|
return yaml.load(fs.readFileSync(path.join(CONFIG_DIR, `${name}.yml`), "utf8"));
|
|
}
|
|
|
|
function deepAssign(target, source) {
|
|
if (!target || typeof target !== "object" || Array.isArray(target)) {
|
|
return source;
|
|
}
|
|
if (!source || typeof source !== "object" || Array.isArray(source)) {
|
|
return source;
|
|
}
|
|
|
|
for (const key of Object.keys(source)) {
|
|
const next = source[key];
|
|
if (
|
|
next &&
|
|
typeof next === "object" &&
|
|
!Array.isArray(next) &&
|
|
target[key] &&
|
|
typeof target[key] === "object" &&
|
|
!Array.isArray(target[key])
|
|
) {
|
|
deepAssign(target[key], next);
|
|
} else {
|
|
target[key] = next;
|
|
}
|
|
}
|
|
|
|
for (const key of Object.keys(target)) {
|
|
if (!(key in source)) {
|
|
delete target[key];
|
|
}
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
const store = {};
|
|
for (const name of FILE_KEYS) {
|
|
store[name] = readConfig(name);
|
|
}
|
|
|
|
function reloadFile(fileKey) {
|
|
if (!FILE_KEYS.includes(fileKey)) {
|
|
throw new Error(`Unknown config: ${fileKey}`);
|
|
}
|
|
const fresh = readConfig(fileKey);
|
|
deepAssign(store[fileKey], fresh);
|
|
return store[fileKey];
|
|
}
|
|
|
|
function reloadBotConfigs() {
|
|
const reloaded = [];
|
|
for (const name of FILE_KEYS) {
|
|
if (name === "api") continue;
|
|
reloadFile(name);
|
|
reloaded.push(name);
|
|
}
|
|
return reloaded;
|
|
}
|
|
|
|
module.exports = {
|
|
supportbot: store.supportbot,
|
|
commands: store.commands,
|
|
messages: store.messages,
|
|
ticketPanel: store["ticket-panel"],
|
|
supportbotAi: store["supportbot-ai"],
|
|
api: store.api,
|
|
store,
|
|
reloadFile,
|
|
reloadBotConfigs,
|
|
readConfig,
|
|
};
|