145 lines
5.0 KiB
JavaScript
145 lines
5.0 KiB
JavaScript
const { db } = require("./db");
|
|
const { envBoolean, envNumber, envString } = require("./config");
|
|
|
|
const ENV_DEFAULTS = {
|
|
discord_client_id: "DISCORD_CLIENT_ID",
|
|
discord_client_secret: "DISCORD_CLIENT_SECRET",
|
|
discord_bot_token: "DISCORD_BOT_TOKEN",
|
|
discord_guild_id: "DISCORD_GUILD_ID",
|
|
discord_admin_role_id: "DISCORD_ADMIN_ROLE_ID",
|
|
discord_mod_role_id: "DISCORD_MOD_ROLE_ID",
|
|
discord_redirect_uri: "DISCORD_REDIRECT_URI",
|
|
twitch_client_id: "TWITCH_CLIENT_ID",
|
|
twitch_client_secret: "TWITCH_CLIENT_SECRET",
|
|
twitch_redirect_uri: "TWITCH_REDIRECT_URI",
|
|
twitch_bot_username: "TWITCH_BOT_USERNAME",
|
|
twitch_bot_oauth: "TWITCH_BOT_OAUTH",
|
|
twitch_channels: "TWITCH_CHANNELS",
|
|
youtube_client_id: "YOUTUBE_CLIENT_ID",
|
|
youtube_client_secret: "YOUTUBE_CLIENT_SECRET",
|
|
youtube_redirect_uri: "YOUTUBE_REDIRECT_URI",
|
|
youtube_bot_refresh_token: "YOUTUBE_BOT_REFRESH_TOKEN",
|
|
youtube_bot_channel_id: "YOUTUBE_BOT_CHANNEL_ID"
|
|
};
|
|
|
|
function getSetting(key, fallback = null) {
|
|
const row = db.prepare("SELECT value FROM settings WHERE key = ?").get(key);
|
|
if (!row) {
|
|
return getEnvDefault(key, fallback);
|
|
}
|
|
try {
|
|
return JSON.parse(row.value);
|
|
} catch {
|
|
return row.value;
|
|
}
|
|
}
|
|
|
|
function setSetting(key, value) {
|
|
const now = Date.now();
|
|
db.prepare(
|
|
"INSERT INTO settings (key, value, updated_at) VALUES (?, ?, ?) " +
|
|
"ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at"
|
|
).run(key, JSON.stringify(value), now);
|
|
}
|
|
|
|
function getAllSettings() {
|
|
const rows = db.prepare("SELECT key, value FROM settings").all();
|
|
const settings = {};
|
|
for (const row of rows) {
|
|
try {
|
|
settings[row.key] = JSON.parse(row.value);
|
|
} catch {
|
|
settings[row.key] = row.value;
|
|
}
|
|
}
|
|
return settings;
|
|
}
|
|
|
|
function ensureDefaults() {
|
|
const defaults = {
|
|
site_title: "Lumi Bot",
|
|
command_prefix: envString("COMMAND_PREFIX", "!"),
|
|
discord_client_id: envString("DISCORD_CLIENT_ID", ""),
|
|
discord_client_secret: envString("DISCORD_CLIENT_SECRET", ""),
|
|
discord_bot_token: envString("DISCORD_BOT_TOKEN", ""),
|
|
discord_guild_id: envString("DISCORD_GUILD_ID", ""),
|
|
discord_admin_role_id: envString("DISCORD_ADMIN_ROLE_ID", ""),
|
|
discord_mod_role_id: envString("DISCORD_MOD_ROLE_ID", ""),
|
|
discord_redirect_uri: envString("DISCORD_REDIRECT_URI", ""),
|
|
auto_update_enabled: envBoolean("AUTO_UPDATE_ENABLED", false),
|
|
auto_update_interval_minutes: envNumber("AUTO_UPDATE_INTERVAL_MINUTES", 60),
|
|
production_diagnostics_enabled: false,
|
|
log_retention_days: 30,
|
|
log_retention_max_entries: 100000,
|
|
git_remote: envString("GIT_REMOTE", "origin"),
|
|
git_branch: envString("GIT_BRANCH", "main"),
|
|
bot_avatar_url: null,
|
|
platform_discord_enabled: envBoolean("PLATFORM_DISCORD_ENABLED", true),
|
|
platform_kick_enabled: envBoolean("PLATFORM_KICK_ENABLED", false),
|
|
platform_twitch_enabled: envBoolean("PLATFORM_TWITCH_ENABLED", true),
|
|
platform_youtube_enabled: envBoolean("PLATFORM_YOUTUBE_ENABLED", false),
|
|
twitch_client_id: envString("TWITCH_CLIENT_ID", ""),
|
|
twitch_client_secret: envString("TWITCH_CLIENT_SECRET", ""),
|
|
twitch_redirect_uri: envString("TWITCH_REDIRECT_URI", ""),
|
|
twitch_bot_username: envString("TWITCH_BOT_USERNAME", ""),
|
|
twitch_bot_oauth: envString("TWITCH_BOT_OAUTH", ""),
|
|
twitch_channels: envString("TWITCH_CHANNELS", ""),
|
|
youtube_client_id: envString("YOUTUBE_CLIENT_ID", ""),
|
|
youtube_client_secret: envString("YOUTUBE_CLIENT_SECRET", ""),
|
|
youtube_redirect_uri: envString("YOUTUBE_REDIRECT_URI", ""),
|
|
youtube_bot_refresh_token: envString("YOUTUBE_BOT_REFRESH_TOKEN", ""),
|
|
youtube_bot_channel_id: envString("YOUTUBE_BOT_CHANNEL_ID", ""),
|
|
custom_placeholders: [],
|
|
localhost_login_username: "admin",
|
|
localhost_login_password: "admin",
|
|
theme_light_bg_1: "#ffe5c4",
|
|
theme_light_bg_2: "#f4efe8",
|
|
theme_light_bg_3: "#e9f3f1",
|
|
theme_light_text: "#121518",
|
|
theme_light_text_muted: "#2c3137",
|
|
theme_light_accent: "#0f6a78",
|
|
theme_light_accent_alt: "#f4a340",
|
|
theme_light_danger: "#d66d5c",
|
|
theme_light_surface: "#ffffff",
|
|
theme_light_surface_2: "#fbf9f6",
|
|
theme_light_surface_3: "#f9f5ef",
|
|
theme_light_border: "#e3ddd6",
|
|
theme_dark_bg_1: "#1b1d1f",
|
|
theme_dark_bg_2: "#16181b",
|
|
theme_dark_bg_3: "#0f1113",
|
|
theme_dark_text: "#f2f0ec",
|
|
theme_dark_text_muted: "#c5bfb7",
|
|
theme_dark_accent: "#4fb6c2",
|
|
theme_dark_accent_alt: "#f1b765",
|
|
theme_dark_danger: "#e08173",
|
|
theme_dark_surface: "#232629",
|
|
theme_dark_surface_2: "#2b2f33",
|
|
theme_dark_surface_3: "#30353a",
|
|
theme_dark_border: "#34393d",
|
|
theme_role_public: "#ffffff",
|
|
theme_role_mod: "#2cb678",
|
|
theme_role_admin: "#e35678"
|
|
};
|
|
|
|
for (const [key, value] of Object.entries(defaults)) {
|
|
if (getSetting(key) === null) {
|
|
setSetting(key, value);
|
|
}
|
|
}
|
|
}
|
|
|
|
function getEnvDefault(key, fallback) {
|
|
const envKey = ENV_DEFAULTS[key];
|
|
if (!envKey) {
|
|
return fallback;
|
|
}
|
|
return envString(envKey, fallback);
|
|
}
|
|
|
|
module.exports = {
|
|
getSetting,
|
|
setSetting,
|
|
getAllSettings,
|
|
ensureDefaults
|
|
};
|