Lumi/src/services/settings.js
2026-07-18 20:24:26 +02:00

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
};