ramirez/src/config.js

187 lines
5.2 KiB
JavaScript
Raw Normal View History

const json5 = require('json5');
const fs = require('fs');
const path = require('path');
2017-09-19 13:23:55 -04:00
let userConfig;
// Try to find our config file from several options
const configFiles = [
'config.json',
'config.json5',
'config.json.json',
2018-08-07 18:32:22 -04:00
'config.json.txt',
'config.js'
];
let foundConfigFile;
for (const configFile of configFiles) {
try {
fs.accessSync(__dirname + '/../' + configFile);
foundConfigFile = configFile;
break;
} catch (e) {}
}
if (! foundConfigFile) {
throw new Error(`Could not find config.json!`);
}
// Parse the config using JSON5
2017-09-19 13:23:55 -04:00
try {
2018-08-07 18:32:22 -04:00
if (foundConfigFile.endsWith('.js')) {
userConfig = require(`../${foundConfigFile}`);
} else {
const raw = fs.readFileSync(__dirname + '/../' + foundConfigFile);
userConfig = json5.parse(raw);
}
2017-09-19 13:23:55 -04:00
} catch (e) {
throw new Error(`Error reading config file! The error given was: ${e.message}`);
2017-09-19 13:23:55 -04:00
}
const defaultConfig = {
"token": null,
"mailGuildId": null,
"mainGuildId": null,
"logChannelId": null,
"prefix": "!",
"snippetPrefix": "!!",
"snippetPrefixAnon": "!!!",
2017-09-19 13:23:55 -04:00
"status": "Message me for help!",
"responseMessage": "Thank you for your message! Our mod team will reply to you here as soon as possible.",
"closeMessage": null,
2018-09-20 16:31:14 -04:00
"allowUserClose": false,
2017-09-19 13:23:55 -04:00
2017-09-22 15:18:15 -04:00
"newThreadCategoryId": null,
2018-03-11 16:08:59 -04:00
"mentionRole": "here",
"pingOnBotMention": true,
"botMentionResponse": null,
2017-09-22 15:18:15 -04:00
2017-09-19 13:23:55 -04:00
"inboxServerPermission": null,
"alwaysReply": false,
"alwaysReplyAnon": false,
"useNicknames": false,
"ignoreAccidentalThreads": false,
"threadTimestamps": false,
2018-02-18 17:23:29 -05:00
"allowMove": false,
"syncPermissionsOnMove": false,
2018-01-22 17:17:24 -05:00
"typingProxy": false,
"typingProxyReverse": false,
"mentionUserInThreadHeader": false,
2019-06-09 09:04:17 -04:00
"rolesInThreadHeader": false,
2017-09-19 13:23:55 -04:00
"enableGreeting": false,
2017-09-19 14:32:48 -04:00
"greetingMessage": null,
"greetingAttachment": null,
2017-09-19 13:23:55 -04:00
2019-06-09 08:56:04 -04:00
"guildGreetings": {},
"requiredAccountAge": null, // In hours
2018-07-27 12:48:45 -04:00
"accountAgeDeniedMessage": "Your Discord account is not old enough to contact modmail.",
"requiredTimeOnServer": null, // In minutes
"timeOnServerDeniedMessage": "You haven't been a member of the server for long enough to contact modmail.",
2019-04-15 09:43:22 -04:00
"relaySmallAttachmentsAsAttachments": false,
"smallAttachmentLimit": 1024 * 1024 * 2,
2019-03-06 16:31:24 -05:00
"attachmentStorage": "local",
"attachmentStorageChannelId": null,
"categoryAutomation": {},
2017-09-19 13:23:55 -04:00
"port": 8890,
"url": null,
"dbDir": path.join(__dirname, '..', 'db'),
"knex": null,
"logDir": path.join(__dirname, '..', 'logs'),
2017-09-19 13:23:55 -04:00
};
2017-12-31 19:16:05 -05:00
const required = ['token', 'mailGuildId', 'mainGuildId', 'logChannelId'];
2017-09-19 13:23:55 -04:00
const finalConfig = Object.assign({}, defaultConfig);
for (const [prop, value] of Object.entries(userConfig)) {
if (! defaultConfig.hasOwnProperty(prop)) {
throw new Error(`Invalid option: ${prop}`);
}
finalConfig[prop] = value;
}
// Default knex config
if (! finalConfig['knex']) {
finalConfig['knex'] = {
client: 'sqlite',
connection: {
filename: path.join(finalConfig.dbDir, 'data.sqlite')
},
useNullAsDefault: true
};
}
// Make sure migration settings are always present in knex config
Object.assign(finalConfig['knex'], {
migrations: {
directory: path.join(finalConfig.dbDir, 'migrations')
}
});
// Make sure all of the required config options are present
for (const opt of required) {
if (! finalConfig[opt]) {
console.error(`Missing required config.json value: ${opt}`);
process.exit(1);
}
}
2017-09-19 13:23:55 -04:00
if (finalConfig.smallAttachmentLimit > 1024 * 1024 * 8) {
finalConfig.smallAttachmentLimit = 1024 * 1024 * 8;
2019-03-06 16:31:24 -05:00
console.warn('[WARN] smallAttachmentLimit capped at 8MB');
}
// Specific checks
if (finalConfig.attachmentStorage === 'discord' && ! finalConfig.attachmentStorageChannelId) {
console.error('Config option \'attachmentStorageChannelId\' is required with attachment storage \'discord\'');
process.exit(1);
}
// Make sure mainGuildId is internally always an array
if (! Array.isArray(finalConfig['mainGuildId'])) {
finalConfig['mainGuildId'] = [finalConfig['mainGuildId']];
}
// Make sure inboxServerPermission is always an array
if (! Array.isArray(finalConfig['inboxServerPermission'])) {
if (finalConfig['inboxServerPermission'] == null) {
finalConfig['inboxServerPermission'] = [];
} else {
finalConfig['inboxServerPermission'] = [finalConfig['inboxServerPermission']];
}
}
2019-06-09 08:56:04 -04:00
// Move greetingMessage/greetingAttachment to the guildGreetings object internally
// Or, in other words, if greetingMessage and/or greetingAttachment is set, it is applied for all servers that don't
// already have something set up in guildGreetings. This retains backwards compatibility while allowing you to override
// greetings for specific servers in guildGreetings.
if (finalConfig.greetingMessage || finalConfig.greetingAttachment) {
for (const guildId of finalConfig.mainGuildId) {
if (finalConfig.guildGreetings[guildId]) continue;
finalConfig.guildGreetings[guildId] = {
message: finalConfig.greetingMessage,
message: finalConfig.greetingMessage
};
}
}
// newThreadCategoryId is syntactic sugar for categoryAutomation.newThread
if (finalConfig.newThreadCategoryId) {
finalConfig.categoryAutomation.newThread = finalConfig.newThreadCategoryId;
delete finalConfig.newThreadCategoryId;
}
2017-09-19 13:23:55 -04:00
module.exports = finalConfig;