diff options
| -rw-r--r-- | package.json | 27 | ||||
| -rw-r--r-- | src/commands/fun/minesweeper.ts | 2 | ||||
| -rw-r--r-- | src/commands/info/help.ts | 2 | ||||
| -rw-r--r-- | src/commands/moderation/role.ts | 1 | ||||
| -rw-r--r-- | src/lib/common/AutoMod.ts | 175 | ||||
| -rw-r--r-- | src/lib/common/ButtonPaginator.ts | 13 | ||||
| -rw-r--r-- | src/lib/extensions/discord.js/BushMessage.ts | 2 | ||||
| -rw-r--r-- | src/lib/models/Guild.ts | 4 | ||||
| -rw-r--r-- | src/tasks/cpuUsage.ts | 1 | ||||
| -rw-r--r-- | src/tasks/removeExpiredPunishements.ts | 1 | ||||
| -rw-r--r-- | src/tasks/updateCache.ts | 1 | ||||
| -rw-r--r-- | src/tasks/updateStats.ts | 1 | ||||
| -rw-r--r-- | src/tasks/updateSuperUsers.ts | 1 | ||||
| -rw-r--r-- | yarn.lock | 600 |
14 files changed, 499 insertions, 332 deletions
diff --git a/package.json b/package.json index 2676dc5..ee3bf11 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "format:check": "yarn prettier . --check", "upgrade": "yarn rimraf yarn.lock && yarn cache clean && yarn install && yarn up && yarn up -R && yarn set version latest", "upgrade:sdk": "yarn dlx @yarnpkg/sdks vscode", - "upgrade:manual": "yarn add @notenoughupdates/discord.js-minesweeper @notenoughupdates/events-intercept @notenoughupdates/humanize-duration @notenoughupdates/simplify-number @notenoughupdates/wolfram-alpha-api @sentry/node @sentry/tracing canvas chalk discord-akairo@npm:@notenoughupdates/discord-akairo@dev discord.js@npm:@notenoughupdates/discord.js@dev fuse.js got lodash mathjs moment nanoid node-os-utils numeral pg pg-hstore prettier pretty-bytes rimraf sequelize source-map-support tinycolor2 tslib typescript vm2 && yarn add --dev @types/express @types/lodash @types/node @types/node-os-utils @types/numeral @types/tinycolor2 @types/validator @typescript-eslint/eslint-plugin @typescript-eslint/parser discord-api-types@0.24.0 eslint eslint-config-prettier", + "upgrade:manual": "yarn add @notenoughupdates/discord.js-minesweeper @notenoughupdates/events-intercept @notenoughupdates/humanize-duration @notenoughupdates/simplify-number @notenoughupdates/wolfram-alpha-api @sentry/node @sentry/tracing canvas deep-lock chalk discord-akairo@npm:@notenoughupdates/discord-akairo@dev discord.js@npm:@notenoughupdates/discord.js@dev fuse.js got lodash mathjs moment nanoid node-os-utils numeral pg pg-hstore prettier pretty-bytes rimraf sequelize source-map-support tinycolor2 tslib typescript vm2 && yarn add --dev @types/express @types/lodash @types/node @types/node-os-utils @types/numeral @types/tinycolor2 @types/validator @typescript-eslint/eslint-plugin @typescript-eslint/parser discord-api-types@0.24.0 eslint eslint-config-prettier", "upgrade:package": "powershell -c \"yarn info --name-only | %{\\$_ -replace '^(?:├─ |└─ )?(@?[a-z0-9-~][a-z0-9-._~/]{0,}(?=.*(npm:(?!.*dev)|patch:.*?@npm).*))|.*\\$','\\$1'} | where{[string]::IsNullOrEmpty(\\$_) -eq \\$false} | yarn add\"", "beta": "git push && git checkout beta && git merge master && git push && git checkout master", "deploy:beta": "pm2 deploy ecosystem.config.cjs beta", @@ -50,15 +50,15 @@ "@notenoughupdates/humanize-duration": "^4.0.1", "@notenoughupdates/simplify-number": "^1.0.1", "@notenoughupdates/wolfram-alpha-api": "^1.0.1", - "@sentry/node": "^6.15.0", - "@sentry/tracing": "^6.15.0", + "@sentry/node": "^6.16.1", + "@sentry/tracing": "^6.16.1", "canvas": "^2.8.0", - "chalk": "^4.1.2", + "chalk": "^5.0.0", "deep-lock": "^1.0.0", "discord-akairo": "npm:@notenoughupdates/discord-akairo@dev", "discord.js": "npm:@notenoughupdates/discord.js@dev", "fuse.js": "^6.4.6", - "got": "^11.8.3", + "got": "^12.0.0", "lodash": "^4.17.21", "mathjs": "^10.0.0", "moment": "^2.29.1", @@ -67,32 +67,33 @@ "numeral": "^2.0.6", "pg": "^8.7.1", "pg-hstore": "^2.3.4", - "prettier": "^2.5.0", + "prettier": "^2.5.1", "pretty-bytes": "^5.6.0", "rimraf": "^3.0.2", - "sequelize": "^6.12.0-alpha.1", + "sequelize": "^6.12.0-beta.3", "source-map-support": "^0.5.21", "tinycolor2": "^1.4.2", "tslib": "^2.3.1", - "typescript": "^4.5.2", + "typescript": "^4.5.3", "vm2": "^3.9.5" }, "devDependencies": { "@types/eslint": "^8", "@types/express": "^4.17.13", - "@types/lodash": "^4.14.177", - "@types/node": "^16.11.10", + "@types/lodash": "^4.14.178", + "@types/node": "^16.11.12", "@types/node-os-utils": "^1.2.0", "@types/numeral": "^2.0.2", "@types/pg": "^8", + "@types/prettier": "^2", "@types/rimraf": "^3", "@types/source-map-support": "^0", "@types/tinycolor2": "^1.4.3", "@types/validator": "^13.7.0", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", + "@typescript-eslint/eslint-plugin": "^5.6.0", + "@typescript-eslint/parser": "^5.6.0", "discord-api-types": "0.24.0", - "eslint": "^8.3.0", + "eslint": "^8.4.1", "eslint-config-prettier": "^8.3.0" }, "eslintConfig": { diff --git a/src/commands/fun/minesweeper.ts b/src/commands/fun/minesweeper.ts index 7ef1de7..16352ce 100644 --- a/src/commands/fun/minesweeper.ts +++ b/src/commands/fun/minesweeper.ts @@ -1,5 +1,5 @@ import { BushCommand, type BushMessage, type BushSlashMessage } from '#lib'; -import Minesweeper from '@notenoughupdates/discord.js-minesweeper'; +import { Minesweeper } from '@notenoughupdates/discord.js-minesweeper'; export default class MinesweeperCommand extends BushCommand { public constructor() { diff --git a/src/commands/info/help.ts b/src/commands/info/help.ts index 8b6720b..455ad5f 100644 --- a/src/commands/info/help.ts +++ b/src/commands/info/help.ts @@ -139,7 +139,7 @@ export default class HelpCommand extends BushCommand { }) ); } - if (packageDotJSON) + if (packageDotJSON?.repository) row.addComponents( new MessageButton({ style: 'LINK', diff --git a/src/commands/moderation/role.ts b/src/commands/moderation/role.ts index 7ca0a5d..275db38 100644 --- a/src/commands/moderation/role.ts +++ b/src/commands/moderation/role.ts @@ -105,6 +105,7 @@ export default class RoleCommand extends BushCommand { message: BushMessage | BushSlashMessage, args: { action: 'add' | 'remove'; member: BushGuildMember; role: BushRole; duration?: number | null; force?: boolean } ) { + if (!args.role) return await message.util.reply(`${util.emojis.error} You must specify a role.`); if (args.duration === null) args.duration = 0; if ( !message.member!.permissions.has('MANAGE_ROLES') && diff --git a/src/lib/common/AutoMod.ts b/src/lib/common/AutoMod.ts index 5fd5d2d..c52754a 100644 --- a/src/lib/common/AutoMod.ts +++ b/src/lib/common/AutoMod.ts @@ -4,18 +4,36 @@ import badLinksSecretArray from '../badlinks-secret.js'; // I cannot make this p import badLinksArray from '../badlinks.js'; import badWords from '../badwords.js'; +/** + * Handles auto moderation functionality. + */ export class AutoMod { + /** + * The message to check for blacklisted phrases on + */ private message: BushMessage; + /** + * Whether or not a punishment has already been given to the user + */ + private punished = false; + + /** + * @param message The message to check and potentially perform automod actions to + */ public constructor(message: BushMessage) { this.message = message; if (message.author.id === client.user?.id) return; void this.handle(); } + /** + * Handles the auto moderation + */ private async handle() { if (this.message.channel.type === 'DM' || !this.message.guild) return; - if (!(await this.message.guild.hasFeature('automod'))) return; + const hasFeature = this.message.guild.hasFeature; + if (!(await hasFeature('automod'))) return; const customAutomodPhrases = (await this.message.guild.getSetting('autoModPhases')) ?? {}; const badLinks: BadWords = {}; @@ -34,8 +52,8 @@ export class AutoMod { const result = { ...this.checkWords(customAutomodPhrases), - ...this.checkWords((await this.message.guild.hasFeature('excludeDefaultAutomod')) ? {} : badWords), - ...this.checkWords((await this.message.guild.hasFeature('excludeAutomodScamLinks')) ? {} : badLinks) + ...this.checkWords((await hasFeature('excludeDefaultAutomod')) ? {} : badWords), + ...this.checkWords((await hasFeature('excludeAutomodScamLinks')) ? {} : badLinks) }; if (Object.keys(result).length === 0) return; @@ -44,7 +62,7 @@ export class AutoMod { .map(([key, value]) => ({ word: key, ...value })) .sort((a, b) => b.severity - a.severity)[0]; - if (highestOffence.severity === undefined || highestOffence.severity === null) + if (highestOffence.severity === undefined || highestOffence.severity === null) { void this.message.guild.sendLogChannel('error', { embeds: [ { @@ -54,12 +72,19 @@ export class AutoMod { } ] }); - else { + } else { const color = this.punish(highestOffence); void this.log(highestOffence, color, result); } + + if (!this.punished && (await hasFeature('delScamMentions'))) void this.checkScamMentions(); } + /** + * Checks if any of the words provided are in the message + * @param words The words to check for + * @returns The blacklisted words found in the message + */ private checkWords(words: BadWords): BadWords { if (Object.keys(words).length === 0) return {}; @@ -79,17 +104,81 @@ export class AutoMod { return matchedWords; } + /** + * If the message contains '@everyone' or '@here' and it contains a common scam phrase, it will be deleted + * @returns + */ + private async checkScamMentions() { + const includes = this.message.content.toLocaleLowerCase().includes; + if (!includes('@everyone' || !includes('@here'))) return; + // It would be bad if we deleted a message that actually pinged @everyone or @here + if (this.message.member?.permissionsIn(this.message.channelId).has('MENTION_EVERYONE') || this.message.mentions.everyone) + return; + + if ( + includes('steam') || + includes('www.youtube.com') || + includes('youtu.be') || + includes('nitro') || + includes('1 month') || + includes('3 months') || + includes('personalize your profile') || + includes('even more') || + includes('xbox and discord') || + includes('left over') || + includes('check this lol') || + includes('airdrop') + ) { + const color = this.punish({ severity: Severity.TEMP_MUTE, reason: 'everyone mention and scam phrase' } as HighestOffence); + void this.message.guild!.sendLogChannel('automod', { + embeds: [ + new MessageEmbed() + .setTitle(`[Severity ${Severity.TEMP_MUTE}] Mention Scam Deleted`) + .setDescription( + `**User:** ${this.message.author} (${this.message.author.tag})\n**Sent From**: <#${this.message.channel.id}> [Jump to context](${this.message.url})` + ) + .addField('Message Content', `${await util.codeblock(this.message.content, 1024)}`) + .setColor(color) + .setTimestamp() + ], + components: + Severity.TEMP_MUTE >= 2 + ? [ + new MessageActionRow().addComponents( + new MessageButton() + .setStyle('DANGER') + .setLabel('Ban User') + .setCustomId(`automod;ban;${this.message.author.id};everyone mention and scam phrase`) + ) + ] + : undefined + }); + } + } + + /** + * Format a string according to the word options + * @param string The string to format + * @param wordOptions The word options to format with + * @returns The formatted string + */ private format(string: string, wordOptions: BadWordDetails) { const temp = wordOptions.ignoreCapitalization ? string.toLowerCase() : string; return wordOptions.ignoreSpaces ? temp.replace(/ /g, '') : temp; } - private punish(highestOffence: BadWordDetails & { word: string }) { + /** + * Punishes the user based on the severity of the offence + * @param highestOffence The highest offence to punish the user for + * @returns The color of the embed that the log should, based on the severity of the offence + */ + private punish(highestOffence: HighestOffence) { let color; switch (highestOffence.severity) { case Severity.DELETE: { color = util.colors.lightGray; void this.message.delete().catch((e) => deleteError.bind(this, e)); + this.punished = true; break; } case Severity.WARN: { @@ -99,6 +188,7 @@ export class AutoMod { moderator: this.message.guild!.me!, reason: `[AutoMod] ${highestOffence.reason}` }); + this.punished = true; break; } case Severity.TEMP_MUTE: { @@ -109,6 +199,7 @@ export class AutoMod { reason: `[AutoMod] ${highestOffence.reason}`, duration: 900_000 // 15 minutes }); + this.punished = true; break; } case Severity.PERM_MUTE: { @@ -119,6 +210,7 @@ export class AutoMod { reason: `[AutoMod] ${highestOffence.reason}`, duration: 0 // permanent }); + this.punished = true; break; } default: { @@ -142,7 +234,13 @@ export class AutoMod { } } - private async log(highestOffence: BadWordDetails & { word: string }, color: `#${string}`, offences: BadWords) { + /** + * Log an automod infraction to the guild's specified automod log channel + * @param highestOffence The highest severity word found in the message + * @param color The color that the log embed should be (based on the severity) + * @param offences The other offences that were also matched in the message + */ + private async log(highestOffence: HighestOffence, color: `#${string}`, offences: BadWords) { void client.console.info( 'autoMod', `Severity <<${highestOffence.severity}>> action performed on <<${this.message.author.tag}>> (<<${ @@ -150,7 +248,7 @@ export class AutoMod { }>>) in <<#${(this.message.channel as TextChannel).name}>> in <<${this.message.guild!.name}>>` ); - return await this.message.guild!.sendLogChannel('automod', { + await this.message.guild!.sendLogChannel('automod', { embeds: [ new MessageEmbed() .setTitle(`[Severity ${highestOffence.severity}] Automod Action Performed`) @@ -179,6 +277,10 @@ export class AutoMod { }); } + /** + * Handles the ban button in the automod log. + * @param interaction The button interaction. + */ public static async handleInteraction(interaction: BushButtonInteraction) { if (!interaction.memberPermissions?.has('BAN_MEMBERS')) return interaction.reply({ @@ -228,25 +330,74 @@ export class AutoMod { } } +/** + * The severity of the blacklisted word + */ export const enum Severity { - /** Delete message */ + /** + * Delete message + */ DELETE, - /** Delete message and warn user */ + + /** + * Delete message and warn user + */ WARN, - /** Delete message and mute user for 15 minutes */ + + /** + * Delete message and mute user for 15 minutes + */ TEMP_MUTE, - /** Delete message and mute user permanently */ + + /** + * Delete message and mute user permanently + */ PERM_MUTE } +/** + * Details about a blacklisted word + */ interface BadWordDetails { + /** + * The severity of the word + */ severity: Severity; + + /** + * Whether or not to ignore spaces when checking for the word + */ ignoreSpaces: boolean; + + /** + * Whether or not to ignore case when checking for the word + */ ignoreCapitalization: boolean; + + /** + * The reason that this word is blacklisted (used for the punishment reason) + */ reason: string; + + /** + * Whether or not the word is regex + */ regex: boolean; } +interface HighestOffence extends BadWordDetails { + /** + * The word that is blacklisted + */ + word: string; +} + +/** + * Blacklisted words mapped to their details + */ export interface BadWords { + /** + * The blacklisted word + */ [key: string]: BadWordDetails; } diff --git a/src/lib/common/ButtonPaginator.ts b/src/lib/common/ButtonPaginator.ts index b8ae249..983eb56 100644 --- a/src/lib/common/ButtonPaginator.ts +++ b/src/lib/common/ButtonPaginator.ts @@ -18,11 +18,11 @@ export class ButtonPaginator { /** * Sends multiple embeds with controls to switch between them - * @param message - The message to respond to - * @param embeds - The embeds to switch between - * @param text - The text send with the embeds (optional) - * @param deleteOnExit - Whether to delete the message when the exit button is clicked (defaults to true) - * @param startOn - The page to start from (**not** the index) + * @param message The message to respond to + * @param embeds The embeds to switch between + * @param text The text send with the embeds (optional) + * @param deleteOnExit Whether to delete the message when the exit button is clicked (defaults to true) + * @param startOn The page to start from (**not** the index) */ public static async send( message: BushMessage | BushSlashMessage, @@ -37,6 +37,9 @@ export class ButtonPaginator { return await new ButtonPaginator(message, embeds, text, deleteOnExit, startOn).send(); } + /** + * The number of pages in the paginator + */ protected get numPages(): number { return this.embeds.length; } diff --git a/src/lib/extensions/discord.js/BushMessage.ts b/src/lib/extensions/discord.js/BushMessage.ts index c722f3d..9f6d422 100644 --- a/src/lib/extensions/discord.js/BushMessage.ts +++ b/src/lib/extensions/discord.js/BushMessage.ts @@ -18,7 +18,7 @@ export type PartialBushMessage = Partialize< export class BushMessage<Cached extends boolean = boolean> extends Message<Cached> { public declare readonly client: BushClient; public declare util: BushCommandUtil<BushMessage<true>>; - public declare readonly guild: BushGuild | null; + public declare readonly guild: If<Cached, BushGuild>; public declare readonly member: BushGuildMember | null; public declare author: BushUser; public declare readonly channel: If<Cached, BushGuildTextBasedChannel, BushTextBasedChannels>; diff --git a/src/lib/models/Guild.ts b/src/lib/models/Guild.ts index 02f487b..50113bf 100644 --- a/src/lib/models/Guild.ts +++ b/src/lib/models/Guild.ts @@ -280,6 +280,10 @@ export const guildFeaturesObj = asGuildFeature({ name: 'Exclude Automod Scam Links', description: 'Opt out of having automod delete scam links.' }, + delScamMentions: { + name: 'Delete Scam Mentions', + description: 'Deletes messages with @everyone and @here mentions that have common scam phrases.' + }, autoPublish: { name: 'Auto Publish', description: 'Publishes messages in configured announcement channels.' diff --git a/src/tasks/cpuUsage.ts b/src/tasks/cpuUsage.ts index e597b31..882d660 100644 --- a/src/tasks/cpuUsage.ts +++ b/src/tasks/cpuUsage.ts @@ -8,6 +8,7 @@ export default class CpuUsageTask extends BushTask { runOnStart: true }); } + public override async exec() { const cpu = await osu.cpu.usage(client.stats.cpu === undefined ? 100 : 60_000); client.stats.cpu = cpu; diff --git a/src/tasks/removeExpiredPunishements.ts b/src/tasks/removeExpiredPunishements.ts index 6662292..8197cc5 100644 --- a/src/tasks/removeExpiredPunishements.ts +++ b/src/tasks/removeExpiredPunishements.ts @@ -8,6 +8,7 @@ export default class RemoveExpiredPunishmentsTask extends BushTask { runOnStart: true }); } + public override async exec() { const expiredEntries = await ActivePunishment.findAll({ where: { diff --git a/src/tasks/updateCache.ts b/src/tasks/updateCache.ts index 16683f0..8bf92d5 100644 --- a/src/tasks/updateCache.ts +++ b/src/tasks/updateCache.ts @@ -9,6 +9,7 @@ export default class UpdateCacheTask extends BushTask { runOnStart: false // done in preinit task }); } + public override async exec() { await UpdateCacheTask.updateGlobalCache(client); await UpdateCacheTask.#updateGuildCache(client); diff --git a/src/tasks/updateStats.ts b/src/tasks/updateStats.ts index d6cabaa..8813343 100644 --- a/src/tasks/updateStats.ts +++ b/src/tasks/updateStats.ts @@ -8,6 +8,7 @@ export default class UpdateStatsTask extends BushTask { runOnStart: true }); } + public override async exec() { const row = (await Stat.findByPk(client.config.environment)) ?? (await Stat.create({ environment: client.config.environment })); diff --git a/src/tasks/updateSuperUsers.ts b/src/tasks/updateSuperUsers.ts index ffbf550..ba3e90c 100644 --- a/src/tasks/updateSuperUsers.ts +++ b/src/tasks/updateSuperUsers.ts @@ -8,6 +8,7 @@ export default class UpdateSuperUsersTask extends BushTask { runOnStart: true }); } + public override async exec() { const superUsers = client.guilds.cache .get(client.config.supportGuild.id) @@ -14,16 +14,16 @@ __metadata: languageName: node linkType: hard -"@discordjs/builders@npm:^0.8.1": - version: 0.8.2 - resolution: "@discordjs/builders@npm:0.8.2" +"@discordjs/builders@npm:^0.9.0": + version: 0.9.0 + resolution: "@discordjs/builders@npm:0.9.0" dependencies: "@sindresorhus/is": ^4.2.0 discord-api-types: ^0.24.0 - ow: ^0.27.0 ts-mixer: ^6.0.0 tslib: ^2.3.1 - checksum: 6c2f6ee427b0f577ad8b7dd4e4bbaf15c4083385bef983243b9223f68dd7c02715a8fc40aac1b943e667bbba4e262f0c776ae5bc3b0c24bd2faf3eac9c89a58c + zod: ^3.11.6 + checksum: 75278bd4cb2ba09a83e9d308d357e6550fc55af77d7b95d1749ba351d97df80af840144f14f849aa2910966f26a85fcde2271bc1ff5342bbb8ffabe76dd2640c languageName: node linkType: hard @@ -45,20 +45,20 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.0.4": - version: 1.0.4 - resolution: "@eslint/eslintrc@npm:1.0.4" +"@eslint/eslintrc@npm:^1.0.5": + version: 1.0.5 + resolution: "@eslint/eslintrc@npm:1.0.5" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.0.0 + espree: ^9.2.0 globals: ^13.9.0 ignore: ^4.0.6 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.0.4 strip-json-comments: ^3.1.1 - checksum: 570f87e216944830b3761889f14cdf1e9bc7dcc2211e941585cfc2768575954e26852605eb441e21c9581472f89ea0e9cfdb8309523e9fe0a57fe9342bda4fe0 + checksum: b35b50d7b65bd8acd92a05b6fb15ac62c0cefa40dfef0324ca5bf8632bf3679bab6e173c53b3ad1e1d837701cecdbd9c144b35f46588cdf4e046a9caa272488d languageName: node linkType: hard @@ -69,18 +69,18 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.6.0": - version: 0.6.0 - resolution: "@humanwhocodes/config-array@npm:0.6.0" +"@humanwhocodes/config-array@npm:^0.9.2": + version: 0.9.2 + resolution: "@humanwhocodes/config-array@npm:0.9.2" dependencies: - "@humanwhocodes/object-schema": ^1.2.0 + "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.4 - checksum: 1025b07514b7bfd10a05e8b6cb5e6520878e9c8836b3dd0569fc07df29a09e428c2df1e0760b1d461da8ed6f81ca83ecb02e24198f80b0a177a2acbf532e267c + checksum: 28a9e2974c50a86765cb6cc96e03d29187ea33fdaba62c4f35db89002e3cfbd340e64c9f6cf869e33e2e5cdcc06e78763458f4178d38a6f30aea1308787ca706 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.0": +"@humanwhocodes/object-schema@npm:^1.2.1": version: 1.2.1 resolution: "@humanwhocodes/object-schema@npm:1.2.1" checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 @@ -134,13 +134,11 @@ __metadata: linkType: hard "@notenoughupdates/discord.js-minesweeper@npm:^1.0.8": - version: 1.0.8 - resolution: "@notenoughupdates/discord.js-minesweeper@npm:1.0.8" + version: 1.0.9 + resolution: "@notenoughupdates/discord.js-minesweeper@npm:1.0.9" dependencies: - source-map-support: ^0.5.20 - peerDependencies: - tslib: ">=2.3.1" - checksum: d8e086681cb7f883c17b226ffa02f676f5db29a7798fe49328895192e10c3de5a2984cc8ff8e82fd6014eedfedeb50df5beffbe08036dfd9b94506a9f5e47218 + source-map-support: ^0.5.21 + checksum: 26db6af0afdce3395ff363e0699a97949a825a3adb803f1f1dcfed807b2d09eeeb6b671ee42de162202bf8537dd13c23a88469b01d0bdf59c11f763ba664e657 languageName: node linkType: hard @@ -173,12 +171,12 @@ __metadata: linkType: hard "@npmcli/fs@npm:^1.0.0": - version: 1.0.0 - resolution: "@npmcli/fs@npm:1.0.0" + version: 1.1.0 + resolution: "@npmcli/fs@npm:1.1.0" dependencies: "@gar/promisify": ^1.0.1 semver: ^7.3.5 - checksum: f2b4990107dd2a5b18794c89aaff6f62f3a67883d49a20602fdfc353cbc7f8c5fd50edeffdc769e454900e01b8b8e43d0b9eb524d00963d69f3c829be1a2e8ac + checksum: e435b883b4f8da8c95a820f458cabb7d86582406eed5ad79fc689000d3e2df17e1f475c4903627272c001357cabc70d8b4c62520cbdae8cfab1dfdd51949f408 languageName: node linkType: hard @@ -192,108 +190,108 @@ __metadata: languageName: node linkType: hard -"@sapphire/async-queue@npm:^1.1.8": +"@sapphire/async-queue@npm:^1.1.9": version: 1.1.9 resolution: "@sapphire/async-queue@npm:1.1.9" checksum: 8a4cb79e01948ee9f99f47e9fdfdfd509353d267f9e18bb8fe8e813b5d45f1fb6de08297b4557eb9a76b95bea59abaab67819175238068cc4cbc808d1d183e9d languageName: node linkType: hard -"@sentry/core@npm:6.15.0": - version: 6.15.0 - resolution: "@sentry/core@npm:6.15.0" +"@sentry/core@npm:6.16.1": + version: 6.16.1 + resolution: "@sentry/core@npm:6.16.1" dependencies: - "@sentry/hub": 6.15.0 - "@sentry/minimal": 6.15.0 - "@sentry/types": 6.15.0 - "@sentry/utils": 6.15.0 + "@sentry/hub": 6.16.1 + "@sentry/minimal": 6.16.1 + "@sentry/types": 6.16.1 + "@sentry/utils": 6.16.1 tslib: ^1.9.3 - checksum: 6299324cfafc62968a3c063bb4d9c62745230d8e235c3148426ceb6df70bfeee2c250fe38b351e1ab5ca3fa4c9079c3bdce357e756c734c33680c84052f0a129 + checksum: 76f49b270d6acf1b9473822035d7a9a5c191f2df472c5768e01329afbb3f420634792f2a2826cd295982710d39b7c3d53e0c462e1d652451c0ba783c150420d8 languageName: node linkType: hard -"@sentry/hub@npm:6.15.0": - version: 6.15.0 - resolution: "@sentry/hub@npm:6.15.0" +"@sentry/hub@npm:6.16.1": + version: 6.16.1 + resolution: "@sentry/hub@npm:6.16.1" dependencies: - "@sentry/types": 6.15.0 - "@sentry/utils": 6.15.0 + "@sentry/types": 6.16.1 + "@sentry/utils": 6.16.1 tslib: ^1.9.3 - checksum: 6645534f0de5056ea6a15d790f65356bf4085936c220584f78bdd59e81cd1482bff7e9a81a448a17da550e330a1c1b7b56bd11aa6a8533b73760076b6424003e + checksum: 032cd76e9de169ba3ee9683ab4c7603d7e5784fc9d5dc4173d7fedcecc3f9dd07c8ee1b95d250befff5943d1bdb2e9ee4d38c9976b723db959b33c10a1b2aead languageName: node linkType: hard -"@sentry/minimal@npm:6.15.0": - version: 6.15.0 - resolution: "@sentry/minimal@npm:6.15.0" +"@sentry/minimal@npm:6.16.1": + version: 6.16.1 + resolution: "@sentry/minimal@npm:6.16.1" dependencies: - "@sentry/hub": 6.15.0 - "@sentry/types": 6.15.0 + "@sentry/hub": 6.16.1 + "@sentry/types": 6.16.1 tslib: ^1.9.3 - checksum: 98a39f2f2c4b5d0ec63aa034fbd37990c7e456c3db0e0b08d7deefc2d6d6d2353d94ccb1a2e5f4ed6c3e759b0948dcecf57efeaab8b27e0602581deeeca37674 + checksum: c928c94ce76538b8ad81d6e724f4c149b046087a48de60e43933520f6a51ce13abbcbc94f91575aa215e662901c65204344d9185f8afc6d5b449b3bedf85db54 languageName: node linkType: hard -"@sentry/node@npm:^6.15.0": - version: 6.15.0 - resolution: "@sentry/node@npm:6.15.0" +"@sentry/node@npm:^6.16.1": + version: 6.16.1 + resolution: "@sentry/node@npm:6.16.1" dependencies: - "@sentry/core": 6.15.0 - "@sentry/hub": 6.15.0 - "@sentry/tracing": 6.15.0 - "@sentry/types": 6.15.0 - "@sentry/utils": 6.15.0 + "@sentry/core": 6.16.1 + "@sentry/hub": 6.16.1 + "@sentry/tracing": 6.16.1 + "@sentry/types": 6.16.1 + "@sentry/utils": 6.16.1 cookie: ^0.4.1 https-proxy-agent: ^5.0.0 lru_map: ^0.3.3 tslib: ^1.9.3 - checksum: a73f4de9c37c3334e034bc3ba7f21ef4c6424e2ae35585b1c71e8d2a1ea6ac89ca2a4d67e9c839526841ea886846c58b3d7068a9be931abb2eb576b054253870 + checksum: f682f57cb21593432a038a010f8fc8a5885d74ed21e3e8dcd8ab701ab7fb7c2bdfe7a5203b0278cb7b6799c414d7d9e4e0cad532074c18f32295cbae075312dd languageName: node linkType: hard -"@sentry/tracing@npm:6.15.0, @sentry/tracing@npm:^6.15.0": - version: 6.15.0 - resolution: "@sentry/tracing@npm:6.15.0" +"@sentry/tracing@npm:6.16.1, @sentry/tracing@npm:^6.16.1": + version: 6.16.1 + resolution: "@sentry/tracing@npm:6.16.1" dependencies: - "@sentry/hub": 6.15.0 - "@sentry/minimal": 6.15.0 - "@sentry/types": 6.15.0 - "@sentry/utils": 6.15.0 + "@sentry/hub": 6.16.1 + "@sentry/minimal": 6.16.1 + "@sentry/types": 6.16.1 + "@sentry/utils": 6.16.1 tslib: ^1.9.3 - checksum: 63976d6047c7794e340b051ae9d9632b4077073017590a68f04f9e00dc8b35e27d44698fd516c7be74df7fba1fb2425e59092a6f2b5c715a36753abbb4c49c92 + checksum: c6a6f7acbdad9c181a0bec8ddc73a0f891869cef7978ccadccaab0f01b5c2000fe204dcbe2e5728484e1568b738f5aeaebd269c53f3c4db4bfbf83e95e1010d9 languageName: node linkType: hard -"@sentry/types@npm:6.15.0": - version: 6.15.0 - resolution: "@sentry/types@npm:6.15.0" - checksum: e84a53cd8cf4603ac794049729d44f2d67cde3a29875b7404d61d36d904cdb4cd9d35ff53463ba1828ab4a4cbd734cd276ce10d3bb7c32a0ffdea1ac4344fb5f +"@sentry/types@npm:6.16.1": + version: 6.16.1 + resolution: "@sentry/types@npm:6.16.1" + checksum: 994791c471a83b3e9a3c7052b6b2fef3ab404834eaabb61f3dd15b79782ca9cf6774cfb760040bbc06812a8420e8d40681d81a7d4b51ce7ed578d72d97c9a0b8 languageName: node linkType: hard -"@sentry/utils@npm:6.15.0": - version: 6.15.0 - resolution: "@sentry/utils@npm:6.15.0" +"@sentry/utils@npm:6.16.1": + version: 6.16.1 + resolution: "@sentry/utils@npm:6.16.1" dependencies: - "@sentry/types": 6.15.0 + "@sentry/types": 6.16.1 tslib: ^1.9.3 - checksum: 150a7d8b4ed15f2cd04687062e08a62dad18a754ef8c00fcbaebc7816fb80336785aedd3ea3f6e47e7397d5c253177d029961fe98ff8869ceb566fd78cc91f84 + checksum: 6a94b7a4706a28a6f0ccd4b4f9553217d17883974e3edf019f301110957ba592f0c33e653e3f0c79db735631ca87f1c03de8a60a69fd086c3a7cc1f88b7d2be2 languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.0.1, @sindresorhus/is@npm:^4.2.0": +"@sindresorhus/is@npm:^4.2.0": version: 4.2.0 resolution: "@sindresorhus/is@npm:4.2.0" checksum: 59040dfb75c2eb6ab76e8c7ac10b7f7f6ba740f0b5ac618a89a8bcdbaf923836a8e998078d59d81f6f13f4b6bbe15bfe1bca962c877edcbe9160d1c100c56fd7 languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" dependencies: - defer-to-connect: ^2.0.0 - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 + defer-to-connect: ^2.0.1 + checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 languageName: node linkType: hard @@ -314,7 +312,7 @@ __metadata: languageName: node linkType: hard -"@types/cacheable-request@npm:^6.0.1": +"@types/cacheable-request@npm:^6.0.2": version: 6.0.2 resolution: "@types/cacheable-request@npm:6.0.2" dependencies: @@ -345,12 +343,12 @@ __metadata: linkType: hard "@types/eslint@npm:^8": - version: 8.2.0 - resolution: "@types/eslint@npm:8.2.0" + version: 8.2.1 + resolution: "@types/eslint@npm:8.2.1" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 18f37790afc57412c74c9a0ef9a8cc44c1237a3f3d70e3e4e3daad38ed501f1a70395ff3955d3e4b481a5d04e6819ad2c377cd287c7315b3b633f0f1bda7b4a2 + checksum: f32753ba184c212056f2bb7ee16937150a36e01da7eed15e2e179b7df76d0bbcbfa49972f30e9336f22be471c7f67fd91bcc8c25ff532462598de0f489df0cd8 languageName: node linkType: hard @@ -362,13 +360,13 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:^4.17.18": - version: 4.17.25 - resolution: "@types/express-serve-static-core@npm:4.17.25" + version: 4.17.26 + resolution: "@types/express-serve-static-core@npm:4.17.26" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" - checksum: a60d44676db470afd413130ca8b464d864eb2c1a882b1037a52c5b612eebb61bcc4289d927cb09456be56c78bebe3cb24ffeaf0fa11bd7f5237a3ed5360abf3a + checksum: 064080c3c21136f9017e108559602ec5989ce90828d6ede6e3c375e5693a72500b3c06206cdc4a59496ae1ad8af1e282223efb3d79907233fc4811a2cf4d4392 languageName: node linkType: hard @@ -417,10 +415,10 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.177": - version: 4.14.177 - resolution: "@types/lodash@npm:4.14.177" - checksum: 00f9eb300ed5219cfbabb3448d4a71744895edad60dcfda9f028c0808a50eb6ad1ca9f673b56a85f85668a4ea54b9870643625468a747039c435643e52253a75 +"@types/lodash@npm:^4.14.178": + version: 4.14.178 + resolution: "@types/lodash@npm:4.14.178" + checksum: a69a04a60bfc5257c3130a554b4efa0c383f0141b7b3db8ab7cf07ad2a46ea085fce66d0242da41da7e5647b133d5dfb2c15add9cbed8d7fef955e4a1e5b3128 languageName: node linkType: hard @@ -462,10 +460,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^16.11.10": - version: 16.11.10 - resolution: "@types/node@npm:16.11.10" - checksum: 9c79419c5c3d92d5825bffa30f3668533f598d8b63a73ea7fc24e47f162bdbed92b0f8e4f4261cc3314b39cee050e303366d2aa154abc95c63a572a110b8c160 +"@types/node@npm:*, @types/node@npm:^16.11.12": + version: 16.11.12 + resolution: "@types/node@npm:16.11.12" + checksum: a3feb346d61a56f5a137c29bb8c63cfa3cc02e184b9dffdc18ef1528dcce55596e570575215a2e39e6ce69343eeb2a5ba71c271938f1dc8db4cc393902855412 languageName: node linkType: hard @@ -487,6 +485,13 @@ __metadata: languageName: node linkType: hard +"@types/prettier@npm:^2": + version: 2.4.2 + resolution: "@types/prettier@npm:2.4.2" + checksum: 76e230b2d11028af11fe12e09b2d5b10b03738e9abf819ae6ebb0f78cac13d39f860755ce05ac3855b608222518d956 |
