diff options
25 files changed, 241 insertions, 153 deletions
@@ -1,6 +1,6 @@ <!-- markdownlint-disable-file MD010 MD033 MD041 --> -<a href="https://discord.com/api/oauth2/authorize?client_id=767478359348740148&permissions=2147483647&scope=bot%20applications.commands"><h1 align="center" > BushBot </h1></a> +<a href="https://discord.com/api/oauth2/authorize?client_id=767478359348740148&permissions=5368709119918&scope=bot%20applications.commands"><h1 align="center" > BushBot </h1></a> <div align="center"> <!-- lint --> diff --git a/ecosystem.config.js b/ecosystem.config.js index 95db01c..bcaf56e 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -33,7 +33,7 @@ module.exports = { deploy: { production: { 'user': 'pi', - 'host': '192.168.1.240', + 'host': '192.168.1.210', 'ref': 'origin/master', 'repo': 'https://github.com/NotEnoughUpdates/bush-bot.git', 'path': '/code/bush-bot', @@ -41,7 +41,7 @@ module.exports = { }, beta: { 'user': 'pi', - 'host': '192.168.1.240', + 'host': '192.168.1.210', 'ref': 'origin/beta', 'repo': 'https://github.com/NotEnoughUpdates/bush-bot.git', 'path': '/code/bush-bot-beta', diff --git a/package.json b/package.json index d636695..3dfb25b 100644 --- a/package.json +++ b/package.json @@ -56,9 +56,8 @@ "chalk": "^4.1.1", "common-tags": "^1.8.0", "discord-akairo": "NotEnoughUpdates/discord-akairo", - "discord-akairo-message-util": "NotEnoughUpdates/discord-akairo-message-util", "discord-api-types": "0.22.0", - "discord.js": "NotEnoughUpdates/discord.js", + "discord.js": "npm:@notenoughupdates/discord.js@13.2.0-dev", "discord.js-minesweeper": "^1.0.6", "esbuild": "^0.12.11", "eslint": "^7.29.0", diff --git a/src/commands/config/config.ts b/src/commands/config/config.ts index 6e7373c..3f1fc8c 100644 --- a/src/commands/config/config.ts +++ b/src/commands/config/config.ts @@ -240,10 +240,8 @@ export default class SettingsCommand extends BushCommand { } } const collector = msg.createMessageComponentCollector({ - channel: message.channel ?? undefined, - guild: message.guild, - message: message as Message, - time: 300_000 + time: 300_000, + filter: (i) => i.guildId === message.guildId && i.message.id === message.id }); collector.on('collect', async (interaction: MessageComponentInteraction) => { diff --git a/src/commands/config/features.ts b/src/commands/config/features.ts index 8010ab9..743b243 100644 --- a/src/commands/config/features.ts +++ b/src/commands/config/features.ts @@ -28,11 +28,9 @@ export default class FeaturesCommand extends BushCommand { const components = this.generateComponents(guildFeaturesArr, false); const msg = (await message.util.reply({ embeds: [featureEmbed], components: [components] })) as Message; const collector = msg.createMessageComponentCollector({ - channel: message.channel ?? undefined, - guild: message.guild, componentType: 'SELECT_MENU', - message: message as Message, - time: 300_000 + time: 300_000, + filter: (i) => i.guildId === message.guildId && i.message.id === message.id }); collector.on('collect', async (interaction: SelectMenuInteraction) => { diff --git a/src/commands/info/guildInfo.ts b/src/commands/info/guildInfo.ts index f70b741..f1db783 100644 --- a/src/commands/info/guildInfo.ts +++ b/src/commands/info/guildInfo.ts @@ -105,7 +105,7 @@ export default class GuildInfoCommand extends BushCommand { guildAbout.push( `**Owner:** ${guild.members.cache.get(guild.ownerId)?.user.tag}`, - `**Created** ${guild.createdAt.toLocaleString()} (${util.dateDelta(guild.createdAt)})`, + `**Created** ${util.timestamp(guild.createdAt)} (${util.dateDelta(guild.createdAt)})`, `**Members:** ${guild.memberCount.toLocaleString() ?? 0} (${util.emojis.onlineCircle} ${ guild.approximatePresenceCount?.toLocaleString() ?? 0 }, ${util.emojis.offlineCircle} ${(guild.memberCount - (guild.approximatePresenceCount ?? 0)).toLocaleString() ?? 0})`, diff --git a/src/commands/info/help.ts b/src/commands/info/help.ts index 1338f8a..8c97ba8 100644 --- a/src/commands/info/help.ts +++ b/src/commands/info/help.ts @@ -1,7 +1,6 @@ import { BushCommand, BushMessage, BushSlashMessage } from '@lib'; import { MessageActionRow, MessageButton, MessageEmbed } from 'discord.js'; import packageDotJSON from '../../../package.json'; - export default class HelpCommand extends BushCommand { public constructor() { super('help', { @@ -61,7 +60,7 @@ export default class HelpCommand extends BushCommand { label: 'Invite Me', url: `https://discord.com/api/oauth2/authorize?client_id=${ client.user!.id - }&permissions=2147483647&scope=bot%20applications.commands` + }&permissions=5368709119918&scope=bot%20applications.commands` }) ); } diff --git a/src/commands/info/links.ts b/src/commands/info/links.ts index 29152d9..b3a762a 100644 --- a/src/commands/info/links.ts +++ b/src/commands/info/links.ts @@ -27,7 +27,7 @@ export default class LinksCommand extends BushCommand { label: 'Invite Me', url: `https://discord.com/api/oauth2/authorize?client_id=${ client.user!.id - }&permissions=2147483647&scope=bot%20applications.commands` + }&permissions=5368709119918&scope=bot%20applications.commands` }), new MessageButton({ style: 'LINK', diff --git a/src/commands/info/snowflake.ts b/src/commands/info/snowflake.ts index 8d6129b..df11bce 100644 --- a/src/commands/info/snowflake.ts +++ b/src/commands/info/snowflake.ts @@ -139,7 +139,7 @@ export default class SnowflakeCommand extends BushCommand { const deconstructedSnowflake: DeconstructedSnowflake = SnowflakeUtil.deconstruct(snowflake); const snowflakeInfo = [ `**Timestamp:** ${deconstructedSnowflake.timestamp}`, - `**Created:** ${deconstructedSnowflake.date.toLocaleString()}`, + `**Created:** ${util.timestamp(deconstructedSnowflake.date)}`, `**Worker ID:** ${deconstructedSnowflake.workerId}`, `**Process ID:** ${deconstructedSnowflake.processId}`, `**Increment:** ${deconstructedSnowflake.increment}` diff --git a/src/commands/info/userInfo.ts b/src/commands/info/userInfo.ts index 745dcf0..98ef3ae 100644 --- a/src/commands/info/userInfo.ts +++ b/src/commands/info/userInfo.ts @@ -85,11 +85,11 @@ export default class UserInfoCommand extends BushCommand { else if (member?.permissions.has('ADMINISTRATOR')) emojis.push(client.consts.mappings.otherEmojis.ADMIN); if (member?.premiumSinceTimestamp) emojis.push(client.consts.mappings.otherEmojis.BOOSTER); - const createdAt = user.createdAt.toLocaleString(), + const createdAt = util.timestamp(user.createdAt), createdAtDelta = util.dateDelta(user.createdAt), - joinedAt = member?.joinedAt?.toLocaleString(), + joinedAt = util.timestamp(member?.joinedAt), joinedAtDelta = member && member.joinedAt ? util.dateDelta(member.joinedAt, 2) : undefined, - premiumSince = member?.premiumSince?.toLocaleString(), + premiumSince = util.timestamp(member?.premiumSince), premiumSinceDelta = member && member.premiumSince ? util.dateDelta(member.premiumSince, 2) : undefined; // General Info diff --git a/src/commands/leveling/leaderboard.ts b/src/commands/leveling/leaderboard.ts index 953a6c5..4fb1765 100644 --- a/src/commands/leveling/leaderboard.ts +++ b/src/commands/leveling/leaderboard.ts @@ -41,8 +41,19 @@ export default class LeaderboardCommand extends BushCommand { if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); if (!(await message.guild.hasFeature('leveling'))) return await message.util.reply( - `${util.emojis.error} This command can only be run in commands with the leveling feature enabled.` + `${util.emojis.error} This command can only be run in servers with the leveling feature enabled.${ + message.member?.permissions.has('MANAGE_GUILD') + ? ` You can toggle features using the \`${ + message.util.isSlash + ? '/' + : client.config.isDevelopment + ? 'dev ' + : message.util.parsed?.prefix ?? client.config.prefix + }features\` command.` + : '' + }` ); + const ranks = (await Level.findAll({ where: { guild: message.guild.id } })).sort((a, b) => b.xp - a.xp); const mapedRanks = ranks.map( (val, index) => `\`${index + 1}\` <@${val.user}> - Level ${val.level} (${val.xp.toLocaleString()} xp)` diff --git a/src/commands/leveling/level.ts b/src/commands/leveling/level.ts index f14c005..33ad705 100644 --- a/src/commands/leveling/level.ts +++ b/src/commands/leveling/level.ts @@ -132,7 +132,17 @@ export default class LevelCommand extends BushCommand { if (!message.guild) return await message.util.reply(`${util.emojis.error} This command can only be run in a server.`); if (!(await message.guild.hasFeature('leveling'))) return await message.util.reply( - `${util.emojis.error} This command can only be run in commands with the leveling feature enabled.` + `${util.emojis.error} This command can only be run in servers with the leveling feature enabled.${ + message.member?.permissions.has('MANAGE_GUILD') + ? ` You can toggle features using the \`${ + message.util.isSlash + ? '/' + : client.config.isDevelopment + ? 'dev ' + : message.util.parsed?.prefix ?? client.config.prefix + }features\` command.` + : '' + }` ); const user = args.user ?? message.author; try { diff --git a/src/commands/moderation/modlog.ts b/src/commands/moderation/modlog.ts index d1a3900..c72ff39 100644 --- a/src/commands/moderation/modlog.ts +++ b/src/commands/moderation/modlog.ts @@ -53,7 +53,7 @@ export default class ModlogCommand extends BushCommand { modLog.push(`**Moderator**: <@!${log.moderator}>`); if (log.duration) modLog.push(`**Duration**: ${util.humanizeDuration(log.duration)}`); modLog.push(`**Reason**: ${trim(log.reason ?? 'No Reason Specified.')}`); - modLog.push(`**Date**: ${log.createdAt.toLocaleString()}`); + modLog.push(`**Date**: ${util.timestamp(log.createdAt)}`); if (log.evidence) modLog.push(`**Evidence:** ${trim(log.evidence)}`); return modLog.join(`\n`); } diff --git a/src/commands/moderation/unban.ts b/src/commands/moderation/unban.ts index 5025ede..a319ff9 100644 --- a/src/commands/moderation/unban.ts +++ b/src/commands/moderation/unban.ts @@ -76,7 +76,7 @@ export default class UnbanCommand extends BushCommand { case 'error creating modlog entry': return `${util.emojis.error} While unbanning **${user.tag}**, there was an error creating a modlog entry, please report this to my developers.`; case 'user not banned': - return `${util.emojis.warn} **${user.tag}** but I tried to unban them anyways.`; + return `${util.emojis.warn} **${user.tag}** is not banned but I tried to unban them anyways.`; case 'success': return `${util.emojis.success} Successfully unbanned **${user.tag}**.`; } diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts index 7d84b5e..48ba90d 100644 --- a/src/lib/extensions/discord-akairo/BushClient.ts +++ b/src/lib/extensions/discord-akairo/BushClient.ts @@ -1,4 +1,3 @@ -import chalk from 'chalk'; import { AkairoClient, ContextMenuCommandHandler } from 'discord-akairo'; import { Awaited, @@ -21,7 +20,6 @@ import eventsIntercept from 'events-intercept'; import JSON5 from 'json5'; import 'json5/lib/register'; import path from 'path'; -import { exit } from 'process'; import readline from 'readline'; import { Sequelize } from 'sequelize'; import { abbreviatedNumberTypeCaster } from '../../../arguments/abbreviatedNumber'; @@ -292,7 +290,8 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re dialect: 'postgres', host: this.config.db.host, port: this.config.db.port, - logging: this.config.logging.db ? (sql) => this.logger.debug(sql) : false + logging: this.config.logging.db ? (sql) => this.logger.debug(sql) : false, + timezone: 'America/New_York' }); } @@ -337,9 +336,9 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re inhibitors: this.inhibitorHandler, tasks: this.taskHandler }; - for (const loader of Object.keys(loaders)) { + for (const loader in loaders) { try { - loaders[loader as keyof typeof loaders].loadAll(); + await loaders[loader as keyof typeof loaders].loadAll(); void this.logger.success('startup', `Successfully loaded <<${loader}>>.`, false); } catch (e) { void this.logger.error('startup', `Unable to load loader <<${loader}>> with error:\n${e?.stack || e}`, false); @@ -367,9 +366,10 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re } catch (e) { await this.console.error( 'startup', - `Failed to connect to <<database>> with error:\n${typeof e}` === 'object' ? e?.stack : e, + `Failed to connect to <<database>> with error:\n${util.inspect(e, { colors: true, depth: 1 })}`, false ); + process.exit(2); } } @@ -397,8 +397,7 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re await this.#init(); await this.login(this.token!); } catch (e) { - await this.console.error('start', chalk.red(e?.stack || e), false); - exit(2); + await this.console.error('start', util.inspect(e, { colors: true, depth: 1 }), false); } } diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts index 38e1a06..c15ca1c 100644 --- a/src/lib/extensions/discord-akairo/BushClientUtil.ts +++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts @@ -925,11 +925,12 @@ export class BushClientUtil extends ClientUtil { #mapCredential(old: string): string { const mapping = { - ['token']: 'Main Token', - ['devToken']: 'Dev Token', - ['betaToken']: 'Beta Token', - ['hypixelApiKey']: 'Hypixel Api Key', - ['wolframAlphaAppId']: 'Wolfram|Alpha App ID' + token: 'Main Token', + devToken: 'Dev Token', + betaToken: 'Beta Token', + hypixelApiKey: 'Hypixel Api Key', + wolframAlphaAppId: 'Wolfram|Alpha App ID', + dbPassword: 'Database Password' }; return mapping[old as keyof typeof mapping] || old; } @@ -938,8 +939,10 @@ export class BushClientUtil extends ClientUtil { * Redacts credentials from a string */ public redact(text: string) { - for (const credentialName in client.config.credentials) { - const credential = client.config.credentials[credentialName as keyof typeof client.config.credentials]; + for (const credentialName in { ...client.config.credentials, dbPassword: client.config.db.password }) { + const credential = { ...client.config.credentials, dbPassword: client.config.db.password }[ + credentialName as keyof typeof client.config.credentials + ]; const replacement = this.#mapCredential(credentialName); const escapeRegex = /[.*+?^${}()|[\]\\]/g; text = text.replace(new RegExp(credential.toString().replace(escapeRegex, '\\$&'), 'g'), `[${replacement} Omitted]`); @@ -1182,14 +1185,18 @@ export class BushClientUtil extends ClientUtil { modlog: string; extraInfo?: Snowflake; }): Promise<ActivePunishment | null> { - const expires = options.duration ? new Date(new Date().getTime() + options.duration ?? 0) : undefined; + const expires = options.duration ? new Date(+new Date() + options.duration ?? 0) : undefined; const user = (await util.resolveNonCachedUser(options.user))!.id; const guild = client.guilds.resolveId(options.guild)!; const type = this.#findTypeEnum(options.type)!; - const entry = options.extraInfo - ? ActivePunishment.build({ user, type, guild, expires, modlog: options.modlog, extraInfo: options.extraInfo }) - : ActivePunishment.build({ user, type, guild, expires, modlog: options.modlog }); + console.debug(expires); + + const entry = ActivePunishment.build( + options.extraInfo + ? { user, type, guild, expires, modlog: options.modlog, extraInfo: options.extraInfo } + : { user, type, guild, expires, modlog: options.modlog } + ); return await entry.save().catch(async (e) => { await util.handleError('createPunishmentEntry', e); return null; @@ -1200,6 +1207,7 @@ export class BushClientUtil extends ClientUtil { type: 'mute' | 'ban' | 'role' | 'block'; user: BushGuildMemberResolvable; guild: BushGuildResolvable; + extraInfo?: Snowflake; }): Promise<boolean> { const user = await util.resolveNonCachedUser(options.user); const guild = client.guilds.resolveId(options.guild); @@ -1211,7 +1219,9 @@ export class BushClientUtil extends ClientUtil { const entries = await ActivePunishment.findAll({ // finding all cases of a certain type incase there were duplicates or something - where: { user: user.id, guild: guild, type } + where: options.extraInfo + ? { user: user.id, guild: guild, type, extraInfo: options.extraInfo } + : { user: user.id, guild: guild, type } }).catch(async (e) => { await util.handleError('removePunishmentEntry', e); success = false; @@ -1243,6 +1253,28 @@ export class BushClientUtil extends ClientUtil { else return humanizeDuration(duration, { language: 'en', maxDecimalPoints: 2 }); } + public timestampDuration(duration: number): string { + return `<t:${Math.round(duration / 1000)}:R>`; + } + + /** + * **Styles:** + * - **t**: Short Time + * - **T**: Long Time + * - **d**: Short Date + * - **D**: Long Date + * - **f**: Short Date/Time + * - **F**: Long Date/Time + * - **R**: Relative Time + */ + public timestamp<D extends Date | undefined | null>( + date: D, + style: 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R' = 'f' + ): D extends Date ? string : undefined { + if (!date) return date as unknown as D extends Date ? string : undefined; + return `<t:${Math.round(date.getTime() / 1000)}:${style}>` as unknown as D extends Date ? string : undefined; + } + public dateDelta(date: Date, largest?: number) { return this.humanizeDuration(moment(date).diff(moment()), largest ?? 3); } diff --git a/src/lib/extensions/discord.js/BushClientEvents.d.ts b/src/lib/extensions/discord.js/BushClientEvents.d.ts index 96dc4c5..eb36153 100644 --- a/src/lib/extensions/discord.js/BushClientEvents.d.ts +++ b/src/lib/extensions/discord.js/BushClientEvents.d.ts @@ -85,7 +85,10 @@ export interface BushClientEvents extends ClientEvents { inviteDelete: [invite: Invite]; messageCreate: [message: BushMessage]; messageDelete: [message: BushMessage | PartialBushMessage]; - messageReactionRemoveAll: [message: BushMessage | PartialBushMessage]; + messageReactionRemoveAll: [ + message: BushMessage | PartialBushMessage, + reactions: Collection<string, BushMessageReaction> + ]; messageReactionRemoveEmoji: [ reaction: BushMessageReaction | PartialBushMessageReaction ]; diff --git a/src/lib/extensions/discord.js/BushGuildMember.ts b/src/lib/extensions/discord.js/BushGuildMember.ts index b5bc407..8e855f7 100644 --- a/src/lib/extensions/discord.js/BushGuildMember.ts +++ b/src/lib/extensions/discord.js/BushGuildMember.ts @@ -199,7 +199,7 @@ export class BushGuildMember extends GuildMember { const ret = await (async () => { if (options.addToModlog) { const { log: modlog } = await util.createModLogEntry({ - type: ModLogType.PERM_PUNISHMENT_ROLE, + type: ModLogType.REMOVE_PUNISHMENT_ROLE, guild: this.guild, moderator: moderator.id, user: this, @@ -212,7 +212,8 @@ export class BushGuildMember extends GuildMember { const punishmentEntrySuccess = await util.removePunishmentEntry({ type: 'role', user: this, - guild: this.guild + guild: this.guild, + extraInfo: options.role.id }); if (!punishmentEntrySuccess) return 'error removing role entry'; diff --git a/src/lib/models/ActivePunishment.ts b/src/lib/models/ActivePunishment.ts index f453426..12b0cab 100644 --- a/src/lib/models/ActivePunishment.ts +++ b/src/lib/models/ActivePunishment.ts @@ -131,7 +131,7 @@ export class ActivePunishment } }, extraInfo: { - type: DataTypes.DATE, + type: DataTypes.STRING, allowNull: true }, expires: { diff --git a/src/lib/utils/BushLogger.ts b/src/lib/utils/BushLogger.ts index c2a9989..f00c19c 100644 --- a/src/lib/utils/BushLogger.ts +++ b/src/lib/utils/BushLogger.ts @@ -156,7 +156,7 @@ export class BushLogger { .setDescription(`**[${header}]** ${this.#parseFormatting(this.#stripColor(newContent), '', true)}`) .setColor(util.colors.warn) .setTimestamp(); - await this.channelLog({ embeds: [embed] }); + await this.channelError({ embeds: [embed] }); } /** diff --git a/src/listeners/message/autoThread.ts b/src/listeners/message/autoThread.ts index 04f6bcf..a254337 100644 --- a/src/listeners/message/autoThread.ts +++ b/src/listeners/message/autoThread.ts @@ -6,8 +6,8 @@ import { BushClientEvents } from '../../lib/extensions/discord.js/BushClientEven export default class autoThreadListener extends BushListener { public constructor() { super('autoThread', { - emitter: 'commandHandler', - event: 'messageInvalid', + emitter: 'client', + event: 'messageCreate', category: 'message' }); } @@ -23,6 +23,17 @@ export default class autoThreadListener extends BushListener { message.content.includes('<:yes:822211477624586260>') ) return; + + if ( + (message.content.trim().startsWith(await message.guild.getSetting('prefix')) || + message.content.trim().startsWith(`<@!${client.user!.id}>`) || + message.content.trim().startsWith(`<@${client.user!.id}>`)) && + client.commandHandler.aliases.some((alias) => message.content.includes(alias)) + ) + return; + + if (message.thread) return; + // todo: make these configurable etc... if (message.guild.id !== '516977525906341928') return; // mb if (message.channel.id !== '714332750156660756') return; // neu-support-1 diff --git a/src/listeners/other/promiseRejection.ts b/src/listeners/other/promiseRejection.ts index 130daa3..dc21c3f 100644 --- a/src/listeners/other/promiseRejection.ts +++ b/src/listeners/other/promiseRejection.ts @@ -10,8 +10,11 @@ export default class PromiseRejectionListener extends BushListener { } public override async exec(error: Error): Promise<void> { - // eslint-disable-next-line @typescript-eslint/no-base-to-string - void client.console.error('promiseRejection', `An unhanded promise rejection occurred:\n${error.stack ?? error}`, false); + void client.console.error( + 'promiseRejection', + `An unhanded promise rejection occurred:\n${typeof error == 'object' ? error.stack : 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 47db37f..4ba47bd 100644 --- a/src/listeners/other/uncaughtException.ts +++ b/src/listeners/other/uncaughtException.ts @@ -10,8 +10,11 @@ export default class UncaughtExceptionListener extends BushListener { } public override async exec(error: Error): Promise<void> { - // eslint-disable-next-line @typescript-eslint/no-base-to-string - void client.console.error('uncaughtException', `An uncaught exception occurred:\n${error?.stack ?? error}`, false); + void client.console.error( + 'uncaughtException', + `An uncaught exception occurred:\n${typeof error == 'object' ? error.stack : 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 new file mode 100644 index 0000000..d85e9e3 --- /dev/null +++ b/src/listeners/other/warning.ts @@ -0,0 +1,22 @@ +import { BushListener } from '@lib'; +import CommandErrorListener from '../commands/commandError'; + +export default class WarningListener extends BushListener { + public constructor() { + super('warning', { + emitter: 'process', + event: 'warning' + }); + } + + public override async exec(error: Error): Promise<void> { + void client.console.warn('warning', `A warning occurred:\n${typeof error == 'object' ? error.stack : error}`, false); + void client.console.channelError({ + embeds: [ + (await CommandErrorListener.generateErrorEmbed({ type: 'unhandledRejection', error: error })) + .setColor(util.colors.warn) + .setTitle('A Warning Occurred') + ] + }); + } +} @@ -32,7 +32,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.14.6": +"@babel/runtime@npm:^7.15.4": version: 7.15.4 resolution: "@babel/runtime@npm:7.15.4" dependencies: @@ -214,9 +214,9 @@ __metadata: linkType: hard "@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.0.1": - version: 4.0.1 - resolution: "@sindresorhus/is@npm:4.0.1" - checksum: 92ae3f3d765bd5bc7355852cb9852091ebce6a76bb00eeb37d08e0247b9b3e742eae43ff3753de0c0c00876c526613db6433c9594ae0d17b305b3d6dbeef2514 + version: 4.2.0 + resolution: "@sindresorhus/is@npm:4.2.0" + checksum: 59040dfb75c2eb6ab76e8c7ac10b7f7f6ba740f0b5ac618a89a8bcdbaf923836a8e998078d59d81f6f13f4b6bbe15bfe1bca962c877edcbe9160d1c100c56fd7 languageName: node linkType: hard @@ -328,9 +328,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.172": - version: 4.14.172 - resolution: "@types/lodash@npm:4.14.172" - checksum: 5fc51ea40d7e455bd1c760bcc60c9e81f82d85988666d4d4969bd8311367c63bbf1fe2be48755ba87836710e45fff94014ec164ebe6ccaa72815014981152434 + version: 4.14.173 + resolution: "@types/lodash@npm:4.14.173" + checksum: 9e97ef5816299e5470db1cb32a93e981af60f74f18a35d045ed4caf224a065df96bfae6e444ec96aa392fc01258592b965d840ae042eef77ef719a578c7daef8 languageName: node linkType: hard @@ -366,16 +366,16 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 16.7.13 - resolution: "@types/node@npm:16.7.13" - checksum: 15dc28aa44674d3f49dcca4a6523b6ab1ef9bbea5c659057bec13153e1873718d6b62ab0ea57a3d57ee37f0f1136ae30e3ea503df43b0afa3ae437c8750be7f5 + version: 16.9.2 + resolution: "@types/node@npm:16.9.2" + checksum: 204aa883bc93a267f43804af8872e538935369ab905d5ca702d2c17a213339f8df974bb95d21e2e714e8f83f669b185d8526f7c4b5d16adbdb5d96d4f2e75fa9 languageName: node linkType: hard "@types/node@npm:^14.14.22": - version: 14.17.15 - resolution: "@types/node@npm:14.17.15" - checksum: e0840304db236027e822ef1e149de433afd20d2553699cdc2ce651d107a77646c6eaaeaec8c348eabdc05169440dbc2cf069791bef65ca4b6e5ee4412e69c898 + version: 14.17.17 + resolution: "@types/node@npm:14.17.17" + checksum: ec17a5662e8e4dafbf5c7b577b390811f521ea984525c8fae3b90b14222a61832161c74c9a335abe8ef01a59adba578498298a9ccee0d84d71285680f5bc135a languageName: node linkType: hard @@ -443,11 +443,11 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^4.14.1": - version: 4.31.0 - resolution: "@typescript-eslint/eslint-plugin@npm:4.31.0" + version: 4.31.1 + resolution: "@typescript-eslint/eslint-plugin@npm:4.31.1" dependencies: - "@typescript-eslint/experimental-utils": 4.31.0 - "@typescript-eslint/scope-manager": 4.31.0 + "@typescript-eslint/experimental-utils": 4.31.1 + "@typescript-eslint/scope-manager": 4.31.1 debug: ^4.3.1 functional-red-black-tree: ^1.0.1 regexpp: ^3.1.0 @@ -459,66 +459,66 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 3a285a55d493b427644ab864d36b2abc663b1c2707a0bccb748a56e4e8025275025f8268d70dfea7ca2f82fe54a64de4c5634d4552c72a81d6f17a7ab20d5f87 + checksum: 90bed374dcdb5497a829f6bb02aa2a88dfb74683b0385b433e29a34b03d4b0f2992cd953cee20426c35c2695fb75845824860a77aca12481e9a1f823c4158bf8 languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:4.31.0": - version: 4.31.0 - resolution: "@typescript-eslint/experimental-utils@npm:4.31.0" +"@typescript-eslint/experimental-utils@npm:4.31.1": + version: 4.31.1 + resolution: "@typescript-eslint/experimental-utils@npm:4.31.1" dependencies: "@types/json-schema": ^7.0.7 - "@typescript-eslint/scope-manager": 4.31.0 - "@typescript-eslint/types": 4.31.0 - "@typescript-eslint/typescript-estree": 4.31.0 + "@typescript-eslint/scope-manager": 4.31.1 + "@typescript-eslint/types": 4.31.1 + "@typescript-eslint/typescript-estree": 4.31.1 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 peerDependencies: eslint: "*" - checksum: 24581932c50ae561aa7712ae5966ad962096d7b86efd3c0620080b32ba014fc082394e8475b8e1b5ad5ab19b11383f00dd9469b6b1305913e1eb73182febea6c + checksum: 0767a1a554b78e3a81df28a40d213b0ca8d16e2360e04a377d99fceec4cf6af132953076fe6ed5a07708e6115091d18744a6b4904878e029bb22278e84193f59 languageName: node linkType: hard "@typescript-eslint/parser@npm:^4.14.1": - version: 4.31.0 - resolution: "@typescript-eslint/parser@npm:4.31.0" + version: 4.31.1 + resolution: "@typescript-eslint/parser@npm:4.31.1" dependencies: - "@typescript-eslint/scope-manager": 4.31.0 - "@typescript-eslint/types": 4.31.0 - "@typescript-eslint/typescript-estree": 4.31.0 + "@typescript-eslint/scope-manager": 4.31.1 + "@typescript-eslint/types": 4.31.1 + "@typescript-eslint/typescript-estree": 4.31.1 debug: ^4.3.1 peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 368856dc10ab8ea01f8cd670b48832e20216393a9153b92ee53d4ebba9e1832dfcf1d15b69d76978147f5ac667095bc841eb6211ec71e5a615fbda2a2a689ad4 + checksum: e4e312ec1ef1666fe3ed9cd565f85cc5e11d0a5ae4dff529fc8f212cc758f46ec8ebd388194a57f73ea3250e0ec9040fef8bee32d922d88153c04870683773fa languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:4.31.0": - version: 4.31.0 - resolution: "@typescript-eslint/scope-manager@npm:4.31.0" +"@typescript-eslint/scope-manager@npm:4.31.1": + version: 4.31.1 + resolution: "@typescript-eslint/scope-manager@npm:4.31.1" dependencies: - "@typescript-eslint/types": 4.31.0 - "@typescript-eslint/visitor-keys": 4.31.0 - checksum: d4739d16af4379227711f626142cd656e078c3501082bb78f970ecf83d9332ac2c02b7e6c73b65515c6d4e9f14786fd34fc383056fecbe527fad62b05751782a + "@typescript-eslint/types": 4.31.1 + "@typescript-eslint/visitor-keys": 4.31.1 + checksum: 386442e7713df96cf32565e0f3caff173a9206630f385c1cfa09f11d8b4479a9f51572a4b795e4b68b2740bacebd1bb3a3de5a69bee564bc28dbce4b035ed3fb languageName: node linkType: hard -"@typescript-eslint/types@npm:4.31.0": - version: 4.31.0 - resolution: "@typescript-eslint/types@npm:4.31.0" - checksum: fb6d84efa111b98feaa8b9021b3d225c1d64194fa9b942b9adef39210a4e1ae611aca47b8308dceff7eac847f69474e6926632359180352f5a48f730d827db7c +"@typescript-eslint/types@npm:4.31.1": + version: 4.31.1 + resolution: "@typescript-eslint/types@npm:4.31.1" + checksum: 08b5cf0d02fbf946a4b10e93279e3253287e4826ee744e7d3f38d7da241aaa6fce2743e448f9cdf36d93c20259e17248e50b9fffdff59e1c878289acca0c2d65 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:4.31.0": - version: 4.31.0 - resolution: "@typescript-eslint/typescript-estree@npm:4.31.0" +"@typescript-eslint/typescript-estree@npm:4.31.1": + version: 4.31.1 + resolution: "@typescript-eslint/typescript-estree@npm:4.31.1" dependencies: - "@typescript-eslint/types": 4.31.0 - "@typescript-eslint/visitor-keys": 4.31.0 + "@typescript-eslint/types": 4.31.1 + "@typescript-eslint/visitor-keys": 4.31.1 debug: ^4.3.1 globby: ^11.0.3 is-glob: ^4.0.1 @@ -527,17 +527,17 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 80d226ab93e133acb19061ee140aaeddd4291a4425638c4f451d43474c3d0b23b39ce1cb6302f0b5c74f585a0cd645ca2240f831093d0a160545c8bb25abb0b9 + checksum: 1780223f52fde98fcfef4e7d9a59fc811232f608800e6a69b73789aad34ddf43fc9d4041707baa88b25cf88c223a7f2a749cf084dc45d89de44a803b29e19eb3 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:4.31.0": - version: 4.31.0 - resolution: "@typescript-eslint/visitor-keys@npm:4.31.0" +"@typescript-eslint/visitor-keys@npm:4.31.1": + version: 4.31.1 + resolution: "@typescript-eslint/visitor-keys@npm:4.31.1" dependencies: - "@typescript-eslint/types": 4.31.0 + "@typescript-eslint/types": 4.31.1 eslint-visitor-keys: ^2.0.0 - checksum: 45a929cfedc922b91526f9cec329a36c86bd3dc42ec2f90a3cdac4ab84ab9569b5fd739db05a3678f6979dead694d9aeadff0a81b208458ad41319482abc5b26 + checksum: 14a86bf96a41a81feba32f5acbb72539345a33f250b2f17968dc7b9f4ae9eca00209a11dd208b9c6305f5a841a9f809713027c0ed969465e2d62a042d116bdc9 languageName: node linkType: hard @@ -609,14 +609,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.6.2 - resolution: "ajv@npm:8.6.2" + version: 8.6.3 + resolution: "ajv@npm:8.6.3" dependencies: fast-deep-equal: ^3.1.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 uri-js: ^4.2.2 - checksum: b86d6cb86c69abbd8ce71ab7d4ff272660bf6d34fa9fbe770f73e54da59d531b2546692e36e2b35bbcfb11d20db774b4c09189671335185b8c799d65194e5169 + checksum: 690ffb9408415fdab43686b3f92037ba0c8362f5d0709a123ba3fb546e6ad81414455f80a2b5cc432ce924afe9864671198f022bc331a19c072d4ede152ec3ca languageName: node linkType: hard @@ -642,9 +642,9 @@ __metadata: linkType: hard "ansi-regex@npm:^5.0.0": - version: 5.0.0 - resolution: "ansi-regex@npm:5.0.0" - checksum: b1bb4e992a5d96327bb4f72eaba9f8047f1d808d273ad19d399e266bfcc7fb19a4d1a127a32f7bc61fe46f1a94a4d04ec4c424e3fbe184929aa866323d8ed4ce + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b languageName: node linkType: hard @@ -783,9 +783,8 @@ __metadata: chalk: ^4.1.1 common-tags: ^1.8.0 discord-akairo: NotEnoughUpdates/discord-akairo - discord-akairo-message-util: NotEnoughUpdates/discord-akairo-message-util discord-api-types: 0.22.0 - discord.js: NotEnoughUpdates/discord.js + discord.js: "npm:@notenoughupdates/discord.js@13.2.0-dev" discord.js-minesweeper: ^1.0.6 esbuild: ^0.12.11 eslint: ^7.29.0 @@ -1127,13 +1126,13 @@ discord-akairo-message-util@NotEnoughUpdates/discord-akairo-message-util: linkType: hard discord-akairo@NotEnoughUpdates/discord-akairo: - version: 8.2.2 - resolution: "discord-akairo@https://github.com/NotEnoughUpdates/discord-akairo.git#commit=535a4797ed196c2c3a39b470562aa4ca3f49af61" + version: 9.0.0 + resolution: "discord-akairo@https://github.com/NotEnoughUpdates/discord-akairo.git#commit=be14ce4023cf05ad11f4a0ab87da40af30bb1c6a" dependencies: discord-akairo-message-util: NotEnoughUpdates/discord-akairo-message-util lodash: ^4.17.21 source-map-support: ^0.5.19 - checksum: 5701a9822ad3aae85c095795d9a261a8b981a1f57400e8a30d8a339898c67c8197149dfe8f0165b8149d1edc06fad458176988a8d587f275274d2e1dbc5d248c + checksum: 7326de82d184ce9a68ac6d13d12ca7f844dd12ccf0cc5a29de820ac60d4ce8b0fd46b0134fbd12e5399081dc7360abb2b8c3e2c456d43c8d3db04bc721b07ce6 languageName: node linkType: hard @@ -1151,9 +1150,9 @@ discord-akairo@NotEnoughUpdates/discord-akairo: languageName: node linkType: hard -discord.js@NotEnoughUpdates/discord.js: +"discord.js@npm:@notenoughupdates/discord.js@13.2.0-dev": version: 13.2.0-dev - resolution: "discord.js@https://github.com/NotEnoughUpdates/discord.js.git#commit=e6d983a4b402e2070615fdbe8f02b39dc2721013" + resolution: "@notenoughupdates/discord.js@npm:13.2.0-dev" dependencies: "@discordjs/builders": ^0.5.0 "@discordjs/collection": ^0.2.1 @@ -1163,7 +1162,7 @@ discord.js@NotEnoughUpdates/discord.js: discord-api-types: ^0.22.0 node-fetch: ^2.6.1 ws: ^7.5.1 - checksum: 38235b8743cbfac0b0c256b4164896ffe68a11bd2d127f6664a36ddfc9826edb3d9523d6dbf18fd8e0baf0fde774af02e62d5b271d2d6c62ab8b1ad6b8997a72 + checksum: 1212834ad2ad83f012b7c4dacbbed47494cf49b48616ac6b8f5bc90e8b58657d394ec57312f5a6b8dab2570ba3b432a483aa274c28da5ae3b626fc0c6d71b756 languageName: node linkType: hard @@ -1241,11 +1240,11 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "esbuild@npm:^0.12.11": - version: 0.12.25 - resolution: "esbuild@npm:0.12.25" + version: 0.12.28 + resolution: "esbuild@npm:0.12.28" bin: esbuild: bin/esbuild - checksum: fd92b0541c17e6d863d3b1cf628a35c9844831a1f1f2d16c3091bc7a130a601a8164083b84a65cd3178209e7c395fc61d454f92c8b1a4869d443fd0ca5a51a8d + checksum: 9127dc048aad41a59d736460b9ea3cf5e367a7e5a650b2b465e066ee291e3c5e9fa5ad4b56cd4dea76cde9a1dee25a0e9e94f558b24170fc124eb0778e043eae languageName: node linkType: hard @@ -1477,11 +1476,11 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "fastq@npm:^1.6.0": - version: 1.12.0 - resolution: "fastq@npm:1.12.0" + version: 1.13.0 + resolution: "fastq@npm:1.13.0" dependencies: reusify: ^1.0.4 - checksum: 486db511686b5ab28b1d87170f05c3fa6c8d769cde6861ed34cf3756cdf356950ba9c7dde0bc976ad4308b85aa9ef6214c685887f9f724be72c054a7becb642a + checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b languageName: node linkType: hard @@ -2067,10 +2066,10 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "mathjs@npm:^9.4.4": - version: 9.4.4 - resolution: "mathjs@npm:9.4.4" + version: 9.4.5 + resolution: "mathjs@npm:9.4.5" dependencies: - "@babel/runtime": ^7.14.6 + "@babel/runtime": ^7.15.4 complex.js: ^2.0.15 decimal.js: ^10.3.1 escape-latex: ^1.2.0 @@ -2081,7 +2080,7 @@ discord.js@NotEnoughUpdates/discord.js: typed-function: ^2.0.0 bin: mathjs: bin/cli.js - checksum: 3fdaca4d0e8b73c1e75c87023101d8d047ccec395743c80f24031b7523fc8f2209f8bc572c603d8a8ba4e8b977f240e987f72902e48cce6ff261b3f904fefd5b + checksum: ce29106d5317e864e798ab303ba1ade04ea6c6f3e08c64aed8f3e99e6ad5d5c4012d14ddda953d6735c13d9bcdae7f19301ecf25932a1430d14e6f1d7d481e31 languageName: node linkType: hard @@ -2207,11 +2206,11 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": - version: 3.1.3 - resolution: "minipass@npm:3.1.3" + version: 3.1.5 + resolution: "minipass@npm:3.1.5" dependencies: yallist: ^4.0.0 - checksum: 74b623c1f996caafa66772301b66a1b634b20270f0d1a731ef86195d5a1a5f9984a773a1e88a6cecfd264d6c471c4c0fc8574cd96488f01c8f74c0b600021e55 + checksum: 8b410b9a5bd99ceb9d63c895891d1c30511791fdc7b717da4cf9403ca2419bc57af63b8485ffdaa421ef6cff56f63ae0b2f5135f8df502d21296e8c91460ebf9 languageName: node linkType: hard @@ -2597,11 +2596,11 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "prettier@npm:^2.3.2": - version: 2.3.2 - resolution: "prettier@npm:2.3.2" + version: 2.4.1 + resolution: "prettier@npm:2.4.1" bin: prettier: bin-prettier.js - checksum: 17ce5784ac67621c292df58e2da60b2ee150c2d6aebea22a6ad9e52fcd6a5e66c349d0a8436ea3bd8ff9d778920a5f68000d7625b74f43558718a49755aa5259 + checksum: cc6830588b401b0d742862fe9c46bc9118204fb307c3abe0e49e95b35ed23629573807ffdf9cdd65289c252a0bb51fc0171437f6626ee36378dea80f0ee80b91 languageName: node linkType: hard @@ -2921,9 +2920,9 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "signal-exit@npm:^3.0.0": - version: 3.0.3 - resolution: "signal-exit@npm:3.0.3" - checksum: f0169d3f1263d06df32ca072b0bf33b34c6f8f0341a7a1621558a2444dfbe8f5fec76b35537fcc6f0bc4944bdb5336fe0bdcf41a5422c4e45a1dba3f45475e6c + version: 3.0.4 + resolution: "signal-exit@npm:3.0.4" + checksum: e72633b05df8d65035a0b31718b1a587f55b25953a8e7b959f6c3a963cc0abcb70a0d78a7e0792bc104c874525efdc619e823095d382a775641e3867b1b68c54 languageName: node linkType: hard @@ -2999,12 +2998,12 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard "source-map-support@npm:^0.5.19": - version: 0.5.19 - resolution: "source-map-support@npm:0.5.19" + version: 0.5.20 + resolution: "source-map-support@npm:0.5.20" dependencies: buffer-from: ^1.0.0 source-map: ^0.6.0 - checksum: c72802fdba9cb62b92baef18cc14cc4047608b77f0353e6c36dd993444149a466a2845332c5540d4a6630957254f0f68f4ef5a0120c33d2e83974c51a05afbac + checksum: 43946aff452011960d16154304b11011e0185549493e65dd90da045959409fb2d266ba1c854fff3d5949f8e59382e3fcc7f7c5fa66136007a6750ad06c6c0baa languageName: node linkType: hard @@ -3277,22 +3276,22 @@ discord.js@NotEnoughUpdates/discord.js: linkType: hard typescript@^4.4.2: - version: 4.4.2 - resolution: "typescript@npm:4.4.2" + version: 4.4.3 + resolution: "typescript@npm:4.4.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 194e08e9d1971d667d6fd1a0554616b7022312a2319d70e81a64e502a265992061ee7817ed9a69b52bbabe7a9b85e7938cb8c11c433e40a516b277f8c4dacd51 + checksum: 05823f21796d450531a7e4ab299715d38fd9ded0e4ce7400876053f4b5166ca3dde7a68cecfe72d9086039f03c0b6edba36516fb10ed83c5837d9600532ea4c2 languageName: node linkType: hard "typescript@patch:typescript@^4.4.2#~builtin<compat/typescript>": - version: 4.4.2 - resolution: "typescript@patch:typescript@npm%3A4.4.2#~builtin<compat/typescript>::version=4.4.2&hash=d8b4e7" + version: 4.4.3 + resolution: "typescript@patch:typescript@npm%3A4.4.3#~builtin<compat/typescript>::version=4.4.3&hash=d8b4e7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 11d6ab6e868117908c388401e2ac06d503c5c8709115ab80ee69a1a6352c1f98471d1e595636bfe6a2d6b20b03a44df6bb2d3d198cea97c0c328968cd18d2b70 + checksum: 215a59742afb7e0c3668e2c50ca19813deb24b3cc0d16ac3591990e033728050aaa99e159a72b54cb43653f16c778a5cf9dfeed1f51c3b105710ae082c064af7 languageName: node linkType: hard @@ -3418,8 +3417,8 @@ typescript@^4.4.2: linkType: hard "ws@npm:^7.4.4, ws@npm:^7.5.1": - version: 7.5.4 - resolution: "ws@npm:7.5.4" + version: 7.5.5 + resolution: "ws@npm:7.5.5" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -3428,7 +3427,7 @@ typescript@^4.4.2: optional: true utf-8-validate: optional: true - checksum: 48582e4feb1fc6b6b977a0ee6136e5cd1c6a14bc5cb6ce5acf596652b34be757cdf0c225235b3263d56d057bc5d6e528dbe27fc88a3d09828aa803c6696f4b2c + checksum: bd2b437256012af526c69c03d6670a132e7ab0fe5853f3b7092826acea4203fad4ee2a8d0d9bd44834b2b968e747bf34f753ab535f4a3edf40d262da4b1d0805 languageName: node linkType: hard |