From 1b5d1834a6352b02a49b746b825a1536d57f63b2 Mon Sep 17 00:00:00 2001 From: DeSqBlocki Date: Fri, 20 Dec 2024 23:56:37 +0100 Subject: [PATCH] Update 2.0 | Replaced with SlashCommands | Subscribe, Unscubscribe, List, Info --- assets/offline.jpg | Bin 0 -> 41182 bytes commands/channels/channels.js | 260 ++++++++++++++ events/ClientReady.js | 17 + events/InteractionCreate.js | 27 ++ handlers/commands.js | 48 +++ handlers/events.js | 18 + index.js | 239 ++++++------- package-lock.json | 634 ++++++++++++++++++++-------------- package.json | 3 +- 9 files changed, 873 insertions(+), 373 deletions(-) create mode 100644 assets/offline.jpg create mode 100644 commands/channels/channels.js create mode 100644 events/ClientReady.js create mode 100644 events/InteractionCreate.js create mode 100644 handlers/commands.js create mode 100644 handlers/events.js diff --git a/assets/offline.jpg b/assets/offline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a755c129c8175a66ec1c4de1f50fbfec735e89e5 GIT binary patch literal 41182 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 literal 0 HcmV?d00001 diff --git a/commands/channels/channels.js b/commands/channels/channels.js new file mode 100644 index 0000000..61f23b0 --- /dev/null +++ b/commands/channels/channels.js @@ -0,0 +1,260 @@ +const { configDotenv } = require('dotenv'); +const { MongoClient } = require('mongodb'); +const TwitchApi = require("node-twitch").default +const tClient = new TwitchApi({ + client_id: process.env.TTV_ID, + client_secret: process.env.TTV_SECRET +}); +configDotenv +const mClient = new MongoClient(process.env.MONGO_URL); +const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); + +async function SubscribeChannel(interaction) { + const channelName = encodeURI(await interaction.options.getString('channel')).toLowerCase() + const userID = interaction.user.id + try { + let streamData = await tClient.getStreams({ channel: channelName }) + //console.log(await tClient.searchChannels({query: `${channelName}`})) // returns too many results and not exact match first + } catch (error) { + return interaction.reply({ + content: `**[ERROR]:** Could not validate channel name for *${channelName}*!\r\n${error}`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } + + const db = mClient.db('notifyme') + const channelsColl = db.collection('channels') + + const find = await channelsColl.find({ channel: channelName }).toArray() + + if (find[0]) { + if (find[0].users.includes(userID)) { + return interaction.reply({ + content: `**[WARNING]:** You are already subscribed to *${channelName}*!`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } + } + + try { + const res = await channelsColl.findOneAndUpdate({ + channel: channelName + }, { + $set: { + channel: channelName, + }, + $push: { + users: userID + } + }, { + upsert: true, + returnDocument: 'after' + }) + } catch (error) { + return interaction.reply({ + content: `**[ERROR]:** There was an issue updating the database!\r\n${error}`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } + //console.log(res) // debug + return interaction.reply({ + content: `**[SUCCESS]:** You are now subscribed to *${channelName}*!`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) +} + +async function UnsubscribeChannel(interaction) { + const channelName = encodeURI(await interaction.options.getString('channel')).toLowerCase() + const userID = interaction.user.id + + const db = mClient.db('notifyme') + const channelsColl = db.collection('channels') + + const find = await channelsColl.find({ channel: channelName }).toArray() + + if (find[0]) { + if (!find[0].users.includes(userID)) { + return interaction.reply({ + content: `**[WARNING]:** You were not subscribed to *${channelName}*!`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } + } + + try { + const res = await channelsColl.findOneAndUpdate({ + channel: channelName + }, { + $set: { + channel: channelName, + }, + $pull: { + users: userID + } + }, { + upsert: true, + returnDocument: 'after' + }) + } catch (error) { + return interaction.reply({ + content: `**[ERROR]:** There was an issue with the database!\r\n${error}`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } + //console.log(res) // debug + return interaction.reply({ + content: `**[SUCCESS]:** You are no longer subscribed to *${channelName}*!`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) +} + +async function ListChannel(interaction) { + const userID = interaction.user.id + + const db = mClient.db('notifyme') + const channelsColl = db.collection('channels') + + const find = await channelsColl.find({ users: userID }).toArray() + var channelList = [] + find.forEach((document) => { + channelList.push(document.channel) + }) + const embed = new EmbedBuilder() + .setTitle('Lists of Subscribed Channels:') + .setDescription(channelList.join("\n")) + + return interaction.reply({ + embeds: [embed], + ephemeral: true + }) +} + +async function InfoChannel(interaction) { + const channelName = encodeURI(await interaction.options.getString('channel')).toLowerCase() + try { + let streamData = await tClient.getStreams({ channel: channelName }) + if (streamData?.data[0]) { + let liveData = { + streamer: streamData.data[0].user_name, + game: streamData.data[0].game_name, + title: streamData.data[0].title, + thumbnail: streamData.data[0].thumbnail_url.replace('-{width}x{height}', ''), + tags: streamData.data[0].tags + } + const embed = new EmbedBuilder() + .setTitle(`${liveData.streamer} is live!`) + .setDescription(`They're playing ${liveData.game}`) + .addFields( + { name: '\u200B', value: `${liveData.title}` }) + .setImage(liveData.thumbnail) + .setURL(`https://twitch.tv/${channelName}`) + let footer = "" + liveData.tags.forEach((tag) => { + footer += `${footer?',':''} #${tag}` + }) + embed.setFooter({ + text: footer + }) + + return interaction.reply({ + embeds: [embed], + ephemeral: true + }) + } else { + const embed = new EmbedBuilder() + .setTitle(`${channelName} is currently offline!`) + .setImage('https://media.discordapp.net/attachments/1061304429724319794/1319800268770250883/no-signal-tv-descendant-network-rainbow-bars-abstract-background-vector.jpg?ex=67674748&is=6765f5c8&hm=d539944a67fccec461b0183a9f0300e19ac485deda7b23090165088567f2c84f&=&format=webp') + .setURL(`https://twitch.tv/${channelName}`) + return interaction.reply({ + embeds: [embed], + ephemeral: true + }) + } + //streamData = streamData. + //console.log(await tClient.searchChannels({query: `${channelName}`})) // returns too many results and not exact match first + } catch (error) { + console.error(error) + return interaction.reply({ + content: `**[ERROR]:** Could not validate channel name for *${channelName}*!\r\n${error}`, + ephemeral: true + }).then(setTimeout(() => { + interaction.deleteReply() + }, 5000)) + } +} + +module.exports = { + data: new SlashCommandBuilder() + .setName('channel') + .setDescription('channel related commands') + .addSubcommand(s => + s + .setName('subscribe') + .setDescription('subscribe to notifications when this channel goes live') + .addStringOption(o => + o + .setName('channel') + .setDescription('channel name') + .setRequired(true) + ) + ) + .addSubcommand(s => + s + .setName('unsubscribe') + .setDescription('unsubscribe to notifications when this channel goes live') + .addStringOption(o => + o + .setName('channel') + .setDescription('channel name') + .setRequired(true) + ) + ) + .addSubcommand(s => + s + .setName('list') + .setDescription('list your subscribed channels') + ) + .addSubcommand(s => + s + .setName('info') + .setDescription('get information on a live channel') + .addStringOption(o => + o + .setName('channel') + .setDescription('channel name') + .setRequired(true) + ) + ), + async execute(interaction) { + switch (interaction.options._subcommand) { + case 'subscribe': + SubscribeChannel(interaction) + break; + case 'unsubscribe': + UnsubscribeChannel(interaction) + break; + case 'list': + ListChannel(interaction) + break; + case 'info': + InfoChannel(interaction) + break; + default: + break; + } + } +} \ No newline at end of file diff --git a/events/ClientReady.js b/events/ClientReady.js new file mode 100644 index 0000000..ba7dc2c --- /dev/null +++ b/events/ClientReady.js @@ -0,0 +1,17 @@ +const { Events, ActivityType } = require('discord.js'); +module.exports = { + name: Events.ClientReady, + once: true, + async execute(client) { + console.log(`Ready! Logged in as ${client.user.tag}`) + client.user.setPresence({ + activities: [{ + name: 'Notyfing', + type: ActivityType.Streaming, + url: 'https://twitch.tv/desq_blocki' + }], + status: 'online' + }) + + } +} \ No newline at end of file diff --git a/events/InteractionCreate.js b/events/InteractionCreate.js new file mode 100644 index 0000000..5fae1b1 --- /dev/null +++ b/events/InteractionCreate.js @@ -0,0 +1,27 @@ +const { Events } = require('discord.js') + +module.exports = { + name: Events.InteractionCreate, + once: false, + async execute(interaction) { + if (interaction.isChatInputCommand()) { commandHandler(interaction) }; + } +} + +async function commandHandler(interaction) { + const command = interaction.client.commands.get(interaction.commandName); + if (!command) { + console.error(`No command matching ${interaction.commandName} was found.`); + return; + } + try { + await command.execute(interaction); + } catch (error) { + console.error(error); + if (interaction.replied || interaction.deferred) { + await interaction.followUp({ content: 'There was an error while executing this command!', ephemeral: true }); + } else { + await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } + } +} \ No newline at end of file diff --git a/handlers/commands.js b/handlers/commands.js new file mode 100644 index 0000000..fe46475 --- /dev/null +++ b/handlers/commands.js @@ -0,0 +1,48 @@ +const { REST, Routes } = require('discord.js'); +const { configDotenv } = require('dotenv'); +configDotenv +const fs = require('node:fs'); +const path = require('node:path'); +const { dClient } = require('../index'); + +const commands = []; +// Grab all the command folders from the commands directory you created earlier +const foldersPath = path.join(__dirname, '../commands'); +const commandFolders = fs.readdirSync(foldersPath); + +for (const folder of commandFolders) { + // Grab all the command files from the commands directory you created earlier + const commandsPath = path.join(foldersPath, folder); + const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); + for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const command = require(filePath); + if ('data' in command && 'execute' in command) { + commands.push(command.data.toJSON()); + dClient.commands.set(command.data.name, command); + } else { + console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`); + } + } +} + +// Construct and prepare an instance of the REST module +const rest = new REST().setToken(process.env.DISCORD_Token); + +// and deploy your commands! +(async () => { + try { + console.log(`Started refreshing ${commands.length} application (/) commands.`); + + // The put method is used to fully refresh all commands in the guild with the current set + const data = await rest.put( + Routes.applicationCommands(process.env.DISCORD_ID), + { body: commands }, + ); + + console.log(`Successfully reloaded ${data.length} application (/) commands.`); + } catch (error) { + // And of course, make sure you catch and log any errors! + console.error(error); + } +})(); \ No newline at end of file diff --git a/handlers/events.js b/handlers/events.js new file mode 100644 index 0000000..fba429b --- /dev/null +++ b/handlers/events.js @@ -0,0 +1,18 @@ +const fs = require('node:fs') +const path = require('node:path') +const { dClient } = require('../index') + +const eventsPath = path.join(__dirname, '../events') +const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js')) + +for (const file of eventFiles) { + const filePath = path.join(eventsPath, file) + const event = require(filePath) + if (event.once) { + dClient.once(event.name, (...args) => event.execute(...args, dClient)) + // added dClient to commomerate global usage + } else { + dClient.on(event.name, (...args) => event.execute(...args, dClient)) + // added dClient to commomerate global usage + } +} diff --git a/index.js b/index.js index 751f4d6..7270bc6 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,7 @@ -const { Client, Events, GatewayIntentBits, Partials, EmbedBuilder } = require('discord.js'); -const client = new Client({ +require('dotenv').config() +const { Client, Collection, GatewayIntentBits, Partials } = require('discord.js'); +const fs = require('node:fs') +const dClient = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, @@ -13,126 +15,125 @@ const client = new Client({ ] }); -const TwitchApi = require("node-twitch").default -const fs = require('fs') -const channels = JSON.parse(fs.readFileSync('./channels.json', 'utf-8')) -console.log(channels) -const isLive = new Set() -require('dotenv').config() +dClient.commands = new Collection() // slash commands collection +exports.dClient = dClient -const TwitchClient = new TwitchApi({ - client_id: process.env.TTV_ID, - client_secret: process.env.TTV_SECRET -}); -async function getStreamdata(stream) { - var streamData - await TwitchClient.getStreams({ channel: stream }).then(async data => { - const r = data.data[0] - if (r) { - //stream online - if (!isLive.has(stream)) { - //not yet in memory - streamData = { - "game": r.game_name, - "title": r.title, - } - isLive.add(stream) - } else { - //already in memory - } - } else { - //stream offline - if (isLive.has(stream)) { - //was in memory - console.log(`${stream} went offline :c`) - isLive.delete(stream) - } else { - //was not in memory - } - } - }) - return streamData -} - -async function doInterval() { - const guild = client.guilds.fetch('848610258306072576') - for (const [key, value] of Object.entries(channels)) { - //key: channel, value: [ users ] - let streamdata = await getStreamdata(key) - if(streamdata){ - value.forEach(async userID =>{ - (await guild).members.fetch(userID) - .then((u => { - u.send(`https://twitch.tv/${key} is live!`) - console.log(`${key} is live!`) - })) - }) - } - } -} -client.once(Events.ClientReady, async client => { - console.log(`Ready! Logged in as ${client.user.tag}`) - doInterval() - setInterval(async () => { - doInterval() - }, 2000) +fs.readdirSync('./handlers').forEach((handler) => { + require(`./handlers/${handler}`) }); -client.on(Events.MessageCreate, async (msg) => { - if (msg.author.bot) { return } - console.log(msg.content) - if (!msg.content.startsWith('!')) { return } +dClient.login(process.env.DISCORD_Token) - const args = msg.content.substring(1).split(' ') - switch (args[0]) { - case "add": - addChannel(args[1], msg) - break; - case "remove": - delChannel(args[1], msg) - break; - case "list": - listChannels(msg) - default: - break; - } -}) -function addChannel(channel, msg) { - if (!channels[channel]) { - channels[channel] = [msg.author.id] - } else { - channels[channel].push(msg.author.id) - } - fs.writeFileSync('./channels.json', JSON.stringify(channels), 'utf-8') - msg.reply({ - content: `Subscribed to [${channel}] Notifications!` - }) -} -function delChannel(channel, msg) { - let index = channels[channel].indexOf(msg.author.id) - channels[channel].splice(index) - if (channels[channel].length === 0) { - delete channels[channel] - } - fs.writeFileSync('./channels.json', JSON.stringify(channels), 'utf-8') - msg.reply({ - content: `Unsubscribed from [${channel}] Notifications!` - }) -} -function listChannels(msg){ - let subscribed = [] - let embed = new EmbedBuilder() - .setTitle('Lists of Subscribed Channels:') - for (const [key, value] of Object.entries(channels)) { - if(value.includes(msg.author.id)){ - subscribed.push(key) - } - } - embed.setDescription(subscribed.join("\n")) +// async function getStreamdata(stream) { +// var streamData +// await TwitchClient.getStreams({ channel: stream }).then(async data => { +// const r = data.data[0] +// if (r) { +// //stream online +// if (!isLive.has(stream)) { +// //not yet in memory +// streamData = { +// "game": r.game_name, +// "title": r.title, +// } +// isLive.add(stream) +// } else { +// //already in memory +// } +// } else { +// //stream offline +// if (isLive.has(stream)) { +// //was in memory +// console.log(`${stream} went offline :c`) +// isLive.delete(stream) +// } else { +// //was not in memory +// } +// } +// }) +// return streamData +// } + +// async function doInterval() { +// const guild = client.guilds.fetch('848610258306072576') +// for (const [key, value] of Object.entries(channels)) { +// //key: channel, value: [ users ] +// let streamdata = await getStreamdata(key) +// if(streamdata){ +// value.forEach(async userID =>{ +// (await guild).members.fetch(userID) +// .then((u => { +// u.send(`https://twitch.tv/${key} is live!`) +// console.log(`${key} is live!`) +// })) +// }) +// } +// } +// } +// client.once(Events.ClientReady, async client => { +// console.log(`Ready! Logged in as ${client.user.tag}`) +// doInterval() +// setInterval(async () => { +// doInterval() +// }, 2000) +// }); + +// client.on(Events.MessageCreate, async (msg) => { +// if (msg.author.bot) { return } +// console.log(msg.content) +// if (!msg.content.startsWith('!')) { return } + +// const args = msg.content.substring(1).split(' ') +// switch (args[0]) { +// case "add": +// addChannel(args[1], msg) +// break; +// case "remove": +// delChannel(args[1], msg) +// break; +// case "list": +// listChannels(msg) +// default: +// break; +// } +// }) + +// function addChannel(channel, msg) { +// if (!channels[channel]) { +// channels[channel] = [msg.author.id] +// } else { +// channels[channel].push(msg.author.id) +// } +// fs.writeFileSync('./channels.json', JSON.stringify(channels), 'utf-8') +// msg.reply({ +// content: `Subscribed to [${channel}] Notifications!` +// }) +// } +// function delChannel(channel, msg) { +// let index = channels[channel].indexOf(msg.author.id) +// channels[channel].splice(index) +// if (channels[channel].length === 0) { +// delete channels[channel] +// } +// fs.writeFileSync('./channels.json', JSON.stringify(channels), 'utf-8') +// msg.reply({ +// content: `Unsubscribed from [${channel}] Notifications!` +// }) +// } +// function listChannels(msg){ +// let subscribed = [] +// let embed = new EmbedBuilder() +// .setTitle('Lists of Subscribed Channels:') +// for (const [key, value] of Object.entries(channels)) { +// if(value.includes(msg.author.id)){ +// subscribed.push(key) +// } +// } +// embed.setDescription(subscribed.join("\n")) - msg.reply({ - embeds: [embed] - }) -} -client.login(process.env.DISCORD_Token); +// msg.reply({ +// embeds: [embed] +// }) +// } +// client.login(process.env.DISCORD_Token); diff --git a/package-lock.json b/package-lock.json index 99524f2..5ae8a05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,215 +5,426 @@ "packages": { "": { "dependencies": { - "discord.js": "^14.7.1", + "discord.js": "^14.16.3", "dotenv": "^16.0.3", + "mongodb": "^6.12.0", "node-twitch": "^0.5.0" } }, "node_modules/@discordjs/builders": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", - "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/util": "^0.1.0", - "@sapphire/shapeshift": "^3.7.1", - "discord-api-types": "^0.37.20", + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.2", - "tslib": "^2.4.1" + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, "node_modules/@discordjs/collection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz", - "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "license": "Apache-2.0", "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, - "node_modules/@discordjs/rest": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.5.0.tgz", - "integrity": "sha512-lXgNFqHnbmzp5u81W0+frdXN6Etf4EUi8FAPcWpSykKd8hmlWh1xy6BmE0bsJypU1pxohaA8lQCgp70NUI3uzA==", + "node_modules/@discordjs/formatters": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/collection": "^1.3.0", - "@discordjs/util": "^0.1.0", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.2.2", - "discord-api-types": "^0.37.23", - "file-type": "^18.0.0", - "tslib": "^2.4.1", - "undici": "^5.13.0" + "discord-api-types": "0.37.97" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/util": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz", - "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==", + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, + "node_modules/@discordjs/rest": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==", + "license": "MIT" + }, + "node_modules/@discordjs/util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==", + "license": "MIT" + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" } }, "node_modules/@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz", + "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz", - "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=v16" } }, "node_modules/@sapphire/snowflake": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz", - "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, - "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/@types/node": { - "version": "18.15.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", - "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==" + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==", + "license": "MIT", "engines": { - "node": ">=10.16.0" + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/bson": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz", + "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" } }, "node_modules/discord-api-types": { - "version": "0.37.35", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.35.tgz", - "integrity": "sha512-iyKZ/82k7FX3lcmHiAvvWu5TmyfVo78RtghBV/YsehK6CID83k5SI03DKKopBcln+TiEIYw5MGgq7SJXSpNzMg==" + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==", + "license": "MIT" }, "node_modules/discord.js": { - "version": "14.7.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz", - "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==", + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.4.0", - "@discordjs/collection": "^1.3.0", - "@discordjs/rest": "^1.4.0", - "@discordjs/util": "^0.1.0", - "@sapphire/snowflake": "^3.2.2", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.37.20", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.4.1", - "undici": "^5.13.0", - "ws": "^8.11.0" + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" }, "engines": { - "node": ">=16.9.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" + }, + "node_modules/magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", + "license": "MIT" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/mongodb": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz", + "integrity": "sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.1", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -233,166 +444,83 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/node-twitch/-/node-twitch-0.5.0.tgz", "integrity": "sha512-4sN4P8R5NeBuuBMZhqKHqLYB9fKcyR8sCU39eGKe/xU5TiFRA3M/2ou9FeyD5EU7EzAb7TgunKQOaY2wMdAFSQ==", + "license": "ISC", "dependencies": { "node-fetch": "2" } }, - "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==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">=6" } }, - "node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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/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" + "memory-pager": "^1.0.2" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/undici": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", - "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", - "dependencies": { - "busboy": "^1.6.0" - }, + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "license": "MIT", "engines": { - "node": ">=12.18" + "node": ">=18.17" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 7d4acb0..d0ff853 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "dependencies": { - "discord.js": "^14.7.1", + "discord.js": "^14.16.3", "dotenv": "^16.0.3", + "mongodb": "^6.12.0", "node-twitch": "^0.5.0" } }