diff --git a/Xiao.js b/Xiao.js index 4b7f2a7b..758cbc19 100644 --- a/Xiao.js +++ b/Xiao.js @@ -93,10 +93,14 @@ client.on('ready', async () => { } // Set up disabled commands - const disabled = await client.redis.hgetall('disabled'); - for (const command of Object.keys(disabled)) { - client.registry.commands.get(command).disable(); - client.logger.info(`[DISABLED] Disabled the ${command} command.`); + try { + const disabled = await client.redis.hgetall('disabled'); + for (const command of Object.keys(disabled)) { + client.registry.commands.get(command).disable(); + client.logger.info(`[DISABLED] Disabled the ${command} command.`); + } + } catch (err) { + client.logger.error(`[DISABLED] Error while disabling commands:\n${err.stack}`); } // Import command-last-run.json @@ -163,7 +167,7 @@ client.on('ready', async () => { } } } - client.logger.info(`[BLACKLIST] Left ${guildsLeft} guilds owned by blacklisted users.`); + if (guildsLeft > 0) client.logger.info(`[BLACKLIST] Left ${guildsLeft} guilds owned by blacklisted users.`); // Set up existing timers try { @@ -190,8 +194,12 @@ client.on('ready', async () => { } // Set up parse-domain - await client.loadParseDomain(); - client.logger.info('[PARSE DOMAIN] parse-domain loaded.'); + try { + await client.loadParseDomain(); + client.logger.info('[PARSE DOMAIN] parse-domain loaded.'); + } catch (err) { + client.logger.error(`[PARSE DOMAIN] Failed to load parse-domain\n${err.stack}`); + } // Fetch adult site list try { @@ -210,14 +218,22 @@ client.on('ready', async () => { } // Set up face detection - await client.loadFaceDetector(); - client.logger.info('[FACE DETECTOR] Loaded face detector.'); + try { + await client.loadFaceDetector(); + client.logger.info('[FACE DETECTOR] Loaded face detector.'); + } catch (err) { + client.logger.error(`[FACE DETECTOR] Failed to load face detector\n${err.stack}`); + } // Fetch all members - for (const [, guild] of client.guilds.cache) { - await guild.members.fetch(); + try { + for (const guild of client.guilds.cache.values()) { + await guild.members.fetch(); + } + client.logger.info('[MEMBERS] Fetched all guild members.'); + } catch (err) { + client.logger.error(`[MEMBERS] Failed to fetch guild members\n${err.stack}`); } - client.logger.info('[MEMBERS] Fetched all guild members.'); }); client.on('messageCreate', async msg => { diff --git a/framework/Client.js b/framework/Client.js index 47a252dd..846f2594 100644 --- a/framework/Client.js +++ b/framework/Client.js @@ -72,9 +72,9 @@ module.exports = class CommandClient extends Client { if (!this.dispatcher.isCommand(msg)) return; const parsed = await this.dispatcher.parseMessage(msg); - if (typeof parsed === 'string') { - const helpUsage = this.registry.commands.get('help').usage(); - await msg.reply(`${parsed}\n\nUse ${helpUsage} for more information.`); + if (parsed.error) { + const helpUsage = this.registry.commands.get('help').usage(parsed.command.name); + await msg.reply(`${parsed.error}\n\nUse ${helpUsage} for more information.`); return; } const { command, args } = parsed; diff --git a/framework/Dispatcher.js b/framework/Dispatcher.js index bd484f06..8a90bc78 100644 --- a/framework/Dispatcher.js +++ b/framework/Dispatcher.js @@ -54,10 +54,10 @@ module.exports = class CommandDispatcher { finalResult[arg.key] = typeof arg.default === 'function' ? arg.default(msg) : arg.default; break; } else { - return stripIndents` + return { command, error: stripIndents` The "${arg.label || arg.key}" argument is required. ${arg.invalidText} - `; + ` }; } } } @@ -65,12 +65,12 @@ module.exports = class CommandDispatcher { for (const parsedArg of infinite) { const valid = await arg.validate(parsedArg, msg, arg); if (typeof valid === 'string') { - return valid; + return { command, error: valid }; } else if (!valid) { - return stripIndents` + return { command, error: stripIndents` An invalid value was provided for one of the "${arg.label || arg.key}" arguments. ${arg.invalidText} - `; + ` }; } parsedArgs.push(await arg.parse(parsedArg, msg, arg)); } @@ -80,10 +80,10 @@ module.exports = class CommandDispatcher { const parsedArg = i + 1 === command.args.length ? parsed._.slice(i).join(' ') : parsed._[i]?.toString(); if (arg.isEmpty(parsedArg, msg, arg)) { if (arg.default === null) { - return stripIndents` + return { command, error: stripIndents` The "${arg.label || arg.key}" argument is required. ${arg.invalidText} - `; + ` }; } else { finalResult[arg.key] = typeof arg.default === 'function' ? arg.default(msg) : arg.default; continue; @@ -91,12 +91,12 @@ module.exports = class CommandDispatcher { } const valid = await arg.validate(parsedArg, msg, arg); if (typeof valid === 'string') { - return valid; + return { command, error: valid }; } else if (!valid) { - return stripIndents` + return { command, error: stripIndents` An invalid value was provided for the "${arg.label || arg.key}" argument. ${arg.invalidText} - `; + ` }; } finalResult[arg.key] = await arg.parse(parsedArg, msg, arg); }