diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ad867c..3465dae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * **Change default configuration format to .ini** * Existing `config.json` files will continue to work and will not be deprecated * This makes the default configuration format for the bot much more approachable than JSON +* Config values can now also be loaded from environment variables + (see [Configuration](docs/configuration.md#environment-variables) for more details) * New rewritten instructions for setting up and using the bot * New easy-to-use `start.bat` file for Windows * Update several package dependencies diff --git a/docs/configuration.md b/docs/configuration.md index eb1b45b..b9dfa74 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -7,6 +7,7 @@ Haven't set up the bot yet? Check out [Setting up the bot](setup.md) first! - [Required options](#required-options) - [Other options](#other-options) - [config.ini vs config.json](#configini-vs-configjson) +- [Environment variables](#environment-variables) ## Configuration file All bot options are saved in a configuration file in the bot's folder. @@ -313,3 +314,23 @@ by escaping the newline with a backslash (`\ `): This is the second line of the greeting." } ``` + +## Environment variables +Config options can be passed via environment variables. + +To get the name of the corresponding environment variable for an option, convert the option to SNAKE_CASE with periods +being replaced by two underscores and add `MM_` as a prefix. If adding multiple values for the same option, separate the +values with two pipe characters: `||`. + +Examples: +* `mainGuildId` -> `MM_MAIN_GUILD_ID` +* `commandAliases.mv` -> `MM_COMMAND_ALIASES__MV` +* From: + ```ini + inboxServerPermission[] = kickMembers + inboxServerPermission[] = manageMessages + ``` + To: + `MM_INBOX_SERVER_PERMISSION=kickMembers||manageMessages` + +The `port` option also accepts the environment variable `PORT` without a prefix, but `MM_PORT` takes precedence. diff --git a/src/config.js b/src/config.js index 403853b..fceaa15 100644 --- a/src/config.js +++ b/src/config.js @@ -137,17 +137,21 @@ for (const [key, value] of Object.entries(process.env)) { .replace(/([a-z])_([a-z])/g, (m, m1, m2) => `${m1}${m2.toUpperCase()}`) .replace('__', '.'); - userConfig[configKey] = process.env[key]; + userConfig[configKey] = value.includes('||') + ? value.split('||') + : value; + + loadedEnvValues++; +} + +if (process.env.PORT && !process.env.MM_PORT) { + // Special case: allow common "PORT" environment variable without prefix + userConfig.port = process.env.PORT; loadedEnvValues++; } if (loadedEnvValues > 0) { - console.log(`Loaded ${loadedEnvValues} values from environment variables`); -} - -if (process.env.PORT) { - // Special case: allow common "PORT" environment variable without prefix - userConfig.port = process.env.PORT; + console.log(`Loaded ${loadedEnvValues} ${loadedEnvValues === 1 ? 'value' : 'values'} from environment variables`); } // Convert config keys with periods to objects