aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json27
-rw-r--r--src/commands/fun/minesweeper.ts2
-rw-r--r--src/commands/info/help.ts2
-rw-r--r--src/commands/moderation/role.ts1
-rw-r--r--src/lib/common/AutoMod.ts175
-rw-r--r--src/lib/common/ButtonPaginator.ts13
-rw-r--r--src/lib/extensions/discord.js/BushMessage.ts2
-rw-r--r--src/lib/models/Guild.ts4
-rw-r--r--src/tasks/cpuUsage.ts1
-rw-r--r--src/tasks/removeExpiredPunishements.ts1
-rw-r--r--src/tasks/updateCache.ts1
-rw-r--r--src/tasks/updateStats.ts1
-rw-r--r--src/tasks/updateSuperUsers.ts1
-rw-r--r--yarn.lock600
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)
diff --git a/yarn.lock b/yarn.lock
index f2a6e15..22a3b8a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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