diff --git a/server/validateConfig.js b/server/validateConfig.js index 1a08bbf..8368ffa 100644 --- a/server/validateConfig.js +++ b/server/validateConfig.js @@ -12,7 +12,7 @@ const validator = yup.object({ enabled: yup.bool().default(false), prefix: yup.string().min(1).required(), token: yup.string(), - admin: yup.array().default([]), + admins: yup.array().default([]), log_channel: yup.string(), hostname: yup.string().required() }), diff --git a/src/lib/configReader.js b/src/lib/configReader.js index 3fcf144..3441e11 100644 --- a/src/lib/configReader.js +++ b/src/lib/configReader.js @@ -2,14 +2,98 @@ const { join } = require('path'); const { info, error } = require('./logger'); const { existsSync, readFileSync } = require('fs'); +const e = (val, type, fn) => ({ val, type, fn }); + +const envValues = [ + e('SECURE', 'boolean', (c, v) => c.core.secure = v), + e('SECRET', 'string', (c, v) => c.core.secret = v), + e('HOST', 'string', (c, v) => c.core.host = v), + e('PORT', 'number', (c, v) => c.core.port = v), + e('DATABASE_URL', 'string', (c, v) => c.core.database_url = v), + + e('UPLOADER_RAW_ROUTE', 'string', (c, v) => c.uploader.raw_route = v), + e('UPLOADER_LENGTH', 'number', (c, v) => c.uploader.length = v), + e('UPLOADER_DIRECTORY', 'string', (c, v) => c.uploader.directory = v), + e('UPLOADER_BLACKLISTED', 'array', (c, v) => v ? c.uploader.blacklisted = v : c.uploader.blacklisted = []), + + e('BOT_ENABLED', 'boolean', (c, v) => c.bot.enabled = v), + e('BOT_PREFIX', 'string', (c, v) => c.bot.prefix = v), + e('BOT_TOKEN', 'string', (c, v) => c.bot.token = v), + e('BOT_ADMINS', 'array', (c, v) => v ? c.bot.admins = v : c.bot.admins = []), + e('BOT_LOG_CHANNEL', 'string', (c, v) => c.bot.log_channel = v), + e('BOT_HOSTNAME', 'string', (c, v) => c.bot.hostname = v), + + e('SHORTENER_ROUTE', 'string', (c, v) => c.shortener.route = v), + e('SHORTENER_LENGTH', 'number', (c, v) => c.shortener.length = v) +]; + module.exports = () => { if (!existsSync(join(process.cwd(), 'config.toml'))) { error('CONFIG', 'Config file not found, please create one.'); - process.exit(1); + return tryReadEnv(); } else { info('CONFIG', 'Reading config file'); const str = readFileSync(join(process.cwd(), 'config.toml'), 'utf8'); const parsed = require('@iarna/toml/parse-string')(str); return parsed; } -}; \ No newline at end of file +}; + +function tryReadEnv() { + const config = { + core: { + secure: undefined, + secret: undefined, + host: undefined, + port: undefined, + database_url: undefined, + }, + uploader: { + raw_route: undefined, + length: undefined, + directory: undefined, + blacklisted: undefined, + }, + bot: { + enabled: undefined, + prefix: undefined, + admins: undefined, + log_channel: undefined, + hostname: undefined + }, + shortener: { + route: undefined, + length: undefined, + }, + }; + + for (let i = 0, L = envValues.length; i !== L; ++i) { + const envValue = envValues[i]; + let value = process.env[envValue.val]; + if (!value) { + envValues[i].fn(config, undefined); + } else { + envValues[i].fn(config, value); + if (envValue.type === 'number') value = parseToNumber(value); + else if (envValue.type === 'boolean') value = parseToBoolean(value); + else if (envValue.type === 'array') value = parseToArray(value); + envValues[i].fn(config, value); + } + } + return config; +} + +function parseToNumber(value) { + const number = Number(value); + if (isNaN(number)) return undefined; + return number; +} + +function parseToBoolean(value) { + if (!value || value === 'false') return false; + else return true; +} + +function parseToArray(value) { + return value.split(','); +} \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index 79a0c16..5304d2e 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -10,7 +10,7 @@ export interface Bot { enabled: boolean; prefix: string; token: string; - admin: string[]; + admins: string[]; log_channel: string; hostname: string; } @@ -22,6 +22,7 @@ export interface Shortener { } export interface Uploader { + raw_route: string; length: number; directory: string; blacklisted: string[];