feat: added checking of config JSON schema in startup
This commit is contained in:
parent
fc46232b38
commit
c418cbbc90
6 changed files with 88 additions and 10 deletions
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"token": "",
|
||||
"loglevel": "info"
|
||||
"logLevel": "info"
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"loglevel": "verbose"
|
||||
"logLevel": "verbose"
|
||||
}
|
42
src/index.ts
42
src/index.ts
|
@ -16,19 +16,44 @@
|
|||
*/
|
||||
require('module-alias/register');
|
||||
|
||||
import process from 'process';
|
||||
import { Client } from 'discord.js';
|
||||
import figlet from 'figlet';
|
||||
import gradient from 'gradient-string';
|
||||
// import config from 'config';
|
||||
import { debug, error, info } from '@utils/logger';
|
||||
import config from 'config';
|
||||
import { Validator } from 'jsonschema';
|
||||
import { DateTime } from 'luxon';
|
||||
import chalk from 'chalk';
|
||||
import { debug, error, info, verbose } from '@utils/logger';
|
||||
import { ELoggingScope } from '@utils/types';
|
||||
import { Defaults } from '@utils/defaults';
|
||||
|
||||
debug('Starting bot... Please wait!', ELoggingScope.Startup);
|
||||
info('Starting bot... Please wait!', ELoggingScope.Startup);
|
||||
debug('Checking config JSON schema', ELoggingScope.Startup);
|
||||
|
||||
const mergedConfig = config.util.extendDeep(Defaults.config, config.util.loadFileConfigs(`${process.cwd()}/config`));
|
||||
|
||||
const schemaValidator = new Validator();
|
||||
const validate = schemaValidator.validate(mergedConfig, Defaults.configSchema);
|
||||
|
||||
if (validate.valid) {
|
||||
debug('Config matches JSON schema', ELoggingScope.Startup);
|
||||
} else {
|
||||
// Manually send fatal message in case someone messes up the logLevel JSON schema
|
||||
const message = `Found some errors with the config! Please check errors below.\n${validate.errors}`;
|
||||
|
||||
const date = DateTime.now().toLocal().setLocale(Intl.DateTimeFormat().resolvedOptions().locale).toFormat('yyyy-LL-dd HH:mm:ss');
|
||||
const splitMultiline = message.split('\n');
|
||||
|
||||
splitMultiline.forEach((val) => {
|
||||
console.log(chalk`{grey (${date})} {magenta.bold ${ELoggingScope.Startup}} {red.bold.underline [FATAL]}: {red.underline ${val}}`);
|
||||
});
|
||||
}
|
||||
|
||||
figlet('Argon Bot', (err, data) => {
|
||||
if (err) error(`Figlet encountered an error!\n${err.message}`);
|
||||
|
||||
info(gradient.rainbow.multiline(`\n${data}`));
|
||||
info(gradient.rainbow.multiline(`\n${data}`), ELoggingScope.Startup);
|
||||
});
|
||||
|
||||
const client = new Client({
|
||||
|
@ -36,7 +61,14 @@ const client = new Client({
|
|||
});
|
||||
|
||||
client.on('ready', () => {
|
||||
debug(`Total number of Servers: ${client.guilds.cache.size}`, ELoggingScope.Startup);
|
||||
debug(`Total number of Users: ${client.users.cache.size}`, ELoggingScope.Startup);
|
||||
|
||||
info('Bot is ready!', ELoggingScope.Startup);
|
||||
});
|
||||
|
||||
//client.login(token);
|
||||
client.on('raw', (payload) => {
|
||||
verbose(JSON.stringify(payload, null, 2), ELoggingScope.Payload);
|
||||
});
|
||||
|
||||
client.login(config.get('token'));
|
||||
|
|
46
src/lib/utils/defaults.ts
Normal file
46
src/lib/utils/defaults.ts
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* This file is part of ArgonBot
|
||||
*
|
||||
* ArgonBot is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* ArgonBot is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with ArgonBot. If not, see <https: //www.gnu.org/licenses/>.
|
||||
*/
|
||||
export const Defaults = {
|
||||
config: {
|
||||
logLevel: 'info',
|
||||
},
|
||||
configSchema: {
|
||||
$id: 'http://example.com/example.json',
|
||||
$schema: 'http://json-schema.org/draft-07/schema',
|
||||
required: ['token', 'logLevel'],
|
||||
type: 'object',
|
||||
properties: {
|
||||
token: {
|
||||
$id: '#/properties/token',
|
||||
type: 'string',
|
||||
},
|
||||
logLevel: {
|
||||
$id: '#/properties/logLevel',
|
||||
type: 'string',
|
||||
enum: [
|
||||
'verbose',
|
||||
'debug',
|
||||
'info',
|
||||
'warn',
|
||||
'error',
|
||||
'fatal',
|
||||
],
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
};
|
|
@ -20,8 +20,6 @@ import { DateTime } from 'luxon';
|
|||
|
||||
import type { ELoggingScope } from './types';
|
||||
|
||||
chalk.Level = 3;
|
||||
|
||||
let verboseLevel = false;
|
||||
let debugLevel = false;
|
||||
let infoLevel = false;
|
||||
|
@ -29,7 +27,7 @@ let warnLevel = false;
|
|||
let errorLevel = false;
|
||||
let fatalLevel = false;
|
||||
|
||||
switch ((config.get('loglevel') as string).toLowerCase()) {
|
||||
switch ((config.get('logLevel') as string).toLowerCase()) {
|
||||
case 'verbose':
|
||||
verboseLevel = true;
|
||||
debugLevel = true;
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
export enum ELoggingScope {
|
||||
Startup = 'STARTUP',
|
||||
Command = 'COMMAND',
|
||||
Payload = 'PAYLOAD',
|
||||
Query = 'QUERY',
|
||||
}
|
||||
|
||||
// Interfaces
|
||||
|
|
Reference in a new issue