diff --git a/changelog.json b/changelog.json index d73a6be..a40038a 100644 --- a/changelog.json +++ b/changelog.json @@ -3,7 +3,7 @@ "features": [ { "name": "Fully Implemented Slash Commands", - "value": "All commands are in Slash Commands too!" + "value": "The bot now fully uses Slash Commands!" }, { "name": "DMs Support", @@ -11,7 +11,7 @@ }, { "name": "No More Prefix Commands", - "value": "Old prefix commands are now deprecated and will be removed soon. Make sure to use Slash Commands!" + "value": "Old prefix commands have been removed. Make sure to use Slash Commands!" }, { "name": "Command Permissions v2", diff --git a/commands/bot/changelog.js b/commands/bot/changelog.js index 1546314..52ecb93 100644 --- a/commands/bot/changelog.js +++ b/commands/bot/changelog.js @@ -1,10 +1,9 @@ const changelog = require('../../changelog.json'); +const { SlashCommandBuilder } = require('@discordjs/builders'); module.exports = { - name: 'chanqeloq', - description: 'Check the latest version', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'Chanqeloq', url: 'https://github.com/h-projects/gasbot/blob/master/CHANGELOG.md', @@ -15,5 +14,9 @@ module.exports = { fields: changelog.features }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('chanqeloq') + .setDescription('Check the latest version') }; diff --git a/commands/bot/credits.js b/commands/bot/credits.js index 7f2b084..7b97544 100644 --- a/commands/bot/credits.js +++ b/commands/bot/credits.js @@ -1,10 +1,10 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'credits', - description: 'People who helped in the development', - async execute(client, message) { + async execute(client, interaction) { const developers = (await Promise.all(client.config.developers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); const specialThanksUsers = (await Promise.all(client.config.specialThanksUsers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); - message.channel.send({ + interaction.reply({ embeds: [{ title: 'Credits', fields: [ @@ -14,5 +14,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('credits') + .setDescription('People who helped in the development') }; diff --git a/commands/bot/detector.js b/commands/bot/detector.js index 557b8df..1c67baa 100644 --- a/commands/bot/detector.js +++ b/commands/bot/detector.js @@ -1,30 +1,47 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); +const { PermissionFlagsBits } = require('discord-api-types/v10'); + module.exports = { - name: 'detector', - description: 'Manaqe the detection level', - permissions: ['MANAGE_MESSAGES'], - async execute(client, message) { - const level = client.db.prepare('SELECT level FROM guilds WHERE id = ?').get(message.guild.id)?.level ?? 1; + async execute(client, interaction) { + const input = interaction.options.getString('level'); + const database = client.db.prepare('SELECT level FROM guilds WHERE id = ?').get(interaction.guildId); + const statement = database ? 'UPDATE guilds SET level = @level WHERE id = @id' : 'INSERT INTO guilds (id, level) VALUES (@id, @level)'; const levelNames = ['Low', 'Medium', 'Hiqh']; - message.channel.send({ + let description; + let fields = null; + + switch (input) { + case 'low': + description = 'Successfully set detection level to **Low**!'; + client.db.prepare(statement).run({ id: interaction.guildId, level: 0 }); + break; + + case 'medium': + description = 'Successfully set detection level to **Medium**!'; + client.db.prepare(statement).run({ id: interaction.guildId, level: 1 }); + break; + + case 'hiqh': + description = 'Successfully set detection level to **Hiqh**!'; + client.db.prepare(statement).run({ id: interaction.guildId, level: 2 }); + break; + + default: + description = `Your current protection level: **${levelNames[database?.level ?? 1]}**`; + fields = [ + { name: 'Low', value: 'Detects messaqes that only consist of G' }, + { name: 'Medium', value: 'Detects G outside words' }, + { name: 'Hiqh', value: 'Detects a messaqe if it contains G' } + ]; + } + + interaction.reply({ embeds: [{ title: 'G Detector Levels', - description: `Your current protection level: **${levelNames[level]}**`, + description, color: client.config.color, - fields: [ - { - name: 'Low', - value: 'Detects messaqes that only consist of G' - }, - { - name: 'Medium', - value: 'Detects G outside words' - }, - { - name: 'Hiqh', - value: 'Detects a messaqe if it contains G' - } - ] + fields }], components: [{ type: 'ACTION_ROW', @@ -33,22 +50,48 @@ module.exports = { type: 'BUTTON', style: 'SECONDARY', label: 'Low', - customId: `detector:low:${message.author.id}` + customId: `detector:low:${interaction.user.id}`, + disabled: input === 'low' }, { type: 'BUTTON', style: 'SECONDARY', label: 'Medium', - customId: `detector:medium:${message.author.id}` + customId: `detector:medium:${interaction.user.id}`, + disabled: input === 'medium' }, { type: 'BUTTON', style: 'SECONDARY', label: 'Hiqh', - customId: `detector:hiqh:${message.author.id}` + customId: `detector:hiqh:${interaction.user.id}`, + disabled: input === 'hiqh' } ] }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('detector') + .setDescription('Manaqe the detection level') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages) + .setDMPermission(false) + .addStringOption(option => option + .setName('level') + .setDescription('The new detection level') + .setRequired(false) + .addChoices( + { + name: 'Low', + value: 'low' + }, { + name: 'Medium', + value: 'medium' + }, { + name: 'Hiqh', + value: 'hiqh' + } + ) + ) }; diff --git a/commands/bot/g-spy.js b/commands/bot/g-spy.js index 4bc1059..d408944 100644 --- a/commands/bot/g-spy.js +++ b/commands/bot/g-spy.js @@ -1,40 +1,40 @@ -module.exports = { - name: 'g-spy', - description: 'Mark a user as a g-spy', - permissions: ['MANAGE_ROLES'], - botPermissions: ['MANAGE_ROLES'], - async execute(client, message) { - const userId = /\d+/u.exec(message.content)?.toString(); - const member = userId ? await message.guild.members.fetch(userId).catch(() => null) : null; +const { SlashCommandBuilder, ContextMenuCommandBuilder } = require('@discordjs/builders'); +const { PermissionFlagsBits, ApplicationCommandType } = require('discord-api-types/v10'); +module.exports = { + appPermissions: ['MANAGE_ROLES'], + async execute(client, interaction) { + const member = interaction.options.getMember('user'); - if (!member || userId === message.author.id || member.user.bot) { - return message.channel.send({ + if (!member || member.id === interaction.user.id || member.user.bot) { + return interaction.reply({ embeds: [{ title: 'Invalid User', description: 'You need to mention a valid user!', color: client.config.color - }] + }], + ephemeral: true }); } - const role = message.guild.roles.cache.find(r => r.name === 'g-spy') ?? await message.guild.roles.create({ + const role = interaction.guild.roles.cache.find(r => r.name === 'g-spy') ?? await interaction.guild.roles.create({ name: 'g-spy', reason: 'Found a g-spy' }); if (!role.editable) { - return message.channel.send({ + return interaction.reply({ embeds: [{ title: 'Missinq Permissions', description: `Make sure ${role} is lower than my hiqhest role`, color: client.config.color - }] + }], + ephemeral: true }); } member.roles.add(role); - message.channel.send({ + interaction.reply({ embeds: [{ title: 'Done', description: `${member} was marked as a ${role}`, @@ -46,9 +46,26 @@ module.exports = { type: 'BUTTON', style: 'SECONDARY', label: 'Revert', - customId: `g-spy:${member.id}:${message.author.id}` + customId: `g-spy:${member.id}:${interaction.user.id}` }] }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('g-spy') + .setDescription('Mark a user as a g-spy') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles) + .setDMPermission(false) + .addUserOption(option => option + .setName('user') + .setDescription('User to mark as g-spy') + .setRequired(true) + ), + + contextData: new ContextMenuCommandBuilder() + .setName('Mark as G Spy') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles) + .setDMPermission(false) + .setType(ApplicationCommandType.User) }; diff --git a/commands/bot/help.js b/commands/bot/help.js deleted file mode 100644 index 5d0b0f7..0000000 --- a/commands/bot/help.js +++ /dev/null @@ -1,44 +0,0 @@ -module.exports = { - name: 'help', - description: 'Views all commands in the bot', - hidden: true, - async execute(client, message) { - const buttons = [ - { - type: 'BUTTON', - style: 'SECONDARY', - label: 'Bot', - customId: `help:bot:${message.author.id}`, - emoji: '🤖' - }, - { - type: 'BUTTON', - style: 'SECONDARY', - label: 'Fun', - customId: `help:fun:${message.author.id}`, - emoji: '🥳' - } - ]; - - client.config.developers.includes(message.author.id) && buttons.push({ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Dev', - customId: `help:dev:${message.author.id}`, - emoji: '855104541967384616' - }); - - - message.channel.send({ - embeds: [{ - title: '<:gas:896370532751147028> G.A.S Bot Help', - description: 'Press a button to view commands in that cateqory', - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: buttons - }] - }); - } -}; diff --git a/commands/bot/info.js b/commands/bot/info.js index 2fba66e..ad07d0c 100644 --- a/commands/bot/info.js +++ b/commands/bot/info.js @@ -1,14 +1,13 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); const { stripIndents } = require('common-tags'); const { version } = require('discord.js'); const { version: botVersion } = require('../../package.json'); module.exports = { - name: 'info', - description: 'Display information about the bot', - async execute(client, message) { + async execute(client, interaction) { const developers = (await Promise.all(client.config.developers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); await client.application.fetch(); - message.channel.send({ + interaction.reply({ embeds: [{ title: 'Info', color: client.config.color, @@ -41,5 +40,9 @@ module.exports = { } }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('info') + .setDescription('Display information about the bot') }; diff --git a/commands/bot/links.js b/commands/bot/links.js index f49acd7..c9572a5 100644 --- a/commands/bot/links.js +++ b/commands/bot/links.js @@ -1,14 +1,14 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'links', - description: 'Useful bot links', - async execute(client, message) { + async execute(client, interaction) { const nog = '<:nog:676105350306594819>'; const gas = '<:gas:896370532751147028>'; const aytchSoftware = '<:AytchSoftware:720949593696894996>'; await client.application.fetch(); - message.channel.send({ + interaction.reply({ embeds: [{ title: 'Links', fields: [ @@ -32,5 +32,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('links') + .setDescription('Useful bot links') }; diff --git a/commands/bot/logs.js b/commands/bot/logs.js index 44e24ad..04fbe04 100644 --- a/commands/bot/logs.js +++ b/commands/bot/logs.js @@ -1,16 +1,16 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); +const { ChannelType, PermissionFlagsBits } = require('discord-api-types/v10'); + module.exports = { - name: 'loqs', - description: 'Manaqe the loqs channel', - permissions: ['MANAGE_CHANNELS'], - async execute(client, message, args) { - const database = client.db.prepare('SELECT logs FROM guilds WHERE id = ?').get(message.guildId); + async execute(client, interaction) { + const database = client.db.prepare('SELECT logs FROM guilds WHERE id = ?').get(interaction.guildId); const statement = database ? 'UPDATE guilds SET logs = @logs WHERE id = @id' : 'INSERT INTO guilds (id, logs) VALUES (@id, @logs)'; - const channelId = /\d+/u.exec(args.join(' '))?.toString(); + const channel = interaction.options.getChannel('channel'); - if (!channelId) { - const logs = message.guild.channels.cache.get(database?.logs); - return message.channel.send({ + if (!channel) { + const logs = interaction.guild.channels.cache.get(database?.logs); + return interaction.reply({ embeds: [{ title: 'Loqs', description: logs ? `The current loqs channel is ${logs}` : 'You don\'t have a loqs channel set up!', @@ -22,40 +22,40 @@ module.exports = { type: 'BUTTON', style: 'SECONDARY', label: 'Reset', - customId: `loqs::${message.author.id}` + customId: `loqs::${interaction.user.id}` }] }] : null }); } - const channel = message.guild.channels.cache.get(channelId); - - if (channel?.isText() && !channel.isVoice() && !channel.isThread()) { - client.db.prepare(statement).run({ id: message.guildId, logs: channelId }); - return message.channel.send({ - embeds: [{ - title: 'Loqs', - description: `The loqs channel is now ${channel}`, - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Reset', - customId: `loqs::${message.author.id}` - }] - }] - }); - } - - message.channel.send({ + client.db.prepare(statement).run({ id: interaction.guildId, logs: channel.id }); + return interaction.reply({ embeds: [{ title: 'Loqs', - description: 'You need to mention a valid text channel', + description: `The loqs channel is now ${channel}`, color: client.config.color + }], + components: [{ + type: 'ACTION_ROW', + components: [{ + type: 'BUTTON', + style: 'SECONDARY', + label: 'Reset', + customId: `loqs::${interaction.user.id}` + }] }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('loqs') + .setDescription('Manaqe the loqs channel') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageChannels) + .setDMPermission(false) + .addChannelOption(option => option + .setName('channel') + .setDescription('Set loqs channel') + .addChannelTypes(ChannelType.GuildText, ChannelType.GuildNews) + .setRequired(false) + ) }; diff --git a/commands/bot/ping.js b/commands/bot/ping.js index 87cc313..11a3434 100644 --- a/commands/bot/ping.js +++ b/commands/bot/ping.js @@ -1,12 +1,16 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'pinq', - description: 'Display the bot\'s latency', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ color: client.config.color, description: `**Ponq!** ${client.ws.ping}ms` }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('pinq') + .setDescription('Display the bot\'s latency') }; diff --git a/commands/bot/prefix.js b/commands/bot/prefix.js deleted file mode 100644 index 0ef733a..0000000 --- a/commands/bot/prefix.js +++ /dev/null @@ -1,45 +0,0 @@ -const badLetters = require('../../detector/detection.json').join(''); -const detector = RegExp(`[${badLetters}]`, 'giu'); - -module.exports = { - name: 'prefix', - description: 'Manaqe the bot\'s prefix', - async execute(client, message, args) { - const database = client.db.prepare('SELECT prefix FROM guilds WHERE id = ?').get(message.guildId); - const statement = database ? 'UPDATE guilds SET prefix = @prefix WHERE id = @id' : 'INSERT INTO guilds (id, prefix) VALUES (@id, @prefix)'; - - if (!args.length) { - return message.channel.send({ - embeds: [{ - title: 'Prefix', - description: `The current prefix is \`${message.prefix}\``, - color: client.config.color - }] - }); - } - - if (!message.member.permissions.has('MANAGE_MESSAGES')) { - return message.channel.send('You need the `MANAGE_MESSAGES` permission to chanqe the prefix'); - } - - if (args.join(' ').length >= 10 || detector.test(args.join(' '))) { - return message.channel.send({ - embeds: [{ - title: 'Invalid Prefix', - description: 'It must be shorter than 10 characters and it can\'t contain the bad letter', - color: client.config.color - }] - }); - } - - const newPrefix = args.join(' ') === client.config.prefix ? null : args.join(' '); - client.db.prepare(statement).run({ id: message.guildId, prefix: newPrefix }); - message.channel.send({ - embeds: [{ - title: 'Prefix', - description: `Chanqed prefix to \`${args.join(' ')}\``, - color: client.config.color - }] - }); - } -}; diff --git a/commands/bot/removed.js b/commands/bot/removed.js index 4169765..3443027 100644 --- a/commands/bot/removed.js +++ b/commands/bot/removed.js @@ -1,25 +1,27 @@ +const { SlashCommandBuilder, ContextMenuCommandBuilder } = require('@discordjs/builders'); +const { ApplicationCommandType } = require('discord-api-types/v10'); + module.exports = { - name: 'removed', - description: 'Check how many bad letters were removed', - async execute(client, message) { - const userId = /\d+/u.exec(message.content)?.toString(); - const member = userId ? await message.guild.members.fetch(userId).catch(() => null) ?? message.member : message.member; + async execute(client, interaction) { + const member = interaction.options.getMember('user') ?? interaction.member; + const user = interaction.options.getUser('user'); - if (member.user.bot) { - return message.channel.send({ + if (!member && user || member.user.bot) { + return interaction.reply({ embeds: [{ title: 'Invalid User', description: 'You need to mention a valid user!', color: client.config.color - }] + }], + ephemeral: true }); } const { count } = client.db.prepare('SELECT count FROM global_data').get(); const userCount = client.db.prepare('SELECT count FROM users WHERE id = ?').get(member.id)?.count ?? 0; - const guildCount = client.db.prepare('SELECT count FROM guilds WHERE id = ?').get(message.guildId)?.count ?? 0; + const guildCount = client.db.prepare('SELECT count FROM guilds WHERE id = ?').get(interaction.guildId)?.count ?? 0; - message.channel.send({ + interaction.reply({ embeds: [{ title: 'Bad Letters Removed', color: client.config.color, @@ -30,5 +32,20 @@ module.exports = { ] }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('removed') + .setDescription('Check how many bad letters were removed') + .setDMPermission(false) + .addUserOption(option => option + .setName('user') + .setDescription('User to check') + .setRequired(false) + ), + + contextData: new ContextMenuCommandBuilder() + .setName('Removed Count') + .setDMPermission(false) + .setType(ApplicationCommandType.User) }; diff --git a/commands/dev/commands.js b/commands/dev/commands.js deleted file mode 100644 index 2ee4a2c..0000000 --- a/commands/dev/commands.js +++ /dev/null @@ -1,47 +0,0 @@ -module.exports = { - name: 'commands', - description: 'Manaqe the application commands', - async execute(client, message, args) { - if (!client.config.developers.includes(message.author.id)) { - return; - } - - const [ action, ...json ] = args; - await client.application.commands.fetch(); - - let response; - try { - switch (action) { - case 'find': - response = client.application.commands.cache.find(c => c.name === args[1])?.id; - break; - - case 'edit': - response = await client.application.commands.cache.get(json.shift()).edit(JSON.parse(json.join(' '))).catch(err => err); - break; - - case 'create': - response = await client.application.commands.create(JSON.parse(json.join(' '))).catch(err => err); - break; - - case 'set': - response = await client.application.commands.set(JSON.parse(json.join(' '))).catch(err => err); - break; - - case 'delete': - response = await client.application.commands.cache.get(args[1]).delete().catch(err => err); - break; - } - } catch (e) { - response = e; - } - - message.channel.send({ - embeds: [{ - title: 'Application Commands Manaqer', - description: `\`\`\`js\n${response}\`\`\``, - color: client.config.color - }] - }); - } -}; diff --git a/interactions/commands/dev/deploy-dev.js b/commands/dev/deploy-dev.js similarity index 94% rename from interactions/commands/dev/deploy-dev.js rename to commands/dev/deploy-dev.js index c67e216..cb84ac3 100644 --- a/interactions/commands/dev/deploy-dev.js +++ b/commands/dev/deploy-dev.js @@ -7,7 +7,7 @@ module.exports = { const guildId = interaction.options.getString('guild'); const create = interaction.options.getBoolean('create') ?? true; - client.interactions.commands.filter(c => c.category === 'dev').forEach(command => { + client.commands.filter(c => c.category === 'dev').forEach(command => { commands.push(command.data.toJSON()); if (command.contextData) { diff --git a/commands/dev/sql.js b/commands/dev/sql.js index 8a0de4e..7792048 100644 --- a/commands/dev/sql.js +++ b/commands/dev/sql.js @@ -1,47 +1,63 @@ -module.exports = { - name: 'sql', - description: 'Execute SQLite statements', - - async execute(client, message, args) { - if (!client.config.developers.includes(message.author.id) || message.content.toUpperCase().includes('DROP')) { - return; - } +const { SlashCommandBuilder } = require('@discordjs/builders'); +const { inspect } = require('util'); - const [ action, ...statement ] = args; +module.exports = { + async execute(client, interaction) { + const method = interaction.options.getString('method'); + const query = interaction.options.getString('query'); - if (action === 'backup') { + if (method === 'backup') { await client.db.backup(`./backup/backup-${Date.now()}.sqlite3`); - return message.channel.send({ + return interaction.reply({ embeds: [{ title: 'SQL', description: 'Backup complete', color: client.config.color - }] + }], + ephemeral: true }); } - let db; - let error; try { - db = client.db.prepare(statement.join(' ')); - } catch (err) { - error = err; - } - - let result; - if (action === 'get') { - result = db?.get(); + const db = client.db.prepare(query); + const result = method === 'run' ? db?.run() : db.get(); + interaction.reply({ + embeds: [{ + title: 'SQL', + description: `\`\`\`js\n${inspect(result, { depth: 2 })}\`\`\``, + color: client.config.color + }], + ephemeral: true + }); + } catch (error) { + interaction.reply({ + embeds: [{ + title: 'SQL', + description: `\`\`\`js\n${error}\`\`\``, + color: client.config.color + }], + ephemeral: true + }); } + }, - if (action === 'run') { - result = db?.run(); - } - message.channel.send({ - embeds: [{ - title: 'SQL', - description: `\`\`\`js\n${result ? JSON.stringify(result) : error}\`\`\``, - color: client.config.color - }] - }); - } + data: new SlashCommandBuilder() + .setName('sql') + .setDescription('Execute SQL statements') + .addStringOption(option => option + .setName('method') + .setDescription('Method to use') + .setRequired(true) + .addChoices({ + name: 'Backup', value: 'backup' + }, { + name: 'Get', value: 'get' + }, { + name: 'Run', value: 'run' + }) + ) + .addStringOption(option => option + .setName('query') + .setDescription('Query to execute') + .setRequired(false)) }; diff --git a/commands/fun/h.js b/commands/fun/h.js index fe1c3ba..994197b 100644 --- a/commands/fun/h.js +++ b/commands/fun/h.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'h', - description: 'h', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'h', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('h') + .setDescription('h') }; diff --git a/commands/fun/hromomento.js b/commands/fun/hromomento.js index ac0aae6..e8fe66f 100644 --- a/commands/fun/hromomento.js +++ b/commands/fun/hromomento.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'hromomento', - description: 'aqui tenemos un qran bro momento', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'hro momento', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('hromomento') + .setDescription('aqui tenemos un qran bro momento') }; diff --git a/commands/fun/huh.js b/commands/fun/huh.js index a204790..a60e8f1 100644 --- a/commands/fun/huh.js +++ b/commands/fun/huh.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'huh', - description: '<:thinkinH:805862278766395483>', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'huh', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('huh') + .setDescription(':thinkinq_h:') }; diff --git a/commands/fun/juan.js b/commands/fun/juan.js index 6c28915..e92020c 100644 --- a/commands/fun/juan.js +++ b/commands/fun/juan.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'juan', - description: '<:Juan:773465802682138634>', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'Juan', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('juan') + .setDescription('🐴') }; diff --git a/commands/fun/meme.js b/commands/fun/meme.js index b4c766b..9154c2f 100644 --- a/commands/fun/meme.js +++ b/commands/fun/meme.js @@ -1,3 +1,4 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); const Snoowrap = require('snoowrap'); const reddit = new Snoowrap({ userAgent: 'gasbot', @@ -7,19 +8,16 @@ const reddit = new Snoowrap({ }); module.exports = { - name: 'meme', - description: 'Displays a meme from Reddit', - - async execute(client, message) { - const subreddits = ['memes', 'dankmemes', 'comedynecrophilia', 'theletterh', 'okbuddyretard', '196', 'comedyheaven']; + async execute(client, interaction) { + const subreddits = ['memes', 'dankmemes', 'comedynecrophilia', 'theletterh', 'okbuddyretard', '196', 'me_irl']; const randomSubreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; const listing = (await reddit.getHot(randomSubreddit)).filter(p => !p.over_18 && p.is_reddit_media_domain && !p.is_video); const post = listing[Math.floor(Math.random() * listing.length)]; - message.channel.send({ + interaction.reply({ embeds: [{ - title: post.title.replaceAll(/g/giu, 'q'), + title: post.title.replaceAll('g', 'q').replaceAll('G', 'Q'), url: `https://reddit.com${post.permalink}`, image: post.preview.images[0].variants.gif?.source ?? post.preview.images[0].source, author: { @@ -30,7 +28,20 @@ module.exports = { }, timestamp: post.created * 1000, color: client.config.color + }], + components: [{ + type: 'ACTION_ROW', + components: [{ + type: 'BUTTON', + style: 'SECONDARY', + label: 'Refresh', + customId: `meme::${interaction.user.id}` + }] }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('meme') + .setDescription('Displays a extremely funny hilarious meme from Reddit') }; diff --git a/commands/fun/tank.js b/commands/fun/tank.js index 31eeca3..d05f7d8 100644 --- a/commands/fun/tank.js +++ b/commands/fun/tank.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'tank', - description: 'aden said <:nog:676105350306594819>, use this', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'THE ULTIMATE G DESTROYER', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('tank') + .setDescription('aden said the bad letter, use this') }; diff --git a/commands/fun/toilet.js b/commands/fun/toilet.js index ee2aad2..419ecb2 100644 --- a/commands/fun/toilet.js +++ b/commands/fun/toilet.js @@ -1,8 +1,8 @@ +const { SlashCommandBuilder } = require('@discordjs/builders'); + module.exports = { - name: 'toilet', - description: 'polish toilet', - async execute(client, message) { - message.channel.send({ + async execute(client, interaction) { + interaction.reply({ embeds: [{ title: 'polish toilet', image: { @@ -11,5 +11,9 @@ module.exports = { color: client.config.color }] }); - } + }, + + data: new SlashCommandBuilder() + .setName('toilet') + .setDescription('polish toilet') }; diff --git a/interactions/components/detector.js b/components/detector.js similarity index 100% rename from interactions/components/detector.js rename to components/detector.js diff --git a/interactions/components/g-spy.js b/components/g-spy.js similarity index 96% rename from interactions/components/g-spy.js rename to components/g-spy.js index abad7d2..7971619 100644 --- a/interactions/components/g-spy.js +++ b/components/g-spy.js @@ -1,6 +1,6 @@ module.exports = { name: 'g-spy', - botPermissions: ['MANAGE_ROLES'], + appPermissions: ['MANAGE_ROLES'], async execute(client, interaction) { const member = await interaction.guild.members.fetch(interaction.value).catch(() => null); const role = interaction.guild.roles.cache.find(r => r.name === 'g-spy'); diff --git a/interactions/components/help.js b/components/help.js similarity index 91% rename from interactions/components/help.js rename to components/help.js index 32fe6a9..19a326a 100644 --- a/interactions/components/help.js +++ b/components/help.js @@ -1,7 +1,7 @@ module.exports = { name: 'help', async execute(client, interaction) { - const category = client.interactions.commands.filter(command => command.category === interaction.value && !command.hidden); + const category = client.commands.filter(command => command.category === interaction.value && !command.hidden); const fields = category.map(command => ({ name: `\`/${command.data.name}\``, diff --git a/interactions/components/logs.js b/components/logs.js similarity index 100% rename from interactions/components/logs.js rename to components/logs.js diff --git a/interactions/components/meme.js b/components/meme.js similarity index 89% rename from interactions/components/meme.js rename to components/meme.js index c7f2de3..f71295a 100644 --- a/interactions/components/meme.js +++ b/components/meme.js @@ -10,7 +10,7 @@ module.exports = { name: 'meme', async execute(client, interaction) { - const subreddits = ['memes', 'dankmemes', 'comedynecrophilia', 'theletterh', 'okbuddyretard', '196', 'comedyheaven']; + const subreddits = ['memes', 'dankmemes', 'comedynecrophilia', 'theletterh', 'okbuddyretard', '196', 'me_irl']; const randomSubreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; const listing = (await reddit.getHot(randomSubreddit)).filter(p => !p.over_18 && p.is_reddit_media_domain && !p.is_video); @@ -18,7 +18,7 @@ module.exports = { interaction.update({ embeds: [{ - title: post.title.replaceAll(/g/giu, 'q'), + title: post.title.replaceAll('g', 'q').replaceAll('G', 'Q'), url: `https://reddit.com${post.permalink}`, image: post.preview.images[0].variants.gif?.source ?? post.preview.images[0].source, author: { diff --git a/detector/index.js b/detector/index.js index 781fb5e..803813c 100644 --- a/detector/index.js +++ b/detector/index.js @@ -12,7 +12,7 @@ module.exports = async (client, message, database, edited) => { } } - if (!detect(message.content.replaceAll('.', ''))) { + if (!detect(message.content.replaceAll(/[.,]/gu, ''))) { return; } diff --git a/events/guildCreate.js b/events/guildCreate.js index ce17652..b85625b 100644 --- a/events/guildCreate.js +++ b/events/guildCreate.js @@ -1,6 +1,5 @@ module.exports = { name: 'guildCreate', - once: false, async execute(guild, client) { if (!guild.available) { return; diff --git a/events/guildDelete.js b/events/guildDelete.js index c622a34..b9283a5 100644 --- a/events/guildDelete.js +++ b/events/guildDelete.js @@ -1,6 +1,5 @@ module.exports = { name: 'guildDelete', - once: false, async execute(guild, client) { if (!guild.available) { return; diff --git a/events/guildMemberUpdate.js b/events/guildMemberUpdate.js index ed35aaf..b59b06a 100644 --- a/events/guildMemberUpdate.js +++ b/events/guildMemberUpdate.js @@ -5,7 +5,6 @@ const log = require('../detector/logger'); module.exports = { name: 'guildMemberUpdate', - once: false, async execute(oldMember, newMember, client) { if (newMember.partial) { await newMember.fetch(); diff --git a/events/interactionCreate.js b/events/interactionCreate.js index 0b0f6f6..d24b2e4 100644 --- a/events/interactionCreate.js +++ b/events/interactionCreate.js @@ -1,6 +1,5 @@ module.exports = { name: 'interactionCreate', - once: false, async execute(interaction, client) { if (interaction.inRawGuild()) { return interaction.reply({ @@ -11,15 +10,15 @@ module.exports = { if (interaction.isApplicationCommand()) { const name = interaction.commandName; - const command = client.interactions.commands.get(name) ?? client.interactions.commands.find(c => c.contextData?.name === name); + const command = client.commands.get(name) ?? client.commands.find(c => c.contextData?.name === name); if (!command) return; - if (interaction.guild && !interaction.guild.me.permissions.has(command.botPermissions ?? 0n)) { + if (interaction.guild && !interaction.appPermissions.has(command.appPermissions ?? 0n)) { return interaction.reply({ embeds: [{ title: 'Missinq Permissions', - description: `I need the \`${command.botPermissions}\` permission to use this command`, + description: `I need the \`${command.appPermissions}\` permission to use this command`, color: client.config.color }], ephemeral: true @@ -35,17 +34,17 @@ module.exports = { if (interaction.isMessageComponent()) { [interaction.name, interaction.value, interaction.author] = interaction.customId.split(':'); - const component = client.interactions.components.get(interaction.name); + const component = client.components.get(interaction.name); if (!component || interaction.author !== interaction.user.id) { return interaction.deferUpdate(); } - if (interaction.guild && !interaction.guild.me.permissions.has(component.botPermissions ?? 0n)) { + if (interaction.guild && !interaction.appPermissions.has(component.appPermissions ?? 0n)) { return interaction.reply({ embeds: [{ title: 'Missinq Permissions', - description: `I need the \`${component.botPermissions}\` permission to use this component`, + description: `I need the \`${component.appPermissions}\` permission to use this component`, color: client.config.color }], ephemeral: true diff --git a/events/messageCreate.js b/events/messageCreate.js index 85bb7c3..116d3e7 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -1,78 +1,29 @@ const detect = require('../detector'); -const { stripIndents } = require('common-tags'); module.exports = { name: 'messageCreate', - once: false, async execute(message, client) { const { author, type } = message; if (author.bot || author.system || type !== 'DEFAULT' && type !== 'REPLY' || !message.content || !message.channel.permissionsFor(client.user).has('SEND_MESSAGES')) { return; } const database = client.db.prepare('SELECT * FROM guilds WHERE id = ?').get(message.guildId); - message.prefix = database?.prefix ?? client.config.prefix; - const array = message.content.replace(message.prefix, '').split(' '); - const args = array.slice(1); - - if (message.content === `<@${client.user.id}>` || message.content === `<@!${client.user.id}>`) { - return message.channel.send({ - embeds: [{ - title: 'Prefix', - description: `My prefix is \`/\` but you can also use \`${message.prefix}\``, - color: client.config.color - }] - }); + if (message.content === `<@${client.user.id}>`) { + return message.channel.send('Hi! Type `/` to see my commands'); } - if (!message.content.startsWith(message.prefix)) { - await detect(client, message, database); - return; - } + const prefix = database?.prefix ?? client.config.prefix; + const [commandName] = message.content.slice(prefix.length).split(' '); - if (!client.commands.has(array[0])) { - return; - } - - const command = client.commands.get(array[0]); - if (!message.member.permissions.has(command.permissions ?? 0n)) { - return message.channel.send(`You need the \`${command.permissions}\` permission to use this command`); - } - - if (!message.guild.me.permissions.has(command.botPermissions ?? 0n)) { - return message.channel.send({ - embeds: [{ - title: 'Missinq Permissions', - description: `I need the \`${command.botPermissions}\` permission to use this command`, - color: client.config.color - }] - }); - } + if (message.content.startsWith(prefix) && client.commands.has(commandName) && client.commands.get(commandName).category !== 'dev') { + const commands = client.application.commands.cache.length ? client.application.commands.cache : await client.application.commands.fetch(); + const command = commands.find(c => c.name === commandName); + const mention = command ? ` c.name === commandName).id}>` : `/${commandName}`; - const chance = 10; - if (Math.floor(Math.random() * chance) + 1 === 1) { - message.channel.send({ - embeds: [{ - title: 'Switch to Slash Commands', - description: stripIndents` - <:slash_command:954763657861033994> G.A.S Bot now has [Slash Commands](https://support.discord.com/hc/articles/1500000368501)! - Due to Discord chanqes, Slash Commands will be required startinq , and text-based commands like the one you just ran will stop workinq. - `, - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'LINK', - label: 'Support Server', - url: client.config.support, - emoji: '<:AytchSoftware:720949593696894996>' - }] - }] - }); + return message.channel.send(`Prefix-based commands are no lonqer supported, use ${mention} instead!`); } - command.execute(client, message, args); + await detect(client, message, database); } }; diff --git a/events/messageReactionAdd.js b/events/messageReactionAdd.js index 097329f..9776624 100644 --- a/events/messageReactionAdd.js +++ b/events/messageReactionAdd.js @@ -3,7 +3,6 @@ const log = require('../detector/logger'); module.exports = { name: 'messageReactionAdd', - once: false, async execute(reaction, user, client) { if (reaction.partial) { try { diff --git a/events/messageUpdate.js b/events/messageUpdate.js index bbfe0ea..cb43677 100644 --- a/events/messageUpdate.js +++ b/events/messageUpdate.js @@ -2,7 +2,6 @@ const detect = require('../detector'); module.exports = { name: 'messageUpdate', - once: false, async execute(oldMessage, newMessage, client) { if (newMessage.partial) { try { diff --git a/events/ready.js b/events/ready.js index 6fc21c2..8aa6dd2 100644 --- a/events/ready.js +++ b/events/ready.js @@ -2,13 +2,12 @@ const { Routes } = require('discord-api-types/v10'); module.exports = { name: 'ready', - once: true, async execute(client) { const commands = []; const devCommands = []; if (process.argv[2] !== 'deploy') return console.log('Ready!'); - client.interactions.commands.forEach(command => { + client.commands.forEach(command => { command.category === 'dev' ? devCommands.push(command.data.toJSON()) : commands.push(command.data.toJSON()); diff --git a/index.js b/index.js index eb04a5b..f9b7193 100644 --- a/index.js +++ b/index.js @@ -10,7 +10,7 @@ const client = new Client({ partials: ['MESSAGE', 'REACTION', 'USER', 'GUILD_MEMBER'], allowedMentions: { parse: ['users'], repliedUser: false }, presence: { - activities: [{ name: '/help | Removinq G!', type: 'PLAYING' }], + activities: [{ name: '/h | Removinq G!', type: 'PLAYING' }], status: 'dnd' } }); diff --git a/interactions/commands/bot/changelog.js b/interactions/commands/bot/changelog.js deleted file mode 100644 index 16ba599..0000000 --- a/interactions/commands/bot/changelog.js +++ /dev/null @@ -1,22 +0,0 @@ -const changelog = require('../../../changelog.json'); -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'Chanqeloq', - url: 'https://github.com/h-projects/gasbot/blob/master/CHANGELOG.md', - author: { - name: changelog.version - }, - color: client.config.color, - fields: changelog.features - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('chanqeloq') - .setDescription('Check the latest version') -}; diff --git a/interactions/commands/bot/credits.js b/interactions/commands/bot/credits.js deleted file mode 100644 index 7b97544..0000000 --- a/interactions/commands/bot/credits.js +++ /dev/null @@ -1,22 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - const developers = (await Promise.all(client.config.developers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); - const specialThanksUsers = (await Promise.all(client.config.specialThanksUsers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); - interaction.reply({ - embeds: [{ - title: 'Credits', - fields: [ - { name: '<:VerifiedBotDev:764412852395180032> Developers', value: developers, inline: true }, - { name: '⭐ Special Thanks', value: specialThanksUsers, inline: true } - ], - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('credits') - .setDescription('People who helped in the development') -}; diff --git a/interactions/commands/bot/detector.js b/interactions/commands/bot/detector.js deleted file mode 100644 index 1c67baa..0000000 --- a/interactions/commands/bot/detector.js +++ /dev/null @@ -1,97 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { PermissionFlagsBits } = require('discord-api-types/v10'); - -module.exports = { - async execute(client, interaction) { - const input = interaction.options.getString('level'); - const database = client.db.prepare('SELECT level FROM guilds WHERE id = ?').get(interaction.guildId); - const statement = database ? 'UPDATE guilds SET level = @level WHERE id = @id' : 'INSERT INTO guilds (id, level) VALUES (@id, @level)'; - const levelNames = ['Low', 'Medium', 'Hiqh']; - - let description; - let fields = null; - - switch (input) { - case 'low': - description = 'Successfully set detection level to **Low**!'; - client.db.prepare(statement).run({ id: interaction.guildId, level: 0 }); - break; - - case 'medium': - description = 'Successfully set detection level to **Medium**!'; - client.db.prepare(statement).run({ id: interaction.guildId, level: 1 }); - break; - - case 'hiqh': - description = 'Successfully set detection level to **Hiqh**!'; - client.db.prepare(statement).run({ id: interaction.guildId, level: 2 }); - break; - - default: - description = `Your current protection level: **${levelNames[database?.level ?? 1]}**`; - fields = [ - { name: 'Low', value: 'Detects messaqes that only consist of G' }, - { name: 'Medium', value: 'Detects G outside words' }, - { name: 'Hiqh', value: 'Detects a messaqe if it contains G' } - ]; - } - - interaction.reply({ - embeds: [{ - title: 'G Detector Levels', - description, - color: client.config.color, - fields - }], - components: [{ - type: 'ACTION_ROW', - components: [ - { - type: 'BUTTON', - style: 'SECONDARY', - label: 'Low', - customId: `detector:low:${interaction.user.id}`, - disabled: input === 'low' - }, - { - type: 'BUTTON', - style: 'SECONDARY', - label: 'Medium', - customId: `detector:medium:${interaction.user.id}`, - disabled: input === 'medium' - }, - { - type: 'BUTTON', - style: 'SECONDARY', - label: 'Hiqh', - customId: `detector:hiqh:${interaction.user.id}`, - disabled: input === 'hiqh' - } - ] - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('detector') - .setDescription('Manaqe the detection level') - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages) - .setDMPermission(false) - .addStringOption(option => option - .setName('level') - .setDescription('The new detection level') - .setRequired(false) - .addChoices( - { - name: 'Low', - value: 'low' - }, { - name: 'Medium', - value: 'medium' - }, { - name: 'Hiqh', - value: 'hiqh' - } - ) - ) -}; diff --git a/interactions/commands/bot/g-spy.js b/interactions/commands/bot/g-spy.js deleted file mode 100644 index 53e7336..0000000 --- a/interactions/commands/bot/g-spy.js +++ /dev/null @@ -1,70 +0,0 @@ -const { SlashCommandBuilder, ContextMenuCommandBuilder } = require('@discordjs/builders'); -const { PermissionFlagsBits, ApplicationCommandType } = require('discord-api-types/v10'); - -module.exports = { - botPermissions: ['MANAGE_ROLES'], - async execute(client, interaction) { - const member = interaction.options.getMember('user'); - - if (!member || member.id === interaction.user.id || member.user.bot) { - return interaction.reply({ - embeds: [{ - title: 'Invalid User', - description: 'You need to mention a valid user!', - color: client.config.color - }], - ephemeral: true - }); - } - - const role = interaction.guild.roles.cache.find(r => r.name === 'g-spy') ?? await interaction.guild.roles.create({ - name: 'g-spy', - reason: 'Found a g-spy' - }); - - if (!role.editable) { - return interaction.reply({ - embeds: [{ - title: 'Missinq Permissions', - description: `Make sure ${role} is lower than my hiqhest role`, - color: client.config.color - }], - ephemeral: true - }); - } - - member.roles.add(role); - interaction.reply({ - embeds: [{ - title: 'Done', - description: `${member} was marked as a ${role}`, - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Revert', - customId: `g-spy:${member.id}:${interaction.user.id}` - }] - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('g-spy') - .setDescription('Mark a user as a g-spy') - .setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles) - .setDMPermission(false) - .addUserOption(option => option - .setName('user') - .setDescription('User to mark as g-spy') - ), - - contextData: new ContextMenuCommandBuilder() - .setName('Mark as G Spy') - .setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles) - .setDMPermission(false) - .setType(ApplicationCommandType.User) -}; diff --git a/interactions/commands/bot/info.js b/interactions/commands/bot/info.js deleted file mode 100644 index 71e090a..0000000 --- a/interactions/commands/bot/info.js +++ /dev/null @@ -1,48 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { stripIndents } = require('common-tags'); -const { version } = require('discord.js'); -const { version: botVersion } = require('../../../package.json'); - -module.exports = { - async execute(client, interaction) { - const developers = (await Promise.all(client.config.developers.map(async id => (await client.users.fetch(id)).tag))).join('\n'); - await client.application.fetch(); - interaction.reply({ - embeds: [{ - title: 'Info', - color: client.config.color, - fields: [ - { - name: 'G.A.S Bot', - value: 'G.A.S Bot was created to defeat the letter G.' - }, - { - name: 'G Removal', - value: 'By default, it removes standalone G, and it can be chanqed to three different detection levels' - }, - { - name: '<:VerifiedBotDev:764412852395180032> Developers', - value: developers, - inline: true - }, - { - name: '💻 Technoloqy', - value: stripIndents` - <:gas:896370532751147028> [G.A.S Bot](${client.generateInvite(client.application.installParams ?? client.config.invite)}) \`v${botVersion}\` - <:djs:893948932651118653> [discord.js](https://discord.js.org/) \`v${version}\` - <:node:893952060205178941> [Node.js](https://nodejs.org/) \`${process.version}\` - `, - inline: true - } - ], - thumbnail: { - url: client.user.displayAvatarURL() - } - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('info') - .setDescription('Display information about the bot') -}; diff --git a/interactions/commands/bot/links.js b/interactions/commands/bot/links.js deleted file mode 100644 index c9572a5..0000000 --- a/interactions/commands/bot/links.js +++ /dev/null @@ -1,40 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - const nog = '<:nog:676105350306594819>'; - const gas = '<:gas:896370532751147028>'; - const aytchSoftware = '<:AytchSoftware:720949593696894996>'; - - await client.application.fetch(); - - interaction.reply({ - embeds: [{ - title: 'Links', - fields: [ - { - name: `Want to remove ${nog} in your server?`, - value: `${gas} Invite the bot [here](${client.generateInvite(client.application.installParams ?? client.config.invite)})` - }, - { - name: 'Want to support the bot?', - value: `⬆️ Upvote it [here](${client.config.vote})` - }, - { - name: 'Need help?', - value: `${aytchSoftware} Join the Support Server [here](${client.config.support})` - }, - { - name: `Do you hate ${nog}?`, - value: `${nog} Join the G Annihilation Squad [here](${client.config.gasServer})` - } - ], - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('links') - .setDescription('Useful bot links') -}; diff --git a/interactions/commands/bot/logs.js b/interactions/commands/bot/logs.js deleted file mode 100644 index 04fbe04..0000000 --- a/interactions/commands/bot/logs.js +++ /dev/null @@ -1,61 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { ChannelType, PermissionFlagsBits } = require('discord-api-types/v10'); - -module.exports = { - async execute(client, interaction) { - const database = client.db.prepare('SELECT logs FROM guilds WHERE id = ?').get(interaction.guildId); - const statement = database ? 'UPDATE guilds SET logs = @logs WHERE id = @id' : 'INSERT INTO guilds (id, logs) VALUES (@id, @logs)'; - - const channel = interaction.options.getChannel('channel'); - - if (!channel) { - const logs = interaction.guild.channels.cache.get(database?.logs); - return interaction.reply({ - embeds: [{ - title: 'Loqs', - description: logs ? `The current loqs channel is ${logs}` : 'You don\'t have a loqs channel set up!', - color: client.config.color - }], - components: logs ? [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Reset', - customId: `loqs::${interaction.user.id}` - }] - }] : null - }); - } - - client.db.prepare(statement).run({ id: interaction.guildId, logs: channel.id }); - return interaction.reply({ - embeds: [{ - title: 'Loqs', - description: `The loqs channel is now ${channel}`, - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Reset', - customId: `loqs::${interaction.user.id}` - }] - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('loqs') - .setDescription('Manaqe the loqs channel') - .setDefaultMemberPermissions(PermissionFlagsBits.ManageChannels) - .setDMPermission(false) - .addChannelOption(option => option - .setName('channel') - .setDescription('Set loqs channel') - .addChannelTypes(ChannelType.GuildText, ChannelType.GuildNews) - .setRequired(false) - ) -}; diff --git a/interactions/commands/bot/ping.js b/interactions/commands/bot/ping.js deleted file mode 100644 index 11a3434..0000000 --- a/interactions/commands/bot/ping.js +++ /dev/null @@ -1,16 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - color: client.config.color, - description: `**Ponq!** ${client.ws.ping}ms` - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('pinq') - .setDescription('Display the bot\'s latency') -}; diff --git a/interactions/commands/bot/prefix.js b/interactions/commands/bot/prefix.js deleted file mode 100644 index 856aa24..0000000 --- a/interactions/commands/bot/prefix.js +++ /dev/null @@ -1,56 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { PermissionFlagsBits } = require('discord-api-types/v10'); - -const badLetters = require('../../../detector/detection.json').join(''); -const detector = RegExp(`[${badLetters}]`, 'giu'); - -module.exports = { - async execute(client, interaction) { - const database = client.db.prepare('SELECT prefix FROM guilds WHERE id = ?').get(interaction.guildId); - const statement = database ? 'UPDATE guilds SET prefix = @prefix WHERE id = @id' : 'INSERT INTO guilds (id, prefix) VALUES (@id, @prefix)'; - - const prefix = interaction.options.getString('prefix'); - - if (!prefix) { - return interaction.reply({ - embeds: [{ - title: 'Prefix', - description: `The current prefix is \`${database?.prefix ?? client.config.prefix}\``, - color: client.config.color - }] - }); - } - - if (prefix.length >= 10 || detector.test(prefix)) { - return interaction.reply({ - embeds: [{ - title: 'Invalid Prefix', - description: 'It must be shorter than 10 characters and it can\'t contain the bad letter', - color: client.config.color - }], - ephemeral: true - }); - } - - const newPrefix = prefix === client.config.prefix ? null : prefix; - client.db.prepare(statement).run({ id: interaction.guildId, prefix: newPrefix }); - interaction.reply({ - embeds: [{ - title: 'Prefix', - description: `Chanqed prefix to \`${prefix}\``, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('prefix') - .setDescription('Manaqe the bot\'s prefix') - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages) - .setDMPermission(false) - .addStringOption(option => option - .setName('prefix') - .setDescription('The new prefix to set') - .setRequired(false) - ) -}; diff --git a/interactions/commands/bot/removed.js b/interactions/commands/bot/removed.js deleted file mode 100644 index 3443027..0000000 --- a/interactions/commands/bot/removed.js +++ /dev/null @@ -1,51 +0,0 @@ -const { SlashCommandBuilder, ContextMenuCommandBuilder } = require('@discordjs/builders'); -const { ApplicationCommandType } = require('discord-api-types/v10'); - -module.exports = { - async execute(client, interaction) { - const member = interaction.options.getMember('user') ?? interaction.member; - const user = interaction.options.getUser('user'); - - if (!member && user || member.user.bot) { - return interaction.reply({ - embeds: [{ - title: 'Invalid User', - description: 'You need to mention a valid user!', - color: client.config.color - }], - ephemeral: true - }); - } - - const { count } = client.db.prepare('SELECT count FROM global_data').get(); - const userCount = client.db.prepare('SELECT count FROM users WHERE id = ?').get(member.id)?.count ?? 0; - const guildCount = client.db.prepare('SELECT count FROM guilds WHERE id = ?').get(interaction.guildId)?.count ?? 0; - - interaction.reply({ - embeds: [{ - title: 'Bad Letters Removed', - color: client.config.color, - description: `Removed ${count} bad letters in total`, - fields: [ - { name: 'Server', value: `Removed ${guildCount} bad letters in this server` }, - { name: 'User', value: `Removed ${userCount} bad letters from ${member}` } - ] - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('removed') - .setDescription('Check how many bad letters were removed') - .setDMPermission(false) - .addUserOption(option => option - .setName('user') - .setDescription('User to check') - .setRequired(false) - ), - - contextData: new ContextMenuCommandBuilder() - .setName('Removed Count') - .setDMPermission(false) - .setType(ApplicationCommandType.User) -}; diff --git a/interactions/commands/dev/sql.js b/interactions/commands/dev/sql.js deleted file mode 100644 index 7792048..0000000 --- a/interactions/commands/dev/sql.js +++ /dev/null @@ -1,63 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { inspect } = require('util'); - -module.exports = { - async execute(client, interaction) { - const method = interaction.options.getString('method'); - const query = interaction.options.getString('query'); - - if (method === 'backup') { - await client.db.backup(`./backup/backup-${Date.now()}.sqlite3`); - return interaction.reply({ - embeds: [{ - title: 'SQL', - description: 'Backup complete', - color: client.config.color - }], - ephemeral: true - }); - } - - try { - const db = client.db.prepare(query); - const result = method === 'run' ? db?.run() : db.get(); - interaction.reply({ - embeds: [{ - title: 'SQL', - description: `\`\`\`js\n${inspect(result, { depth: 2 })}\`\`\``, - color: client.config.color - }], - ephemeral: true - }); - } catch (error) { - interaction.reply({ - embeds: [{ - title: 'SQL', - description: `\`\`\`js\n${error}\`\`\``, - color: client.config.color - }], - ephemeral: true - }); - } - }, - - data: new SlashCommandBuilder() - .setName('sql') - .setDescription('Execute SQL statements') - .addStringOption(option => option - .setName('method') - .setDescription('Method to use') - .setRequired(true) - .addChoices({ - name: 'Backup', value: 'backup' - }, { - name: 'Get', value: 'get' - }, { - name: 'Run', value: 'run' - }) - ) - .addStringOption(option => option - .setName('query') - .setDescription('Query to execute') - .setRequired(false)) -}; diff --git a/interactions/commands/fun/h.js b/interactions/commands/fun/h.js deleted file mode 100644 index 994197b..0000000 --- a/interactions/commands/fun/h.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'h', - image: { - url: 'https://cdn.discordapp.com/attachments/439531641539526666/861256439209394176/arg-h-trans.gif' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('h') - .setDescription('h') -}; diff --git a/interactions/commands/fun/hromomento.js b/interactions/commands/fun/hromomento.js deleted file mode 100644 index e8fe66f..0000000 --- a/interactions/commands/fun/hromomento.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'hro momento', - image: { - url: 'https://c.tenor.com/jChba0HF5jcAAAAM/brro-momento.gif' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('hromomento') - .setDescription('aqui tenemos un qran bro momento') -}; diff --git a/interactions/commands/fun/huh.js b/interactions/commands/fun/huh.js deleted file mode 100644 index a60e8f1..0000000 --- a/interactions/commands/fun/huh.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'huh', - image: { - url: 'https://cdn.discordapp.com/emojis/805862278766395483.png?size=4096&quality=lossless' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('huh') - .setDescription(':thinkinq_h:') -}; diff --git a/interactions/commands/fun/juan.js b/interactions/commands/fun/juan.js deleted file mode 100644 index e92020c..0000000 --- a/interactions/commands/fun/juan.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'Juan', - image: { - url: 'https://cdn.discordapp.com/attachments/729730142125031505/768799803009269771/hYrZ6QK.png' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('juan') - .setDescription('🐴') -}; diff --git a/interactions/commands/fun/meme.js b/interactions/commands/fun/meme.js deleted file mode 100644 index 0c9d1bb..0000000 --- a/interactions/commands/fun/meme.js +++ /dev/null @@ -1,47 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const Snoowrap = require('snoowrap'); -const reddit = new Snoowrap({ - userAgent: 'gasbot', - clientId: process.env.REDDIT_CLIENT_ID, - clientSecret: process.env.REDDIT_TOKEN, - refreshToken: process.env.REDDIT_REFRESH -}); - -module.exports = { - async execute(client, interaction) { - const subreddits = ['memes', 'dankmemes', 'comedynecrophilia', 'theletterh', 'okbuddyretard', '196', 'comedyheaven']; - const randomSubreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - - const listing = (await reddit.getHot(randomSubreddit)).filter(p => !p.over_18 && p.is_reddit_media_domain && !p.is_video); - const post = listing[Math.floor(Math.random() * listing.length)]; - - interaction.reply({ - embeds: [{ - title: post.title.replaceAll(/g/giu, 'q'), - url: `https://reddit.com${post.permalink}`, - image: post.preview.images[0].variants.gif?.source ?? post.preview.images[0].source, - author: { - name: post.subreddit_name_prefixed - }, - footer: { - text: `u/${post.author.name}` - }, - timestamp: post.created * 1000, - color: client.config.color - }], - components: [{ - type: 'ACTION_ROW', - components: [{ - type: 'BUTTON', - style: 'SECONDARY', - label: 'Refresh', - customId: `meme::${interaction.user.id}` - }] - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('meme') - .setDescription('Displays a extremely funny hilarious meme from Reddit') -}; diff --git a/interactions/commands/fun/tank.js b/interactions/commands/fun/tank.js deleted file mode 100644 index d05f7d8..0000000 --- a/interactions/commands/fun/tank.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'THE ULTIMATE G DESTROYER', - image: { - url: 'https://cdn.discordapp.com/attachments/713675042143076356/988129506151776346/tank.png' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('tank') - .setDescription('aden said the bad letter, use this') -}; diff --git a/interactions/commands/fun/toilet.js b/interactions/commands/fun/toilet.js deleted file mode 100644 index 419ecb2..0000000 --- a/interactions/commands/fun/toilet.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); - -module.exports = { - async execute(client, interaction) { - interaction.reply({ - embeds: [{ - title: 'polish toilet', - image: { - url: 'https://c.tenor.com/4vgPhxKQw_MAAAAS/polish-toilet.gif' - }, - color: client.config.color - }] - }); - }, - - data: new SlashCommandBuilder() - .setName('toilet') - .setDescription('polish toilet') -}; diff --git a/loaders/applicationCommand.js b/loaders/applicationCommand.js deleted file mode 100644 index c8df9e3..0000000 --- a/loaders/applicationCommand.js +++ /dev/null @@ -1,19 +0,0 @@ -const { Collection } = require('discord.js'); -const { readdirSync } = require('fs'); - -module.exports = async client => { - client.interactions ??= {}; - - client.interactions.commands = new Collection(); - const commandFolders = readdirSync('./interactions/commands'); - - for (const folder of commandFolders) { - const commandFiles = readdirSync(`./interactions/commands/${folder}`).filter(file => file.endsWith('.js')); - - for (const file of commandFiles) { - const command = require(`../interactions/commands/${folder}/${file}`); - client.interactions.commands.set(command.data.name, command); - command.category = folder; - } - } -}; diff --git a/loaders/command.js b/loaders/command.js index f6d7e6b..da7a948 100644 --- a/loaders/command.js +++ b/loaders/command.js @@ -7,9 +7,10 @@ module.exports = async client => { for (const folder of commandFolders) { const commandFiles = readdirSync(`./commands/${folder}`).filter(file => file.endsWith('.js')); + for (const file of commandFiles) { const command = require(`../commands/${folder}/${file}`); - client.commands.set(command.name, command); + client.commands.set(command.data.name, command); command.category = folder; } } diff --git a/loaders/component.js b/loaders/component.js index ae225da..7250ded 100644 --- a/loaders/component.js +++ b/loaders/component.js @@ -2,13 +2,11 @@ const { Collection } = require('discord.js'); const { readdirSync } = require('fs'); module.exports = async client => { - client.interactions ??= {}; - - client.interactions.components = new Collection(); - const commandFiles = readdirSync('./interactions/components').filter(file => file.endsWith('.js')); + client.components = new Collection(); + const commandFiles = readdirSync('./components').filter(file => file.endsWith('.js')); for (const file of commandFiles) { - const command = require(`../interactions/components/${file}`); - client.interactions.components.set(command.name, command); + const command = require(`../components/${file}`); + client.components.set(command.name, command); } }; diff --git a/loaders/event.js b/loaders/event.js index 6fba953..3173dd1 100644 --- a/loaders/event.js +++ b/loaders/event.js @@ -4,10 +4,7 @@ module.exports = async client => { const eventFiles = readdirSync('./events').filter(file => file.endsWith('.js')); for (const file of eventFiles) { const event = require(`../events/${file}`); - if (event.once) { - client.once(event.name, (...args) => event.execute(...args, client)); - } else { - client.on(event.name, (...args) => event.execute(...args, client)); - } + + client.on(event.name, (...args) => event.execute(...args, client)); } }; diff --git a/package-lock.json b/package-lock.json index 95211dc..ff122dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "3.1.2", "license": "GPL-2.0-or-later", "dependencies": { - "@discordjs/builders": "^0.15.0", - "@discordjs/rest": "^0.5.0", - "better-sqlite3": "^7.5.3", + "@discordjs/builders": "^1.2.0", + "@discordjs/rest": "^1.1.0", + "better-sqlite3": "^7.6.2", "bufferutil": "^4.0.6", "common-tags": "^1.8.2", - "discord-api-types": "^0.35.0", - "discord.js": "^13.8.1", - "dotenv": "^16.0.1", + "discord-api-types": "^0.37.5", + "discord.js": "^13.10.3", + "dotenv": "^16.0.2", "erlpack": "github:discord/erlpack", "snoowrap": "^1.23.0", "topgg-autoposter": "^2.0.1", @@ -25,7 +25,7 @@ }, "devDependencies": { "conventional-changelog-cli": "^2.2.2", - "eslint": "^8.17.0" + "eslint": "^8.23.0" }, "engines": { "node": ">=16.6.0" @@ -138,13 +138,12 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.15.0.tgz", - "integrity": "sha512-w1UfCPzx2iKycn6qh/f0c+PcDpcTHzHr7TXALXu/a4gKHGamiSg3lP8GhYswweSJk/Q5cbFLHZUsnoY3MVKNAg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.2.0.tgz", + "integrity": "sha512-ARy4BUTMU+S0ZI6605NDqfWO+qZqV2d/xfY32z3hVSsd9IaAKJBZ1ILTZLy87oIjW8+gUpQmk9Kt0ZP9bmmd8Q==", "dependencies": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.37.3", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -153,11 +152,6 @@ "node": ">=16.9.0" } }, - "node_modules/@discordjs/builders/node_modules/discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" - }, "node_modules/@discordjs/collection": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", @@ -167,35 +161,39 @@ } }, "node_modules/@discordjs/rest": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.5.0.tgz", - "integrity": "sha512-S4E1YNz1UxgUfMPpMeqzPPkCfXE877zOsvKM5WEmwIhcpz1PQV7lzqlEOuz194UuwOJLLjQFBgQELnQfCX9UfA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.1.0.tgz", + "integrity": "sha512-yCrthRTQeUyNThQEpCk7bvQJlwQmz6kU0tf3dcWBv2WX3Bncl41x7Wc+v5b5OsIxfNYq38PvVtWircu9jtYZug==", "dependencies": { - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", + "@discordjs/collection": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", "@sapphire/snowflake": "^3.2.2", - "discord-api-types": "^0.33.3", + "discord-api-types": "^0.37.3", + "file-type": "^17.1.6", "tslib": "^2.4.0", - "undici": "^5.4.0" + "undici": "^5.9.1" }, "engines": { "node": ">=16.9.0" } }, - "node_modules/@discordjs/rest/node_modules/discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.1.0.tgz", + "integrity": "sha512-PQ2Bv6pnT7aGPCKWbvvNRww5tYCGpggIQVgpuF9TdDPeR6n6vQYxezXiLVOS9z2B62Dp4c+qepQ15SgJbLYtCQ==", + "engines": { + "node": ">=16.9.0" + } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -205,12 +203,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -221,6 +222,29 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -241,21 +265,60 @@ "resolved": "https://registry.npmjs.org/@jpbberry/typed-emitter/-/typed-emitter-1.2.1.tgz", "integrity": "sha512-XTYlVkcj329NNQfo+Fcix/ZcTQHn0F+5gt2lJvI5rBeulT+tq0uzeIIk3oAlwJg7GT9u4mqG0bNLq/kqKXxf4Q==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sapphire/async-queue": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", - "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.2.0.tgz", - "integrity": "sha512-asNgE5Ooil2/oGIAj6vZMoUc2ZFED0TGYD7jwvZsjHPQZBEh9ITj94ca4bCgiCR1s2ER/UjzykH+5wE3ebVZnQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", + "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + }, "engines": { - "node": ">=v15.0.0", + "node": ">=v14.0.0", "npm": ">=7.0.0" } }, @@ -268,16 +331,10 @@ "npm": ">=7.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, "node_modules/@top-gg/sdk": { "version": "3.1.3", @@ -300,9 +357,9 @@ "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" }, "node_modules/@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -336,9 +393,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -427,6 +484,15 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -509,9 +575,9 @@ } }, "node_modules/better-sqlite3": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.3.tgz", - "integrity": "sha512-tNIrDsThpWT8j1mg+svI1pqCYROqNOWMbB2qXVg+TJqH9UR5XnbAHyRsLZoJagldGTTqJPj/sUPVOkW0GRpYqw==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", "hasInstallScript": true, "dependencies": { "bindings": "^1.5.0", @@ -564,6 +630,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1069,9 +1147,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1173,25 +1251,46 @@ "node": ">=8" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/discord-api-types": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.35.0.tgz", - "integrity": "sha512-aaIbVgPk7OA3y/HdG00tRM2nB8B3sSPH6KXgamBLRrcAJEQ8XZJNNKeRr0WVzw/lprdpKHKuTNX1DNrYnD5cOw==" + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" }, "node_modules/discord.js": { - "version": "13.8.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", - "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "version": "13.10.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.10.3.tgz", + "integrity": "sha512-cIARuxfpQDeqA9Zw3fz4IL20xAhtMsjwJIf7/K82R3n2xROG9/fAx+7qjX8ysp9BfflYqMu2ZskyWq1EAmL5BA==", "dependencies": { - "@discordjs/builders": "^0.14.0", + "@discordjs/builders": "^0.16.0", "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", - "@types/node-fetch": "^2.6.1", + "@sapphire/async-queue": "^1.5.0", + "@types/node-fetch": "^2.6.2", "@types/ws": "^8.5.3", "discord-api-types": "^0.33.3", "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.7.0" + "node-fetch": "^2.6.7", + "ws": "^8.8.1" }, "engines": { "node": ">=16.6.0", @@ -1199,13 +1298,13 @@ } }, "node_modules/discord.js/node_modules/@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", + "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", + "deprecated": "no longer supported", "dependencies": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -1214,6 +1313,11 @@ "node": ">=16.9.0" } }, + "node_modules/discord.js/node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, "node_modules/discord.js/node_modules/discord-api-types": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", @@ -1257,9 +1361,9 @@ } }, "node_modules/dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", "engines": { "node": ">=12" } @@ -1328,13 +1432,15 @@ } }, "node_modules/eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", - "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1344,14 +1450,17 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -1366,8 +1475,7 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -1428,18 +1536,91 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { @@ -1510,6 +1691,34 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1521,6 +1730,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1533,11 +1751,39 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1796,9 +2042,9 @@ } }, "node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1810,12 +2056,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -2082,6 +2354,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -2310,6 +2591,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2535,6 +2821,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.50.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", @@ -2874,11 +3182,35 @@ "node": ">=4" } }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2976,6 +3308,26 @@ "node": ">=0.6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -3089,6 +3441,34 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -3209,7 +3589,17 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, "node_modules/rimraf": { @@ -3227,6 +3617,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -3330,6 +3743,15 @@ "simple-concat": "^1.0.0" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/snoowrap": { "version": "1.23.0", "resolved": "https://registry.npmjs.org/snoowrap/-/snoowrap-1.23.0.tgz", @@ -3557,6 +3979,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3686,6 +4124,18 @@ "node": ">= 6" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -3694,6 +4144,22 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/topgg-autoposter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/topgg-autoposter/-/topgg-autoposter-2.0.1.tgz", @@ -3860,12 +4326,6 @@ "uuid": "bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3992,9 +4452,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "engines": { "node": ">=10.0.0" }, @@ -4084,6 +4544,18 @@ "node": ">=8" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zlib-sync": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/zlib-sync/-/zlib-sync-0.1.7.tgz", @@ -4180,23 +4652,15 @@ } }, "@discordjs/builders": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.15.0.tgz", - "integrity": "sha512-w1UfCPzx2iKycn6qh/f0c+PcDpcTHzHr7TXALXu/a4gKHGamiSg3lP8GhYswweSJk/Q5cbFLHZUsnoY3MVKNAg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.2.0.tgz", + "integrity": "sha512-ARy4BUTMU+S0ZI6605NDqfWO+qZqV2d/xfY32z3hVSsd9IaAKJBZ1ILTZLy87oIjW8+gUpQmk9Kt0ZP9bmmd8Q==", "requires": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.37.3", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" - }, - "dependencies": { - "discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" - } } }, "@discordjs/collection": { @@ -4205,34 +4669,35 @@ "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" }, "@discordjs/rest": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.5.0.tgz", - "integrity": "sha512-S4E1YNz1UxgUfMPpMeqzPPkCfXE877zOsvKM5WEmwIhcpz1PQV7lzqlEOuz194UuwOJLLjQFBgQELnQfCX9UfA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.1.0.tgz", + "integrity": "sha512-yCrthRTQeUyNThQEpCk7bvQJlwQmz6kU0tf3dcWBv2WX3Bncl41x7Wc+v5b5OsIxfNYq38PvVtWircu9jtYZug==", "requires": { - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", + "@discordjs/collection": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", "@sapphire/snowflake": "^3.2.2", - "discord-api-types": "^0.33.3", + "discord-api-types": "^0.37.3", + "file-type": "^17.1.6", "tslib": "^2.4.0", - "undici": "^5.4.0" + "undici": "^5.9.1" }, "dependencies": { - "discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + "@discordjs/collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.1.0.tgz", + "integrity": "sha512-PQ2Bv6pnT7aGPCKWbvvNRww5tYCGpggIQVgpuF9TdDPeR6n6vQYxezXiLVOS9z2B62Dp4c+qepQ15SgJbLYtCQ==" } } }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -4242,9 +4707,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -4252,6 +4717,18 @@ "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -4269,25 +4746,55 @@ "resolved": "https://registry.npmjs.org/@jpbberry/typed-emitter/-/typed-emitter-1.2.1.tgz", "integrity": "sha512-XTYlVkcj329NNQfo+Fcix/ZcTQHn0F+5gt2lJvI5rBeulT+tq0uzeIIk3oAlwJg7GT9u4mqG0bNLq/kqKXxf4Q==" }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sapphire/async-queue": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", - "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" }, "@sapphire/shapeshift": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.2.0.tgz", - "integrity": "sha512-asNgE5Ooil2/oGIAj6vZMoUc2ZFED0TGYD7jwvZsjHPQZBEh9ITj94ca4bCgiCR1s2ER/UjzykH+5wE3ebVZnQ==" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", + "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + } }, "@sapphire/snowflake": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.2.tgz", "integrity": "sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==" }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, "@top-gg/sdk": { "version": "3.1.3", @@ -4310,9 +4817,9 @@ "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==" }, "@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -4345,9 +4852,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-jsx": { @@ -4415,6 +4922,12 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -4474,9 +4987,9 @@ } }, "better-sqlite3": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.3.tgz", - "integrity": "sha512-tNIrDsThpWT8j1mg+svI1pqCYROqNOWMbB2qXVg+TJqH9UR5XnbAHyRsLZoJagldGTTqJPj/sUPVOkW0GRpYqw==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", "requires": { "bindings": "^1.5.0", "prebuild-install": "^7.1.0" @@ -4527,6 +5040,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -4907,9 +5429,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -4978,38 +5500,61 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, "discord-api-types": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.35.0.tgz", - "integrity": "sha512-aaIbVgPk7OA3y/HdG00tRM2nB8B3sSPH6KXgamBLRrcAJEQ8XZJNNKeRr0WVzw/lprdpKHKuTNX1DNrYnD5cOw==" + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" }, "discord.js": { - "version": "13.8.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", - "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "version": "13.10.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.10.3.tgz", + "integrity": "sha512-cIARuxfpQDeqA9Zw3fz4IL20xAhtMsjwJIf7/K82R3n2xROG9/fAx+7qjX8ysp9BfflYqMu2ZskyWq1EAmL5BA==", "requires": { - "@discordjs/builders": "^0.14.0", + "@discordjs/builders": "^0.16.0", "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", - "@types/node-fetch": "^2.6.1", + "@sapphire/async-queue": "^1.5.0", + "@types/node-fetch": "^2.6.2", "@types/ws": "^8.5.3", "discord-api-types": "^0.33.3", "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.7.0" + "node-fetch": "^2.6.7", + "ws": "^8.8.1" }, "dependencies": { "@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", + "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", "requires": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + } } }, "discord-api-types": { @@ -5048,9 +5593,9 @@ } }, "dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" }, "ecc-jsbn": { "version": "0.1.2", @@ -5106,13 +5651,15 @@ "dev": true }, "eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", - "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -5122,14 +5669,17 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -5144,8 +5694,52 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } } }, "eslint-scope": { @@ -5182,12 +5776,12 @@ "dev": true }, "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -5242,6 +5836,30 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5253,6 +5871,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5262,11 +5889,30 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -5477,20 +6123,40 @@ } }, "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -5679,6 +6345,12 @@ "is-extglob": "^2.1.1" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -5870,6 +6542,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6035,6 +6712,22 @@ } } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "mime-db": { "version": "1.50.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", @@ -6288,11 +6981,22 @@ } } }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -6368,6 +7072,12 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -6464,6 +7174,26 @@ "util-deprecate": "~1.0.1" } }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -6549,6 +7279,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6558,6 +7294,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -6621,6 +7366,12 @@ "simple-concat": "^1.0.0" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "snoowrap": { "version": "1.23.0", "resolved": "https://registry.npmjs.org/snoowrap/-/snoowrap-1.23.0.tgz", @@ -6804,6 +7555,15 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6910,11 +7670,29 @@ } } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "topgg-autoposter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/topgg-autoposter/-/topgg-autoposter-2.0.1.tgz", @@ -7036,12 +7814,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -7148,9 +7920,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "requires": {} }, "xtend": { @@ -7210,6 +7982,12 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zlib-sync": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/zlib-sync/-/zlib-sync-0.1.7.tgz", diff --git a/package.json b/package.json index a200226..67933e3 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,14 @@ "author": "Aytch Software", "license": "GPL-2.0-or-later", "dependencies": { - "@discordjs/builders": "^0.15.0", - "@discordjs/rest": "^0.5.0", - "better-sqlite3": "^7.5.3", + "@discordjs/builders": "^1.2.0", + "@discordjs/rest": "^1.1.0", + "better-sqlite3": "^7.6.2", "bufferutil": "^4.0.6", "common-tags": "^1.8.2", - "discord-api-types": "^0.35.0", - "discord.js": "^13.8.1", - "dotenv": "^16.0.1", + "discord-api-types": "^0.37.5", + "discord.js": "^13.10.3", + "dotenv": "^16.0.2", "erlpack": "github:discord/erlpack", "snoowrap": "^1.23.0", "topgg-autoposter": "^2.0.1", @@ -32,7 +32,7 @@ }, "devDependencies": { "conventional-changelog-cli": "^2.2.2", - "eslint": "^8.17.0" + "eslint": "^8.23.0" }, "engines": { "node": ">=16.6.0"