2018-05-03 12:55:21 -04:00
|
|
|
const json5 = require('json5');
|
|
|
|
const fs = require('fs');
|
2017-12-24 15:04:08 -05:00
|
|
|
const path = require('path');
|
|
|
|
|
2017-09-19 13:23:55 -04:00
|
|
|
let userConfig;
|
|
|
|
|
2018-05-03 12:55:21 -04:00
|
|
|
// 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'
|
2018-05-03 12:55:21 -04:00
|
|
|
];
|
|
|
|
|
|
|
|
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) {
|
2018-05-03 12:55:21 -04:00
|
|
|
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": "!!",
|
2018-09-20 15:54:47 -04:00
|
|
|
"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.",
|
2018-07-05 12:34:12 -04:00
|
|
|
"closeMessage": null,
|
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",
|
2018-05-03 13:26:12 -04:00
|
|
|
"pingOnBotMention": true,
|
2018-09-20 15:07:38 -04:00
|
|
|
"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,
|
2018-02-18 16:29:24 -05:00
|
|
|
"threadTimestamps": false,
|
2018-02-18 17:23:29 -05:00
|
|
|
"allowMove": false,
|
2018-01-22 17:17:24 -05:00
|
|
|
"typingProxy": false,
|
|
|
|
"typingProxyReverse": false,
|
2018-09-20 15:03:28 -04:00
|
|
|
"mentionUserInThreadHeader": 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
|
|
|
|
2018-07-27 13:35:20 -04:00
|
|
|
"requiredAccountAge": null, // In hours
|
2018-07-27 12:48:45 -04:00
|
|
|
"accountAgeDeniedMessage": "Your Discord account is not old enough to contact modmail.",
|
2018-07-10 05:59:29 -04:00
|
|
|
|
2018-02-18 13:06:24 -05:00
|
|
|
"relaySmallAttachmentsAsAttachments": false,
|
2018-08-07 17:59:02 -04:00
|
|
|
"smallAttachmentLimit": 1024 * 1024 * 2,
|
2018-02-18 13:06:24 -05:00
|
|
|
|
2017-09-19 13:23:55 -04:00
|
|
|
"port": 8890,
|
2017-12-24 15:04:08 -05:00
|
|
|
"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;
|
|
|
|
}
|
|
|
|
|
2018-04-21 08:38:21 -04:00
|
|
|
// Default knex config
|
2017-12-24 15:04:08 -05:00
|
|
|
if (! finalConfig['knex']) {
|
|
|
|
finalConfig['knex'] = {
|
|
|
|
client: 'sqlite',
|
|
|
|
connection: {
|
|
|
|
filename: path.join(finalConfig.dbDir, 'data.sqlite')
|
|
|
|
},
|
|
|
|
useNullAsDefault: true
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2018-04-21 08:38:21 -04:00
|
|
|
// Make sure migration settings are always present in knex config
|
2017-12-24 15:04:08 -05:00
|
|
|
Object.assign(finalConfig['knex'], {
|
|
|
|
migrations: {
|
|
|
|
directory: path.join(finalConfig.dbDir, 'migrations')
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2018-04-21 08:38:21 -04:00
|
|
|
// Make sure all of the required config options are present
|
2017-12-24 15:04:08 -05:00
|
|
|
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
|
|
|
|
2018-08-07 17:59:02 -04:00
|
|
|
if (finalConfig.smallAttachmentLimit > 1024 * 1024 * 8) {
|
|
|
|
finalConfig.smallAttachmentLimit = 1024 * 1024 * 8;
|
|
|
|
console.log('[WARN] smallAttachmentLimit capped at 8MB');
|
|
|
|
}
|
|
|
|
|
2018-04-21 08:38:21 -04:00
|
|
|
// Make sure mainGuildId is internally always an array
|
|
|
|
if (! Array.isArray(finalConfig['mainGuildId'])) {
|
|
|
|
finalConfig['mainGuildId'] = [finalConfig['mainGuildId']];
|
|
|
|
}
|
|
|
|
|
2018-09-20 15:27:59 -04:00
|
|
|
// Make sure inboxServerPermission is always an array
|
|
|
|
if (! Array.isArray(finalConfig['inboxServerPermission'])) {
|
|
|
|
if (finalConfig['inboxServerPermission'] == null) {
|
|
|
|
finalConfig['inboxServerPermission'] = [];
|
|
|
|
} else {
|
|
|
|
finalConfig['inboxServerPermission'] = [finalConfig['inboxServerPermission']];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-19 13:23:55 -04:00
|
|
|
module.exports = finalConfig;
|