diff options
-rw-r--r-- | src/commands/admin/channelPermissions.ts | 2 | ||||
-rw-r--r-- | src/commands/dev/reload.ts | 2 | ||||
-rw-r--r-- | src/commands/dev/sh.ts | 2 | ||||
-rw-r--r-- | src/commands/utilities/decode.ts | 2 | ||||
-rw-r--r-- | src/lib/common/AutoMod.ts | 2 | ||||
-rw-r--r-- | src/lib/extensions/discord-akairo/BushClient.ts | 6 | ||||
-rw-r--r-- | src/lib/extensions/discord-akairo/BushClientUtil.ts | 41 | ||||
-rw-r--r-- | src/lib/extensions/discord.js/BushGuildMember.ts | 2 | ||||
-rw-r--r-- | src/listeners/commands/commandError.ts | 4 | ||||
-rw-r--r-- | src/listeners/contextCommands/contextCommandError.ts | 2 | ||||
-rw-r--r-- | src/listeners/other/promiseRejection.ts | 6 | ||||
-rw-r--r-- | src/listeners/other/uncaughtException.ts | 6 | ||||
-rw-r--r-- | src/listeners/other/warning.ts | 2 |
13 files changed, 57 insertions, 22 deletions
diff --git a/src/commands/admin/channelPermissions.ts b/src/commands/admin/channelPermissions.ts index dac7117..15f1260 100644 --- a/src/commands/admin/channelPermissions.ts +++ b/src/commands/admin/channelPermissions.ts @@ -83,7 +83,7 @@ export default class ChannelPermissionsCommand extends BushCommand { { reason: 'Changing overwrites for mass channel perms command' } ); } catch (e) { - void client.console.error('channelPermissions', e.stack); + void client.console.error('channelPermissions', util.formatError(e)); failedChannels.push(channel); } } diff --git a/src/commands/dev/reload.ts b/src/commands/dev/reload.ts index d874c83..17802b0 100644 --- a/src/commands/dev/reload.ts +++ b/src/commands/dev/reload.ts @@ -47,7 +47,7 @@ export default class ReloadCommand extends BushCommand { } catch (e) { if (output!) void client.logger.error('reloadCommand', output); return message.util.send( - `An error occurred while reloading:\n${await util.codeblock(e?.stack || e, 2048 - 34, 'js', true)}` + `An error occurred while reloading:\n${await util.codeblock(util.formatError(e), 2048 - 34, 'js', true)}` ); } } diff --git a/src/commands/dev/sh.ts b/src/commands/dev/sh.ts index be6a015..e071e73 100644 --- a/src/commands/dev/sh.ts +++ b/src/commands/dev/sh.ts @@ -82,7 +82,7 @@ export default class ShCommand extends BushCommand { .setColor(util.colors.error) .spliceFields(1, 1); - embed.addFields([{ name: '📤 Output', value: await util.codeblock(e?.stack, 1024, 'js', true) }]); + embed.addFields([{ name: '📤 Output', value: await util.codeblock(util.formatError(e), 1024, 'js', true) }]); } await message.util.edit({ embeds: [embed] }); } diff --git a/src/commands/utilities/decode.ts b/src/commands/utilities/decode.ts index 729cf35..7cb0e83 100644 --- a/src/commands/utilities/decode.ts +++ b/src/commands/utilities/decode.ts @@ -65,7 +65,7 @@ export default class DecodeCommand extends BushCommand { decodedEmbed.setColor(util.colors.error).addFields([ { name: `📤 Error ${encodeOrDecode.slice(1)}ing`, - value: await util.inspectCleanRedactCodeblock(error?.stack ?? error) + value: await util.inspectCleanRedactCodeblock(util.formatError(error)) } ]); } diff --git a/src/lib/common/AutoMod.ts b/src/lib/common/AutoMod.ts index b08fc40..f30eab7 100644 --- a/src/lib/common/AutoMod.ts +++ b/src/lib/common/AutoMod.ts @@ -300,7 +300,7 @@ export class AutoMod { { title: 'AutoMod Error', description: `Unable to delete triggered message.`, - fields: [{ name: 'Error', value: await util.codeblock(`${e.stack ?? e}`, 1024, 'js', true) }], + fields: [{ name: 'Error', value: await util.codeblock(`${util.formatError(e)}`, 1024, 'js', true) }], color: util.colors.error } ] diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts index 847631c..ac4de5f 100644 --- a/src/lib/extensions/discord-akairo/BushClient.ts +++ b/src/lib/extensions/discord-akairo/BushClient.ts @@ -431,7 +431,11 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re void this.logger.success('startup', `Successfully loaded <<${handlerName}>>.`, false); }) .catch((e) => { - void this.logger.error('startup', `Unable to load loader <<${handlerName}>> with error:\n${e?.stack || e}`, false); + void this.logger.error( + 'startup', + `Unable to load loader <<${handlerName}>> with error:\n${util.formatError(e)}`, + false + ); if (process.argv.includes('dry')) process.exit(1); }) ); diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts index 7629c38..c0df724 100644 --- a/src/lib/extensions/discord-akairo/BushClientUtil.ts +++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts @@ -683,7 +683,7 @@ export class BushClientUtil extends ClientUtil { * @param error */ public async handleError(context: string, error: Error) { - await client.console.error(_.camelCase(context), `An error occurred:\n${error?.stack ?? (error as any)}`, false); + await client.console.error(_.camelCase(context), `An error occurred:\n${util.formatError(error)}`, false); await client.console.channelError({ embeds: [await CommandErrorListener.generateErrorEmbed({ type: 'unhandledRejection', error: error, context })] }); @@ -777,6 +777,27 @@ export class BushClientUtil extends ClientUtil { } /** + * List the symbols of an object. + * @param obj The object to get the symbols of. + * @returns An array of the symbols of the object. + */ + public getSymbols(obj: Record<string, any>): symbol[] { + let symbols: symbol[] = []; + let obj_: Record<string, any> = new Object(obj); + + do { + const l = Object.getOwnPropertySymbols(obj_).sort(); + + symbols = [...symbols, ...l]; + } while ( + (obj_ = Object.getPrototypeOf(obj_)) && // walk-up the prototype chain + Object.getPrototypeOf(obj_) // not the the Object prototype methods (hasOwnProperty, etc...) + ); + + return symbols; + } + + /** * Uploads an image to imgur. * @param image The image to upload. * @returns The url of the imgur. @@ -1052,6 +1073,24 @@ export class BushClientUtil extends ClientUtil { } /** + * Formats an error into a string. + * @param error The error to format. + * @returns The formatted error. + */ + public formatError(error: Error | any): string { + if (!error) return error; + if (typeof error !== 'object') return String.prototype.toString.call(error); + if ( + this.getSymbols(error) + .map((s) => s.toString()) + .includes('Symbol(util.inspect.custom)') + ) + return error.inspect(); + + return error.stack; + } + + /** * A wrapper for the Argument class that adds custom typings. */ public get arg() { diff --git a/src/lib/extensions/discord.js/BushGuildMember.ts b/src/lib/extensions/discord.js/BushGuildMember.ts index 5e9e150..7cc89d2 100644 --- a/src/lib/extensions/discord.js/BushGuildMember.ts +++ b/src/lib/extensions/discord.js/BushGuildMember.ts @@ -373,7 +373,7 @@ export class BushGuildMember extends GuildMember { const muteSuccess = await this.roles .remove(muteRole, `[Unmute] ${moderator.tag} | ${options.reason ?? 'No reason provided.'}`) .catch(async (e) => { - await client.console.warn('muteRoleAddError', e?.stack || e); + await client.console.warn('muteRoleAddError', util.formatError(e)); return false; }); if (!muteSuccess) return unmuteResponse.ACTION_ERROR; diff --git a/src/listeners/commands/commandError.ts b/src/listeners/commands/commandError.ts index d590e06..895cff0 100644 --- a/src/listeners/commands/commandError.ts +++ b/src/listeners/commands/commandError.ts @@ -46,7 +46,7 @@ export default class CommandErrorListener extends BushListener { `${isSlash ? 'slashC' : 'c'}ommandError`, `an error occurred with the <<${command}>> ${isSlash ? 'slash ' : ''}command in <<${channel}>> triggered by <<${ message?.author?.tag - }>>:\n${error?.stack ?? <any>error}`, + }>>:\n${util.formatError(error)})}`, false ); @@ -229,7 +229,7 @@ export default class CommandErrorListener extends BushListener { } public static async getErrorStack(error: Error | any): Promise<string> { - return await util.inspectCleanRedactCodeblock(error?.stack ?? error, 'js'); + return await util.inspectCleanRedactCodeblock(util.formatError(error), 'js'); } } diff --git a/src/listeners/contextCommands/contextCommandError.ts b/src/listeners/contextCommands/contextCommandError.ts index 04a97ad..86cbac8 100644 --- a/src/listeners/contextCommands/contextCommandError.ts +++ b/src/listeners/contextCommands/contextCommandError.ts @@ -44,7 +44,7 @@ export default class ContextCommandErrorListener extends BushListener { `contextCommandError`, `an error occurred with the <<${command}>> context command in <<${channel}>> triggered by <<${ interaction?.user?.tag - }>>:\n${error?.stack ?? <any>error}`, + }>>:\n${util.formatError(error)}`, false ); diff --git a/src/listeners/other/promiseRejection.ts b/src/listeners/other/promiseRejection.ts index 69a62c7..270db46 100644 --- a/src/listeners/other/promiseRejection.ts +++ b/src/listeners/other/promiseRejection.ts @@ -21,11 +21,7 @@ export default class PromiseRejectionListener extends BushListener { level: Severity.Error }); - void client.console.error( - 'promiseRejection', - `An unhanded promise rejection occurred:\n${typeof error == 'object' ? error.stack : error}`, - false - ); + void client.console.error('promiseRejection', `An unhanded promise rejection occurred:\n${util.formatError(error)}`, false); if (!error.message.includes('reason: getaddrinfo ENOTFOUND canary.discord.com')) void client.console.channelError({ embeds: [await CommandErrorListener.generateErrorEmbed({ type: 'unhandledRejection', error: error })] diff --git a/src/listeners/other/uncaughtException.ts b/src/listeners/other/uncaughtException.ts index b650620..b12f76d 100644 --- a/src/listeners/other/uncaughtException.ts +++ b/src/listeners/other/uncaughtException.ts @@ -20,11 +20,7 @@ export default class UncaughtExceptionListener extends BushListener { level: Severity.Error }); - void client.console.error( - 'uncaughtException', - `An uncaught exception occurred:\n${typeof error == 'object' ? error.stack : error}`, - false - ); + void client.console.error('uncaughtException', `An uncaught exception occurred:\n${util.formatError(error)}`, false); void client.console.channelError({ embeds: [await CommandErrorListener.generateErrorEmbed({ type: 'uncaughtException', error: error })] }); diff --git a/src/listeners/other/warning.ts b/src/listeners/other/warning.ts index 57f2a7d..2412221 100644 --- a/src/listeners/other/warning.ts +++ b/src/listeners/other/warning.ts @@ -17,7 +17,7 @@ export default class WarningListener extends BushListener { level: Severity.Warning }); - void client.console.warn('warning', `A warning occurred:\n${typeof error == 'object' ? error.stack : error}`, false); + void client.console.warn('warning', `A warning occurred:\n${util.formatError(error)}`, false); void client.console.channelError({ embeds: [ (await CommandErrorListener.generateErrorEmbed({ type: 'unhandledRejection', error: error })) |