diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 index 500b1a0..c7db959 --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1,7 @@ -**/.dockerignore -**/.git -**/.gitattributes -**/.gitignore -**/.vscode -**/docker-compose* -**/Dockerfile* -**/node_modules +.dockerignore +.git +.gitignore +.vscode +Dockerfile +node_modules README.md \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 47a2a32..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "parserOptions": { - "ecmaVersion": "latest" - }, - - "env": { - "es6": true - } -} \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1ff0c42..0000000 --- a/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 96f2516..c9a37b8 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules/ -.env -cracks/ -stronger_shorter.mp3 +public/cracks/ +dist/ +.env* \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100755 index c837b52..0000000 --- a/.npmrc +++ /dev/null @@ -1,167 +0,0 @@ -;;;; -; npm projectconfig file: C:\Users\Zachary\source\repos\Discord\.npmrc -; this is a simple ini-formatted file -; lines that start with semi-colons are comments -; run `npm help 7 config` for documentation of the various options -; -; Configs like `@scope:registry` map a scope to a given registry url. -; -; Configs like `///:_authToken` are auth that is restricted -; to the registry host specified. - - - -;;;; -; all available options shown below with default values -;;;; - - -; _auth=null -; access=null -; all=false -; allow-same-version=false -; also=null -; audit=true -; audit-level=null -; auth-type=web -; before=null -; bin-links=true -; browser=null -; ca=null -; cache=C:\Users\Zachary\AppData\Local/npm-cache -; cache-max=null -; cache-min=0 -; cafile=null -; call= -; cert=null -; ci-name=null -; cidr=null -; color=true -; commit-hooks=true -; depth=null -; description=true -; dev=false -; -; diff-ignore-all-space=false -; diff-name-only=false -; diff-no-prefix=false -; diff-dst-prefix=b/ -; diff-src-prefix=a/ -; diff-text=false -; diff-unified=3 -; dry-run=false -; editor=C:\Windows\notepad.exe -; engine-strict=false -; fetch-retries=2 -; fetch-retry-factor=10 -; fetch-retry-maxtimeout=60000 -; fetch-retry-mintimeout=10000 -; fetch-timeout=300000 -; force=false -; foreground-scripts=false -; format-package-lock=true -; fund=true -; git=git -; git-tag-version=true -; global=false -; globalconfig= -; global-style=false -; heading=npm -; https-proxy=null -; if-present=false -; ignore-scripts=false -; -; include-staged=false -; include-workspace-root=false -; init-author-email= -; init-author-name= -; init-author-url= -; init-license=ISC -; init-module=~/.npm-init.js -; init-version=1.0.0 -; init.author.email= -; init.author.name= -; init.author.url= -; init.license=ISC -; init.module=~/.npm-init.js -; init.version=1.0.0 -; install-links=true -; install-strategy=hoisted -; json=false -; key=null -; legacy-bundling=false -; legacy-peer-deps=false -; link=false -; local-address=null -; location=user -; lockfile-version=null -; loglevel=notice -; logs-dir=null -; logs-max=10 -; long=false -; maxsockets=15 -; message=%s -; node-options=null -; noproxy= -; offline=false -; -; omit-lockfile-registry-resolved=false -; only=null -; optional=null -; otp=null -; -; package-lock=true -; package-lock-only=false -; pack-destination=. -; parseable=false -; prefer-offline=false -; prefer-online=false -; prefix= -; preid= -; production=null -; progress=true -; proxy=null -; read-only=false -; rebuild-bundle=true -; registry=https://registry.npmjs.org/ -; replace-registry-host=npmjs -; save=true -; save-bundle=false -; save-dev=false -; save-exact=false -; save-optional=false -; save-peer=false -; save-prefix=^ -; save-prod=false -; scope= -; script-shell=null -; searchexclude= -; searchlimit=20 -; searchopts= -; searchstaleness=900 -; shell=C:\Windows\system32\cmd.exe -; shrinkwrap=true -; sign-git-commit=false -; sign-git-tag=false -; strict-peer-deps=false -; strict-ssl=true -; tag=latest -; tag-version-prefix=v -; timing=false -; tmp=C:\Users\Zachary\AppData\Local\Temp -; umask=0 -; unicode=false -; update-notifier=true -; usage=false -; user-agent=npm/{npm-version} node/{node-version} {platform} {arch} workspaces/{workspaces} {ci} -; userconfig=~/.npmrc -; version=false -; versions=false -; viewer=browser -; which=null -; -; workspaces=null -; workspaces-update=true -; yes=null - -msvs_version=2022 \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json old mode 100644 new mode 100755 index 40c7d82..b875c18 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,20 +7,43 @@ { "type": "node", "request": "launch", - "name": "Launch", - "program": "${workspaceFolder}/app.js", - "skipFiles": [ - "/**" - ] + "name": "Nodemon", + "skipFiles": ["/**"], + "runtimeExecutable": "nodemon", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "restart": true + }, { "type": "node", "request": "launch", - "name": "Nodemon", - "program": "${workspaceFolder}/app.js", - "skipFiles": [ - "/**" - ], + "name": "Nodemon Tamiseur", + "args": ["-r", "dotenv/config", "${workspaceFolder}/src/index.ts", "dotenv_config_path=${workspaceFolder}/.env1"], + "skipFiles": ["/**"], + "runtimeExecutable": "nodemon", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "restart": true + + }, + { + "type": "node", + "request": "launch", + "name": "Nodemon Groove", + "args": ["-r", "dotenv/config", "${workspaceFolder}/src/index.ts", "dotenv_config_path=${workspaceFolder}/.env2"], + "skipFiles": ["/**"], + "runtimeExecutable": "nodemon", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "restart": true + }, + { + "type": "node", + "request": "launch", + "name": "Nodemon Funky", + "args": ["-r", "dotenv/config", "${workspaceFolder}/src/index.ts", "dotenv_config_path=${workspaceFolder}/.env3"], + "skipFiles": ["/**"], "runtimeExecutable": "nodemon", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100755 index 0000000..bdcaa89 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "docker.commands.build": "${containerCommand} build --rm -f \"${dockerfile}\" --target tamiseur -t bot_tamiseur:tamiseur \"${context}\" && ${containerCommand} build --rm -f \"${dockerfile}\" --target funky -t bot_tamiseur:funky \"${context}\" && ${containerCommand} build --rm -f \"${dockerfile}\" --target groove -t bot_tamiseur:groove \"${context}\"", +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 0e951bc..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "type": "docker-build", - "label": "Build Node Image", - "platform": "node", - "dockerBuild": { - "dockerfile": "${workspaceFolder}/Dockerfile", - "context": "${workspaceFolder}", - "pull": true - } - }, - { - "type": "docker-run", - "label": "Run Node Image", - "platform": "node", - "dockerRun": { - "containerName": "BotDiscord-Tamiseur", - "restart": "always", - "network": "host" - }, - "dependsOn": [ - "docker-build" - ] - } - ] -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 index 0d0f875..8597130 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,28 @@ -FROM node:latest +FROM node:alpine as base + ENV NODE_ENV=production WORKDIR /usr/src/app + COPY ["package.json", "package-lock.json*", "./"] -RUN apt-get update -RUN apt-get -y install ffmpeg +RUN apk add --no-cache ffmpeg python3 make g++ RUN npm install --production --verbose && mv node_modules ../ + COPY . . RUN chown -R node /usr/src/app USER node + + +FROM base as tamiseur +RUN mv .env1 .env +RUN rm .env2 .env3 CMD ["npm", "start"] + +FROM base as funky +RUN mv .env2 .env +RUN rm .env1 .env3 +CMD ["npm", "start"] + +FROM base as groove +RUN mv .env3 .env +RUN rm .env1 .env2 +CMD ["npm", "start"] \ No newline at end of file diff --git a/app.js b/app.js deleted file mode 100755 index 79c0514..0000000 --- a/app.js +++ /dev/null @@ -1,67 +0,0 @@ -// PACKAGES -const { Client, Collection, GatewayIntentBits, REST, Routes } = require('discord.js') -const { YouTubeExtractor, SpotifyExtractor } = require('@discord-player/extractor') -const { Player } = require('discord-player') -const fs = require('fs') -require('dotenv').config() - - -// CLIENT INITIALIZATION -let intents = [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildVoiceStates] -const client = new Client({ intents }) - -// EVENTS HANDLING -const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js')) -for (file of eventFiles) { - let event = require(`./events/${file}`) - if (event.once) client.once(event.name, (...args) => { event.execute(...args) }) - else client.on(event.name, (...args) => { event.execute(...args) }) -} - -// COMMANDS HANDLING -client.commands = new Collection() -let commands = [] - -const commandFolders = fs.readdirSync('./commands') -for (folder of commandFolders) { - let folderPath = `./commands/${folder}` - let commandFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.js')) - for (file of commandFiles) { - let command = require(`${folderPath}/${file}`) - if ('data' in command && 'execute' in command) { commands.push(command.data.toJSON()); client.commands.set(command.data.name, command) } - else console.log(`\u001b[1;35m [WARNING] The command at ${`${folderPath}/${file}`} is missing a required "data" or "execute" property.`) - } -} - -// COMMANDS REGISTERING -const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN); -(async () => { - try { await rest.put(Routes.applicationCommands(process.env.DISCORD_APP_ID), { body: commands }) } - catch (error) { console.error(error) } -})() - -// BUTTONS HANDLING -client.buttons = new Collection() - -const buttonFiles = fs.readdirSync('./buttons').filter(file => file.endsWith('.js')) -for (file of buttonFiles) { - let button = require(`./buttons/${file}`) - if ('id' in button && 'execute' in button) client.buttons.set(button.id, button) - else console.log(`\u001b[1;35m [WARNING] The button ${file} is missing a required "id" or "execute" property.`) -} - -// PLAYER INITIALIZATION -const player = new Player(client, { autoRegisterExtractor: false }) -player.extractors.register(YouTubeExtractor) -player.extractors.register(SpotifyExtractor) - -// PLAYER EVENTS HANDLING -const eventPlayerFiles = fs.readdirSync('./eventsPlayer').filter(file => file.endsWith('.js')) -for (file of eventPlayerFiles) { - let event = require(`./eventsPlayer/${file}`) - if (['debug'].includes(event.name)) continue - player.events.on(event.name, (...args) => event.execute(...args)) -} - -// LAUNCH -client.login() \ No newline at end of file diff --git a/buttons/pause.js b/buttons/pause.js deleted file mode 100644 index fe6a513..0000000 --- a/buttons/pause.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'pause', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - await queue.node.setPaused(!queue.node.isPaused()) - return interaction.followUp({ content: 'Musique mise en pause !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/previous.js b/buttons/previous.js deleted file mode 100644 index 0ba5296..0000000 --- a/buttons/previous.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useHistory } = require('discord-player') - -module.exports = { - id: 'previous', - async execute(interaction) { - let history = useHistory(interaction.guild.id) - await history.previous() - return interaction.followUp({ content: 'Musique précédente jouée !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/resume.js b/buttons/resume.js deleted file mode 100644 index 7215973..0000000 --- a/buttons/resume.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'resume', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - await queue.node.setPaused(!queue.node.isPaused()) - return interaction.followUp({ content: 'Musique reprise !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/shuffle.js b/buttons/shuffle.js deleted file mode 100644 index 3bfc7e6..0000000 --- a/buttons/shuffle.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'shuffle', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - await queue.tracks.shuffle() - return interaction.followUp({ content: 'File d\'attente mélangée !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/skip.js b/buttons/skip.js deleted file mode 100644 index 00bbc22..0000000 --- a/buttons/skip.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'skip', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - await queue.node.skip() - return interaction.followUp({ content: 'Musique passée !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/stop.js b/buttons/stop.js deleted file mode 100644 index 6cf7f63..0000000 --- a/buttons/stop.js +++ /dev/null @@ -1,10 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'stop', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - await queue.delete() - return interaction.followUp({ content: 'Musique arrêtée !', ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/volume_down.js b/buttons/volume_down.js deleted file mode 100644 index d74cebb..0000000 --- a/buttons/volume_down.js +++ /dev/null @@ -1,11 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'volume_down', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - let volume = queue.node.volume - 10 - await queue.node.setVolume(volume) - return interaction.followUp({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) - } -} \ No newline at end of file diff --git a/buttons/volume_up.js b/buttons/volume_up.js deleted file mode 100644 index 756b1c4..0000000 --- a/buttons/volume_up.js +++ /dev/null @@ -1,11 +0,0 @@ -const { useQueue } = require('discord-player') - -module.exports = { - id: 'volume_up', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - let volume = queue.node.volume + 10 - await queue.node.setVolume(volume) - return interaction.followUp({ content: `🔊 | Volume modifié à ${volume}% !`, ephemeral: true }) - } -} \ No newline at end of file diff --git a/commands/global/crack.js b/commands/global/crack.js deleted file mode 100644 index 72901e5..0000000 --- a/commands/global/crack.js +++ /dev/null @@ -1,58 +0,0 @@ -const { SlashCommandBuilder, EmbedBuilder, hyperlink } = require('discord.js') -const fs = require('fs') - -const appDir = require('path').dirname(require.main.filename) -require('require-all')(appDir + '/utilsCrack') - -module.exports = { - data: new SlashCommandBuilder().setName('crack').setDescription('Télécharge un crack sur le site online-fix.me !') - .addStringOption(option => option.setName('jeu').setDescription('Quel jeu tu veux DL ?').setRequired(true)), - async execute(interaction) { - await interaction.deferReply() - - let query = interaction.options.getString('jeu') - let games = await search(query, headers.h1) - if (!Array.isArray(games)) { - if (games.toString() == "TypeError: Cannot read properties of undefined (reading 'split')") return interaction.followUp({ content: `J'ai rien trouvé pour "${query}" !` }) - else return interaction.followUp({ content: "Une erreur s'est produite ! ```" + games + "```" }) - } - - let game - if (games.length > 1) { - games = games.slice(0, 9) - let list = '' - for (let i = 0; i < games.length; i++) list += `\n${i + 1}. ${games[i].name} (${games[i].link})` - let message = await interaction.followUp({ content: `J'ai trouvé plusieurs jeux pour "${query}" ! ${list}` }) - - let emojis = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣'] - for (let i = 0; i < games.length; i++) await message.react(emojis[i]) - - // Wait for a reaction to be added by the interaction author. - const filter = (reaction, user) => { - return emojis.includes(reaction.emoji.name) && user.id === interaction.user.id - } - let collected = await message.awaitReactions({ filter, max: 1, time: 5000, errors: ['time'] }) - .catch(() => { return interaction.followUp({ content: 'T\'as mis trop de temps à choisir !' }) }) - console.log(collected) - if (!collected.first) return - let reaction = collected.first() - let index = emojis.indexOf(reaction.emoji.name) - game = games[index] - } - else game = games[0] - - let url = await repo(game, headers.h2) - let file = await torrent(url, headers.h2) - let path = await download(url, file, headers.h2) - let link = await magnet(path) - - let embed = new EmbedBuilder() - .setColor('#ffc370') - .setTitle(game.name) - .setURL(game.link) - .setDescription(`Voici ce que j'ai trouvé pour "${query}".\nTu peux aussi cliquer sur [ce lien](https://angels-dev.fr/magnet/${link}) pour pouvoir télécharger le jeu direct !`) - - await interaction.followUp({ embeds: [embed], files: [path] }) - //fs.unlink(path, (err) => { if (err) throw err }) - } -} \ No newline at end of file diff --git a/commands/global/papa.js b/commands/global/papa.js deleted file mode 100755 index 61b2c66..0000000 --- a/commands/global/papa.js +++ /dev/null @@ -1,28 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { getVoiceConnection, joinVoiceChannel } = require('@discordjs/voice') - -module.exports = { - data: new SlashCommandBuilder() - .setName('papa') - .setDescription('Si papa m\'appelle, je le rejoins !'), - async execute(interaction) { - if (interaction.user.id !== '223831938346123275') return interaction.reply({ content: 'T\'es pas mon père, dégage !' }) - - let botChannel = interaction.guild.members.me.voice.channel - let papaChannel = interaction.member.voice.channel - - if (!papaChannel && botChannel) { - getVoiceConnection(botChannel.guild.id).destroy() - return interaction.reply({ content: 'Je quitte le vocal, papa !' }) - } - else if (!botChannel || botChannel.id !== papaChannel.id) { - joinVoiceChannel({ - channelId: papaChannel.id, - guildId: papaChannel.guild.id, - adapterCreator: papaChannel.guild.voiceAdapterCreator, - }) - return interaction.reply({ content: 'Je rejoins ton vocal, papa !' }) - } - else return interaction.reply({ content: 'Je suis déjà dans ton vocal, papa !' }) - } -} \ No newline at end of file diff --git a/commands/music/pause.js b/commands/music/pause.js deleted file mode 100755 index d56d569..0000000 --- a/commands/music/pause.js +++ /dev/null @@ -1,13 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('pause') - .setDescription('Met en pause la musique.'), - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - queue.node.setPaused(!queue.node.isPaused()) - return await interaction.reply('Musique mise en pause !') - } -} \ No newline at end of file diff --git a/commands/music/player.js b/commands/music/player.js deleted file mode 100755 index 47add8f..0000000 --- a/commands/music/player.js +++ /dev/null @@ -1,15 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') - -const appDir = require('path').dirname(require.main.filename) -const generatePlayer = require(appDir + '/utilsPlayer/generate.js') - -module.exports = { - data: new SlashCommandBuilder() - .setName('player') - .setDescription('Afficher une interface de contrôle de la musique.'), - async execute(interaction) { - let { embed, components } = await generatePlayer(interaction.guild) - if (!components) return await interaction.reply({ embeds: [embed] }) - else return await interaction.reply({ embeds: [embed], components }) - } -} \ No newline at end of file diff --git a/commands/music/previous.js b/commands/music/previous.js deleted file mode 100755 index 8385dff..0000000 --- a/commands/music/previous.js +++ /dev/null @@ -1,13 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useHistory } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('previous') - .setDescription('Joue la musique précédente.'), - async execute(interaction) { - let history = useHistory(interaction.guild.id) - await history.previous() - return await interaction.reply('Musique précédente jouée !') - } -} \ No newline at end of file diff --git a/commands/music/resume.js b/commands/music/resume.js deleted file mode 100755 index 523c14f..0000000 --- a/commands/music/resume.js +++ /dev/null @@ -1,13 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('resume') - .setDescription('Reprendre la musique.'), - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - queue.node.setPaused(!queue.node.isPaused()) - return await interaction.reply('Musique reprise !') - } -} \ No newline at end of file diff --git a/commands/music/shuffle.js b/commands/music/shuffle.js deleted file mode 100755 index adab0fe..0000000 --- a/commands/music/shuffle.js +++ /dev/null @@ -1,13 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('shuffle') - .setDescription('Mélange la file d\'attente.'), - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - queue.tracks.shuffle() - return await interaction.reply('File d\'attente mélangée !') - } -} \ No newline at end of file diff --git a/commands/music/skip.js b/commands/music/skip.js deleted file mode 100755 index e59cafd..0000000 --- a/commands/music/skip.js +++ /dev/null @@ -1,13 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('skip') - .setDescription('Passer la musique en cours.'), - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - queue.node.skip() - return await interaction.reply('Musique passée !') - } -} \ No newline at end of file diff --git a/commands/music/stop.js b/commands/music/stop.js deleted file mode 100755 index 9a13649..0000000 --- a/commands/music/stop.js +++ /dev/null @@ -1,19 +0,0 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') - -module.exports = { - data: new SlashCommandBuilder() - .setName('stop') - .setDescription('Arrêter la musique.'), - async execute(interaction) { - let queue = useQueue(interaction.guild.id) - queue.delete() - - writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', '') - writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', '') - writeEnv('DISCORD_MUSIC_CURRENT_TRACK', '') - writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', '') - - return await interaction.reply('Musique arrêtée !') - } -} \ No newline at end of file diff --git a/events/ready.js b/events/ready.js deleted file mode 100755 index 46fc6cb..0000000 --- a/events/ready.js +++ /dev/null @@ -1,30 +0,0 @@ -const { Events } = require('discord.js') -require('dotenv').config() - -const appDir = require('path').dirname(require.main.filename) -const replay = require(appDir + '/utilsPlayer/replay.js') -const disco = require(appDir + '/utilsPlayer/disco.js') - -//const { DataTypes } = require("sequelize") -//const sequelize = require('../utils/initSequelize.js') - -module.exports = { - name: Events.ClientReady, - once: true, - async execute(client) { - console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`) - - // Check if a music session was active before the bot was restarted - if (process.env.DISCORD_MUSIC_CURRENT_TRACK) await replay(client) - - //try { - // sequelize.authenticate() - // console.log('Connection has been established successfully.') - //} catch (error) { console.error('Unable to connect to the database:', error) } - - var interval = setInterval(async () => { - let state = await disco(client) - if (state === 'clear') clearInterval(interval) - }, 2000) - } -} \ No newline at end of file diff --git a/eventsPlayer/audioTracksAdd.js b/eventsPlayer/audioTracksAdd.js deleted file mode 100644 index f1d699b..0000000 --- a/eventsPlayer/audioTracksAdd.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - name: 'audioTracksAdd', - async execute(queue, track) { - // Emitted when the player adds multiple songs to its queue - queue.metadata.channel.send(`Ajout de ${track.length} musiques à la file d'attente !`) - } -} \ No newline at end of file diff --git a/eventsPlayer/emptyQueue.js b/eventsPlayer/emptyQueue.js deleted file mode 100644 index e5ad871..0000000 --- a/eventsPlayer/emptyQueue.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - name: 'emptyQueue', - async execute(queue, track) { - // Emitted when the player queue has finished - queue.metadata.channel.send("File d'attente vide !") - } -} \ No newline at end of file diff --git a/eventsPlayer/error.js b/eventsPlayer/error.js deleted file mode 100644 index b031621..0000000 --- a/eventsPlayer/error.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - name: 'error', - async execute(queue, error) { - // Emitted when the player queue encounters error - console.log(`\u001b[1;31m General player error event: ${error.message}`) - console.error(error) - } -} \ No newline at end of file diff --git a/eventsPlayer/playerSkip.js b/eventsPlayer/playerSkip.js deleted file mode 100644 index 55c3841..0000000 --- a/eventsPlayer/playerSkip.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - name: 'playerSkip', - async execute(queue, track) { - // Emitted when the audio player fails to load the stream for a song - queue.metadata.channel.send(`Musique **${track.title}** de **${track.author}** passée !`) - } -} \ No newline at end of file diff --git a/eventsPlayer/playerStart.js b/eventsPlayer/playerStart.js deleted file mode 100644 index e376a04..0000000 --- a/eventsPlayer/playerStart.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - name: 'playerStart', - async execute(queue, track) { - // Emitted when the player starts to play a song - writeEnv('DISCORD_MUSIC_CURRENT_TRACK', track.url) - - queue.metadata.channel.send(`Lecture de **${track.title}** de **${track.author}** !`) - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 index 2aa0f4f..1e07c37 --- a/package-lock.json +++ b/package-lock.json @@ -1,101 +1,130 @@ { "name": "bot_tamiseur", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bot_tamiseur", - "version": "1.0.0", + "version": "2.0.0", "dependencies": { - "@discord-player/equalizer": "^0.2.1", - "@discord-player/extractor": "^4.3.1", + "@discord-player/equalizer": "^0.2.3", + "@discord-player/extractor": "^4.4.6", "@discordjs/opus": "^0.9.0", - "@discordjs/voice": "^0.16.0", - "axios": "^1.4.0", - "bufferutil": "^4.0.7", - "discord-player": "^6.5.0", - "discord.js": "^14.11.0", - "dotenv": "^16.1.4", + "@discordjs/voice": "^0.16.1", + "axios": "^1.6.5", + "bufferutil": "^4.0.8", + "discord-player": "^6.6.7", + "discord.js": "^14.14.1", + "dotenv": "^16.3.1", "iconv-lite": "^0.6.3", - "libsodium-wrappers": "^0.7.11", - "mariadb": "^3.1.2", - "opusscript": "^0.1.0", - "parse-torrent": "^11.0.12", - "play-dl": "^1.9.6", - "prism-media": "^1.3.5", + "jsdom": "^23.2.0", + "libsodium-wrappers": "^0.7.13", + "mariadb": "^3.2.3", + "parse-torrent": "^9.1.5", "require-all": "^3.0.0", - "sequelize": "^6.32.0", - "sqlite3": "^5.1.6", - "utf-8-validate": "^6.0.3" + "sqlite3": "^5.1.7", + "utf-8-validate": "^6.0.3", + "youtube-ext": "^1.1.16" }, "devDependencies": { - "eslint": "^8.42.0", - "nodemon": "^2.0.22", - "prettier": "^2.8.8" + "@types/parse-torrent": "^5.8.7", + "eslint": "^8.56.0", + "nodemon": "^3.0.2", + "prettier": "^3.2.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", + "integrity": "sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^2.3.1", + "is-potential-custom-element-name": "^1.0.1" } }, "node_modules/@discord-player/equalizer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.2.1.tgz", - "integrity": "sha512-PPjX8TBwzM85YKEdpYYL8aGbdSLIk9RK1h/uU5jeyiF6Uu5CiLH/XctDfcGW8cSgoaU4J0R6a8svCs9yhzHXSw==" + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@discord-player/equalizer/-/equalizer-0.2.3.tgz", + "integrity": "sha512-71UAepYMbHTg2QQLXQAgyuXYHrgAYpJDxjg9dRWfTUNf+zfOAlyJEiRRk/WFhQyGu6m23iLR/H/JxgF4AW8Csg==" }, "node_modules/@discord-player/extractor": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.3.1.tgz", - "integrity": "sha512-f8EwbQkplZQdVb4pCazc+5zo57y4gkPCl4Zq+3nHhwD+lz03OSmFGfoU6Ho9InBbx6S6PthO6CSPyFXN3sH6nw==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.4.6.tgz", + "integrity": "sha512-jo511D+YOnBptfC+mp775kVXKuCfoWulqOhk82PBmRmwNLPfzBEyPQM+vOlzrNsmoRD1p3mBBXEOnFnuyE9o3w==", "dependencies": { "file-type": "^16.5.4", - "genius-lyrics": "^4.4.3", + "genius-lyrics": "^4.4.6", + "isomorphic-unfetch": "^4.0.2", "node-html-parser": "^6.1.4", "reverbnation-scraper": "^2.0.0", - "soundcloud.ts": "^0.5.0", - "spotify-url-info": "^3.2.5", - "youtube-sr": "^4.3.4" + "soundcloud.ts": "^0.5.2", + "spotify-url-info": "^3.2.6", + "youtube-sr": "^4.3.9" } }, + "node_modules/@discord-player/ffmpeg": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@discord-player/ffmpeg/-/ffmpeg-0.1.0.tgz", + "integrity": "sha512-0kW6q4gMQN2B4Z4EzmUgXrKQSXXmyhjdZBBZ/6jSHZ9fh814oOu+JXP01VvtWHwTylI7qJHIctEWtSyjEubCJg==" + }, + "node_modules/@discord-player/opus": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@discord-player/opus/-/opus-0.1.2.tgz", + "integrity": "sha512-yF0m+pW7H9RCbRcgk/i6vv47tlWxaCHjp6/F0W4GXZMGZ0pcvZaxk8ic7aFPc3+IoDvrAHvWNomLq+JeFzdncA==" + }, "node_modules/@discord-player/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@discord-player/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-yPxfdO2N3i2YEEiwlLDNyuBEdnhV1mZaC7im2BI4FKn3ak1UAtVcbKeJhdd/va0A170+PZs3zUKVGldY0z/+ng==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@discord-player/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-UklWUT7BcZEkBgywM9Cmpo2nwj3SQ9Wmhu6ml1uy/YRQnY8IRdZEHD84T2kfjOg4LVZek0ej1VerIqq7a9PAHQ==", "dependencies": { "@discordjs/collection": "^1.1.0" } }, "node_modules/@discordjs/builders": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", - "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", + "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", "dependencies": { - "@discordjs/formatters": "^0.3.1", - "@discordjs/util": "^0.3.1", - "@sapphire/shapeshift": "^3.8.2", - "discord-api-types": "^0.37.41", + "@discordjs/formatters": "^0.3.3", + "@discordjs/util": "^1.0.2", + "@sapphire/shapeshift": "^3.9.3", + "discord-api-types": "0.37.61", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/collection": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", - "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/formatters": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", - "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", + "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", "dependencies": { - "discord-api-types": "^0.37.41" + "discord-api-types": "0.37.61" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/node-pre-gyp": { @@ -117,6 +146,109 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@discordjs/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/node-fetch": { + "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==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@discordjs/node-pre-gyp/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@discordjs/node-pre-gyp/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==" + }, + "node_modules/@discordjs/node-pre-gyp/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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/@discordjs/opus": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.9.0.tgz", @@ -130,124 +262,86 @@ "node": ">=12.0.0" } }, + "node_modules/@discordjs/opus/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, "node_modules/@discordjs/rest": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", - "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", + "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/util": "^0.3.0", + "@discordjs/collection": "^2.0.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.2", - "discord-api-types": "^0.37.41", - "file-type": "^18.3.0", - "tslib": "^2.5.0", - "undici": "^5.22.0" + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "magic-bytes.js": "^1.5.0", + "tslib": "^2.6.2", + "undici": "5.27.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, - "node_modules/@discordjs/rest/node_modules/file-type": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.3.0.tgz", - "integrity": "sha512-pkPZ5OGIq0TYb37b8bHDLNeQSe1H2KlaQ2ySGpJkkr2KZdaWsO4QhPzHA0mQcsUW2cSqJk+4gM/UyLz/UFbXdQ==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/@discordjs/rest/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/@discordjs/rest/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/@discordjs/rest/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": ">=18" } }, "node_modules/@discordjs/util": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", - "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", + "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/voice": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.16.0.tgz", - "integrity": "sha512-ToGCvHD1cBscuW3p+C7zOF5+L7MJmU4GjdOARfNk9mkHyFFZq4grK+Sxr3QXKbp27DtfDBc9uqD4GUOYgxngfA==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.16.1.tgz", + "integrity": "sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==", "dependencies": { - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.37", + "@types/ws": "^8.5.9", + "discord-api-types": "0.37.61", "prism-media": "^1.3.5", - "tslib": "^2.5.0", - "ws": "^8.13.0" + "tslib": "^2.6.2", + "ws": "^8.14.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/ws": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", - "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", + "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", + "@discordjs/collection": "^2.0.0", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.4", - "@vladfrangu/async_event_emitter": "^2.2.1", - "discord-api-types": "^0.37.41", - "tslib": "^2.5.0", - "ws": "^8.13.0" + "@types/ws": "^8.5.9", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "tslib": "^2.6.2", + "ws": "^8.14.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "engines": { + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -266,23 +360,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -298,14 +392,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -313,13 +415,13 @@ "optional": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -340,30 +442,11 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -424,47 +507,35 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.1.tgz", + "integrity": "sha512-1RdpsmDQR/aWfp8oJzPtn4dNQrbpqSL5PIA0uAB/XwerPXUf994Ug1au1e7uGcD7ei8/F63UDjr5GWps1g/HxQ==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz", - "integrity": "sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.5.tgz", + "integrity": "sha512-AGdHe+51gF7D3W8hBfuSFLBocURDCXVQczScTHXDS3RpNjNgrktIx/amlz5y8nHhm8SAdFt/X8EF8ZSfjJ0tnA==", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=v18" } }, "node_modules/@sapphire/snowflake": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.2.tgz", - "integrity": "sha512-KJwlv5gkGjs1uFV7/xx81n3tqgBwBJvH94n1xDyH3q+JSmtsMeSleJffarEBfG2yAFeJiFA4BnGOK6FFPHc19g==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, - "node_modules/@thaunknown/thirty-two": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@thaunknown/thirty-two/-/thirty-two-1.0.3.tgz", - "integrity": "sha512-bD6PvWbaf53JC04O7WnGDjqZBDgja/KT2Jd/6I2vJBIy+DLmQfQJZZ/G+16nAkVq1yGTIkO4rfc4RlH0DmEEqA==", - "dependencies": { - "uint8-util": "^2.1.9" - }, - "engines": { - "node": ">=0.2.6" - } - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -479,46 +550,66 @@ "node": ">= 6" } }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + "version": "7946.0.13", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz", + "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==" }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "node_modules/@types/validator": { - "version": "13.7.16", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.16.tgz", - "integrity": "sha512-VyKmLktUHYLbrSbsRi241MSUlGYomQgK/tfCNpej3Gt5qDOM10AZ3nU2aR2s5JritClXuOBu4K7MkywVW/Y6Ow==" - }, - "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==", + "node_modules/@types/magnet-uri": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/magnet-uri/-/magnet-uri-5.1.5.tgz", + "integrity": "sha512-SbBjlb1KGe38VfjRR+mwqztJd/4skhdKkRbIzPDhTy7IAeEAPZWIVSEkZw00Qr4ZZOGR3/ATJ20WWPBfrKHGdA==", + "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/node": { + "version": "20.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", + "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/parse-torrent": { + "version": "5.8.7", + "resolved": "https://registry.npmjs.org/@types/parse-torrent/-/parse-torrent-5.8.7.tgz", + "integrity": "sha512-vZtYe450hO+KL7B5fejM8CHWg1LPZKeVXlolphPsWf6n4H0ZUlI6ICbqHoaFmH7JQmU2yRbGgyvqqizdFuGPFQ==", + "dev": true, + "dependencies": { + "@types/magnet-uri": "*", + "@types/node": "*", + "@types/parse-torrent-file": "*" + } + }, + "node_modules/@types/parse-torrent-file": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/parse-torrent-file/-/parse-torrent-file-4.0.6.tgz", + "integrity": "sha512-SxqVth0Iv0WuEkqWS5MaY4S4Tlyi+QHkElQREvsUPw2xHcPgKyQ2dkJRRv5vAxmLzH+tnMdOj1Nws/wsenbzUw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.1.tgz", - "integrity": "sha512-XtUEAS0m6uVddXW+EImGunLiJZzWNWAZQBoQCUneowrYXPQ6y7c0iWEm/wVYyGpTixTIhUfLRSoYCwojL64htA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz", + "integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -529,21 +620,10 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -562,24 +642,22 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "optional": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -657,15 +735,16 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/argparse": { @@ -680,11 +759,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -694,31 +773,41 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/bencode": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.0.3.tgz", - "integrity": "sha512-aP282ducX2oSLiopRaPxvO6GMOsn0teN122hvlQQXlIr0fJC+Iirea6tmOWSLWPd+GtJf2YF6+YlbF7Wz90rIA==", - "dependencies": { - "uint8-util": "^2.1.6" - }, - "engines": { - "node": ">=12.20.0" - } + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" }, "node_modules/bep53-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-2.0.0.tgz", - "integrity": "sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==", - "engines": { - "node": ">=12.20.0" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-1.1.1.tgz", + "integrity": "sha512-ct6s33iiwRCUPp9KXnJ4QMWDgHIgaw36caK/5XEQ9L8dCzSQlJt1Vk6VmHh1VD4AlGCAI4C2zmtfItifBBPrhQ==" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" } }, "node_modules/binary-extensions": { @@ -730,6 +819,43 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob-to-buffer": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.9.tgz", + "integrity": "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==", + "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/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -756,10 +882,33 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -768,17 +917,6 @@ "node": ">=6.14.2" } }, - "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" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -845,42 +983,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -984,32 +1086,6 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, - "node_modules/cross-fetch-ponyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz", - "integrity": "sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA==", - "dependencies": { - "abort-controller": "^3.0.0", - "node-fetch": "^3.3.0" - } - }, - "node_modules/cross-fetch-ponyfill/node_modules/node-fetch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", - "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1039,6 +1115,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -1050,6 +1138,17 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -1058,6 +1157,18 @@ "node": ">= 12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1074,6 +1185,33 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1101,71 +1239,107 @@ "node": ">=0.10" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { "node": ">=8" } }, "node_modules/discord-api-types": { - "version": "0.37.41", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.41.tgz", - "integrity": "sha512-FaPGBK9hx3zqSRX1x3KQWj+OElAJKmcyyfcdCy+U4AKv+gYuIkRySM7zd1So2sE4gc1DikkghkSBgBgKh6pe4Q==" + "version": "0.37.61", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", + "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" }, "node_modules/discord-player": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.5.0.tgz", - "integrity": "sha512-rSS0kpbQyeIGF/NvkE+obpLnKP1as2Ca+7kvM/bU5Pp4I1DWyc8zwRhJMELRGrLDeXZk1wvHUFfFLVC587VqYw==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.6.7.tgz", + "integrity": "sha512-8y5TBJTF3vut4WJZFfrc8m7yXIkOr0WNbdKiU5I3MADWZQUlRaMBTGS4NO03Vq13nZZfK0c4XVUZuqtydIKp4w==", "dependencies": { - "@discord-player/equalizer": "^0.2.1", - "@discord-player/utils": "^0.2.1", - "@discordjs/voice": "latest", + "@discord-player/equalizer": "^0.2.3", + "@discord-player/ffmpeg": "^0.1.0", + "@discord-player/utils": "^0.2.2", + "discord-voip": "^0.1.3", + "ip": "^1.1.8", "libsodium-wrappers": "^0.7.10" }, "funding": { "url": "https://github.com/Androz2091/discord-player?sponsor=1" }, "peerDependencies": { - "@discord-player/extractor": "^4.3.1", - "discord.js": "14.x", - "youtube-sr": "4.x" + "@discord-player/extractor": "^4.4.6" } }, - "node_modules/discord.js": { - "version": "14.11.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.0.tgz", - "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==", + "node_modules/discord-voip": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/discord-voip/-/discord-voip-0.1.3.tgz", + "integrity": "sha512-9DWY5/BLPXeldVwPr8/ggGjggTYOTw77aGQc3+4n5K54bRbbiJ9DUJc+mJzDiSLoHN3f286eRGACJYtrUu27xA==", "dependencies": { - "@discordjs/builders": "^1.6.3", - "@discordjs/collection": "^1.5.1", - "@discordjs/formatters": "^0.3.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", - "@discordjs/ws": "^0.8.3", - "@sapphire/snowflake": "^3.4.2", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.41", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.0", - "undici": "^5.22.0", + "@discord-player/ffmpeg": "^0.1.0", + "@discord-player/opus": "^0.1.2", + "@types/ws": "^8.5.5", + "discord-api-types": "^0.37.50", + "prism-media": "^1.3.5", + "tslib": "^2.6.1", "ws": "^8.13.0" }, "engines": { "node": ">=16.9.0" } }, + "node_modules/discord.js": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", + "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "dependencies": { + "@discordjs/builders": "^1.7.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.3.3", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@discordjs/ws": "^1.0.2", + "@sapphire/snowflake": "3.5.1", + "@types/ws": "8.5.9", + "discord-api-types": "0.37.61", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "2.6.2", + "undici": "5.27.2", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/discord.js/node_modules/@types/ws": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/discord.js/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1230,9 +1404,9 @@ } }, "node_modules/dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" }, @@ -1240,11 +1414,6 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, - "node_modules/dottie": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", - "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1259,6 +1428,14 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -1298,27 +1475,28 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1328,7 +1506,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -1338,9 +1515,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1354,9 +1530,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1370,9 +1546,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1382,12 +1558,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -1440,10 +1616,10 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "engines": { "node": ">=6" } @@ -1466,9 +1642,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1524,6 +1700,11 @@ "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", @@ -1553,12 +1734,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -1566,15 +1748,15 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -1614,6 +1796,11 @@ "node": ">=12.20.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -1631,9 +1818,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -1645,44 +1832,49 @@ } }, "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "wide-align": "^1.1.5" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/genius-lyrics": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/genius-lyrics/-/genius-lyrics-4.4.3.tgz", - "integrity": "sha512-06L8GUg49FrUYEmSQvrSH74RH5S+qyerHwBpvk8vZLwWgpEw4mIWZDob5IpXT1ryhqazM9K6CXGNucKYPO8kng==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/genius-lyrics/-/genius-lyrics-4.4.6.tgz", + "integrity": "sha512-TeSF4qXwLm+Nl8wUX+WUTJlEhPBanMw9EWpIHE2a/Qs4y2NBK99AHYfZJc73H1HVkZj4zPfscuGWlkQbbh0pDA==", "dependencies": { - "cheerio": "^1.0.0-rc.9", - "undici": "^5.8.2" + "node-html-parser": "^6.1.9", + "undici": "^5.24.0" } }, "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1715,9 +1907,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1768,22 +1960,15 @@ "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/http-cache-semantics": { @@ -1793,29 +1978,27 @@ "optional": true }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/humanize-ms": { @@ -1858,9 +2041,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -1912,14 +2095,6 @@ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "optional": true }, - "node_modules/inflection": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", - "engines": [ - "node >= 0.4.0" - ] - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1934,11 +2109,15 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "optional": true + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -2005,12 +2184,26 @@ "node": ">=8" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "devOptional": true }, + "node_modules/isomorphic-unfetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-4.0.2.tgz", + "integrity": "sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==", + "dependencies": { + "node-fetch": "^3.2.0", + "unfetch": "^5.0.0" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2023,6 +2216,51 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", + "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", + "dependencies": { + "@asamuzakjp/dom-selector": "^2.0.1", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2035,6 +2273,15 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2049,16 +2296,16 @@ } }, "node_modules/libsodium": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz", - "integrity": "sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A==" + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.13.tgz", + "integrity": "sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==" }, "node_modules/libsodium-wrappers": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz", - "integrity": "sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz", + "integrity": "sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==", "dependencies": { - "libsodium": "^0.7.11" + "libsodium": "^0.7.13" } }, "node_modules/locate-path": { @@ -2093,17 +2340,22 @@ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, + "node_modules/magic-bytes.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.8.0.tgz", + "integrity": "sha512-lyWpfvNGVb5lu8YUAbER0+UMBTdR63w2mcSUlhhBTyVbxJvjgqwyAf3AZD6MprgK0uHuBoWXSDAMWLupX83o3Q==" + }, "node_modules/magnet-uri": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-7.0.5.tgz", - "integrity": "sha512-Ke+dDiYHK1Rq/ZyGUAgk7NIkoypivxolTj/A0qr60ypP0FjeP+NTUNEhr965HsRan0zGxKEBK73+SsjRyJWkXg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-6.2.0.tgz", + "integrity": "sha512-O9AgdDwT771fnUj0giPYu/rACpz8173y8UXCSOdLITjOVfBenZ9H9q3FqQmveK+ORUMuD+BkKNSZP8C3+IMAKQ==", "funding": [ { "type": "github", @@ -2119,12 +2371,8 @@ } ], "dependencies": { - "@thaunknown/thirty-two": "^1.0.3", - "bep53-range": "^2.0.0", - "uint8-util": "^2.1.9" - }, - "engines": { - "node": ">=12.20.0" + "bep53-range": "^1.1.0", + "thirty-two": "^1.0.2" } }, "node_modules/make-dir": { @@ -2142,9 +2390,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2176,6 +2424,45 @@ "node": ">= 10" } }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2189,15 +2476,15 @@ } }, "node_modules/mariadb": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.1.2.tgz", - "integrity": "sha512-ILlC54fkXkvizTJZC1uP7f/REBxuu1k+OWzpiIITIEdS+dGIjFe/Ob3EW9KrdtBa38l3z+odz6elva0RG/y5og==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.2.3.tgz", + "integrity": "sha512-Hyc1ehdUJwzvvzcLU2juZS528wJ6oE8pUlpgY0BAOdpKWcdN1motuugi5lC3jkpCkFpyNknHG7Yg66KASl3aPg==", "dependencies": { "@types/geojson": "^7946.0.10", "@types/node": "^17.0.45", "denque": "^2.1.0", "iconv-lite": "^0.6.3", - "lru-cache": "^7.14.0" + "lru-cache": "^10.0.1" }, "engines": { "node": ">= 12" @@ -2208,6 +2495,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2227,6 +2519,17 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2238,6 +2541,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -2337,30 +2648,21 @@ "node": ">=10" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2376,10 +2678,21 @@ "node": ">= 0.6" } }, + "node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" }, "node_modules/node-domexception": { "version": "1.0.0", @@ -2400,22 +2713,20 @@ } }, "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": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-gyp": { @@ -2443,84 +2754,37 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/node-html-parser": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.5.tgz", - "integrity": "sha512-fAaM511feX++/Chnhe475a0NHD8M7AxDInsqQpz6x63GRF7xYNdS8Vo5dKsIVPgsOvG7eioRRTZQnWBrhDHBSg==", + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", + "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", + "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", "dev": true, "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -2529,22 +2793,13 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2554,15 +2809,6 @@ "node": ">=4" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2599,14 +2845,18 @@ } }, "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, "dependencies": { - "are-we-there-yet": "^2.0.0", + "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", + "gauge": "^4.0.3", "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/nth-check": { @@ -2637,27 +2887,22 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/opusscript": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.1.0.tgz", - "integrity": "sha512-Jc1d2u7AutNcUCoSpshhStW4CVAZXqh8n832ZTFUwZowof+xq2JW4umsWwAUOdtczn2z0UJMkUoTYBFT8qto9g==" - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2716,9 +2961,9 @@ } }, "node_modules/parse-torrent": { - "version": "11.0.12", - "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-11.0.12.tgz", - "integrity": "sha512-eraUrzTwBciRSkDSQhcjp/EVoc1Z0KVO85bQlI6LCGplByXloaul5SnL0qvRO0wK+YSoNjOfJUxTS9xpgjIkdA==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-9.1.5.tgz", + "integrity": "sha512-K8FXRwTOaZMI0/xuv0dpng1MVHZRtMJ0jRWBJ3qZWVNTrC1MzWUxm9QwaXDz/2qPhV2XC4UIHI92IGHwseAwaA==", "funding": [ { "type": "github", @@ -2734,18 +2979,16 @@ } ], "dependencies": { - "bencode": "^3.0.3", - "cross-fetch-ponyfill": "^1.0.3", - "get-stdin": "^9.0.0", - "magnet-uri": "^7.0.5", + "bencode": "^2.0.2", + "blob-to-buffer": "^1.2.9", + "get-stdin": "^8.0.0", + "magnet-uri": "^6.2.0", "queue-microtask": "^1.2.3", - "uint8-util": "^2.1.9" + "simple-get": "^4.0.1", + "simple-sha1": "^3.1.0" }, "bin": { "parse-torrent": "bin/cmd.js" - }, - "engines": { - "node": ">=12.20.0" } }, "node_modules/parse5": { @@ -2759,18 +3002,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2809,11 +3040,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2826,20 +3052,29 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/play-audio": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz", - "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==" - }, - "node_modules/play-dl": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.6.tgz", - "integrity": "sha512-JW44bQbME9fNfGhGXQ/rdcsHr4BfgJabVlSgpS9QY/NscfprFH1asv+q9atrZThP3+hHIpgtFNABccg9rFWlwg==", + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dependencies": { - "play-audio": "^0.5.2" + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=10" } }, "node_modules/prelude-ls": { @@ -2852,15 +3087,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.2.tgz", + "integrity": "sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -2915,21 +3150,39 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2949,6 +3202,28 @@ } ] }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -2997,6 +3272,19 @@ "node": ">= 0.8" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3015,11 +3303,6 @@ "node": ">= 4" } }, - "node_modules/retry-as-promised": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3038,6 +3321,44 @@ "node-fetch": "^2.6.0" } }, + "node_modules/reverbnation-scraper/node_modules/node-fetch": { + "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==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/reverbnation-scraper/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/reverbnation-scraper/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==" + }, + "node_modules/reverbnation-scraper/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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3052,6 +3373,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3075,6 +3401,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rusha": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz", + "integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3099,10 +3430,21 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3124,75 +3466,6 @@ "node": ">=10" } }, - "node_modules/sequelize": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.0.tgz", - "integrity": "sha512-gMd1M6kPANyrCeU/vtgEP5gnse7sVsiKbJyz7p4huuW8zZcRopj47UlglvdrMuIoqksZmsUPfApmMo6ZlJpcvg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", - "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.7.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -3224,25 +3497,68 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "node_modules/simple-sha1": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-3.1.0.tgz", + "integrity": "sha512-ArTptMRC1v08H8ihPD6l0wesKvMfF9e8XL5rIHPanI7kGOsSsbY514MwVu6X1PITHCTB2F08zB7cyEbfc4wQjg==", + "dependencies": { + "queue-microtask": "^1.2.2", + "rusha": "^0.8.13" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" } }, "node_modules/smart-buffer": { @@ -3283,42 +3599,69 @@ "node": ">= 10" } }, - "node_modules/soundcloud.ts": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.5.0.tgz", - "integrity": "sha512-QZLJ0X+/hpj8/5rqTGnLl/U4d07qcobrfXrM3+VlCQcXG5v+7MZ6tVHDFPsDH0MWM8op541RwhvKc8JqWlyUHA==", + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { - "undici": "^5.21.2" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "node_modules/soundcloud.ts": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.5.2.tgz", + "integrity": "sha512-/pc72HWYJpSpup+mJBE9pT31JsrMcxJGBlip3Vem+0Fsscg98xh1/7I2nCpAKuMAeV6MVyrisI8TfjO6T7qKJg==", + "dependencies": { + "undici": "^5.22.1" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/spotify-uri": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-3.0.4.tgz", - "integrity": "sha512-wtofZNzMjPXR1KD2/gw8F/7ng1QwxpfFbrVgcRaAh0oSJ6ZGC5ln+IBptIRuti1dYGOxJqEIvDc88ctLvTSWiQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-4.0.1.tgz", + "integrity": "sha512-dEt8UN5fSsZpcPk8HOEHkv29U71kefKjcYt2dopsShrkIZhXtDXe9Xse4xq0GW6831LnEZFry5mpzm1HV/TNLw==", "engines": { "node": ">= 16" } }, "node_modules/spotify-url-info": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.2.5.tgz", - "integrity": "sha512-5LpA8PznECfTPRVcgYSyYOn7dr3aq+sHgl3JrDDKT7NVJ8exEhFD1NsmR8/kObc6qlr0H6t+AZDVVfv3HiEKaQ==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.2.10.tgz", + "integrity": "sha512-xQBjzkRwoZE7UzMoGr2XPFcd3TMVccF8Kjqo8dDJFfDiilkdYo69ovVBcUMMObndo3zgzTmTxrFOM0jJjDI2Gw==", "dependencies": { "himalaya": "~1.1.0", - "spotify-uri": "~3.0.3" + "spotify-uri": "~4.0.0" }, "engines": { "node": ">= 12" } }, "node_modules/sqlite3": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", - "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", "hasInstallScript": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", "tar": "^6.1.11" }, "optionalDependencies": { @@ -3333,11 +3676,6 @@ } } }, - "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -3350,14 +3688,6 @@ "node": ">= 8" } }, - "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", @@ -3430,10 +3760,15 @@ "node": ">=8" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3446,6 +3781,37 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -3460,6 +3826,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==", + "engines": { + "node": ">=0.2.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", @@ -3488,11 +3862,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" - }, "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -3520,10 +3889,30 @@ "node": "*" } }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } }, "node_modules/ts-mixer": { "version": "6.0.3", @@ -3531,9 +3920,20 @@ "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } }, "node_modules/type-check": { "version": "0.4.0", @@ -3559,14 +3959,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uint8-util": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.1.9.tgz", - "integrity": "sha512-twtktH1wpZwM8ivYXs2HL3nqHRosKGOxrPnfLxqYnzOR0RrIKbn/GrUZinXJ9n8tWzW8VIW++IpES4LYtGHSDQ==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -3574,16 +3966,26 @@ "dev": true }, "node_modules/undici": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.0.tgz", - "integrity": "sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unfetch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", + "integrity": "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==" + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -3602,6 +4004,14 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3611,6 +4021,15 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/utf-8-validate": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz", @@ -3628,42 +4047,62 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=18" } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", "engines": { "node": ">= 8" } }, "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==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } }, "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==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -3689,32 +4128,15 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/wkx": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, @@ -3731,6 +4153,19 @@ } } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3748,10 +4183,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/youtube-ext": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/youtube-ext/-/youtube-ext-1.1.16.tgz", + "integrity": "sha512-vyzHSwxlCAwqWUxZKJ/5g139BgnbmZFTy9I0nxDwqlbAh74dB1LjayCoB5BgLaaIkSMruEQwlf5bF+EeR235qA==", + "dependencies": { + "undici": "^5.26.3" + } + }, "node_modules/youtube-sr": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.4.tgz", - "integrity": "sha512-olSYcR80XigutCrePEXBX3/RJJrWfonJQj7+/ggBiWU0CzTDLE1q8+lpWTWCG0JpzhzILp/IB/Bq/glGqqr1TQ==" + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.10.tgz", + "integrity": "sha512-YTpIWy2c1XLN4VpsUuZTDNXpJ2sLZQyG0kX1vq3nymHhDKro2SoeODey3pZazW+6AjfmNxoSnI8pCSzPrEa3jw==" } } } diff --git a/package.json b/package.json index 17dc186..a6a45c1 100755 --- a/package.json +++ b/package.json @@ -1,42 +1,41 @@ { "name": "bot_tamiseur", - "version": "1.0.0", - "description": "bot_Tamiseur", - "main": "app.js", - "scripts": { - "format": "prettier --write .", - "start": "node app.js", - "dev": "nodemon -e js" - }, + "description": "Listen to music and use fun commands with your friends!", + "version": "2.0.0", "author": { "name": "Zachary Guénot" }, - "devDependencies": { - "eslint": "^8.42.0", - "nodemon": "^2.0.22", - "prettier": "^2.8.8" + "main": "src/index.ts", + "scripts": { + "format": "prettier --write .", + "start": "node src/index.ts", + "dev": "nodemon -e ts src/index.ts", + "build": "tsc" }, - "eslintConfig": {}, "dependencies": { - "@discord-player/equalizer": "^0.2.1", - "@discord-player/extractor": "^4.3.1", + "@discord-player/equalizer": "^0.2.3", + "@discord-player/extractor": "^4.4.6", "@discordjs/opus": "^0.9.0", - "@discordjs/voice": "^0.16.0", - "axios": "^1.4.0", - "bufferutil": "^4.0.7", - "discord-player": "^6.5.0", - "discord.js": "^14.11.0", - "dotenv": "^16.1.4", + "@discordjs/voice": "^0.16.1", + "axios": "^1.6.5", + "bufferutil": "^4.0.8", + "discord-player": "^6.6.7", + "discord.js": "^14.14.1", + "dotenv": "^16.3.1", "iconv-lite": "^0.6.3", - "libsodium-wrappers": "^0.7.11", - "mariadb": "^3.1.2", - "opusscript": "^0.0.8", - "parse-torrent": "^11.0.12", - "play-dl": "^1.9.6", - "prism-media": "^1.3.5", + "jsdom": "^23.2.0", + "libsodium-wrappers": "^0.7.13", + "mariadb": "^3.2.3", + "parse-torrent": "^9.1.5", "require-all": "^3.0.0", - "sequelize": "^6.32.0", - "sqlite3": "^5.1.6", - "utf-8-validate": "^6.0.3" + "sqlite3": "^5.1.7", + "utf-8-validate": "^6.0.3", + "youtube-ext": "^1.1.16" + }, + "devDependencies": { + "@types/parse-torrent": "^5.8.7", + "eslint": "^8.56.0", + "nodemon": "^3.0.2", + "prettier": "^3.2.1" } } diff --git a/buttons/loop.js b/src/buttons/loop.ts old mode 100644 new mode 100755 similarity index 59% rename from buttons/loop.js rename to src/buttons/loop.ts index e82b837..823634c --- a/buttons/loop.js +++ b/src/buttons/loop.ts @@ -1,9 +1,14 @@ -const { useQueue } = require('discord-player') +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' module.exports = { id: 'loop', - async execute(interaction) { - let queue = useQueue(interaction.guild.id) + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + let loop = queue.repeatMode === 0 ? 1 : queue.repeatMode === 1 ? 2 : queue.repeatMode === 2 ? 3 : 0 await queue.setRepeatMode(loop) await interaction.followUp({ content:`Boucle ${loop === 0 ? 'désactivée' : loop === 1 ? 'en mode Titre' : loop === 2 ? 'en mode File d\'Attente' : 'en autoplay'}.`, ephemeral: true }) diff --git a/src/buttons/pause.ts b/src/buttons/pause.ts new file mode 100755 index 0000000..6c5bd31 --- /dev/null +++ b/src/buttons/pause.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'pause', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + await queue.node.setPaused(!queue.node.isPaused()) + return interaction.followUp({ content: 'Musique mise en pause !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/previous.ts b/src/buttons/previous.ts new file mode 100755 index 0000000..07545f3 --- /dev/null +++ b/src/buttons/previous.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useHistory } from 'discord-player' + +module.exports = { + id: 'previous', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let history = useHistory(guild.id) + if (!history) return + + await history.previous() + return interaction.followUp({ content: 'Musique précédente jouée !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/resume.ts b/src/buttons/resume.ts new file mode 100755 index 0000000..fbdbc92 --- /dev/null +++ b/src/buttons/resume.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'resume', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + await queue.node.setPaused(!queue.node.isPaused()) + return interaction.followUp({ content: 'Musique reprise !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/shuffle.ts b/src/buttons/shuffle.ts new file mode 100755 index 0000000..9d56664 --- /dev/null +++ b/src/buttons/shuffle.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'shuffle', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + await queue.tracks.shuffle() + return interaction.followUp({ content: 'File d\'attente mélangée !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/skip.ts b/src/buttons/skip.ts new file mode 100755 index 0000000..b0c47c8 --- /dev/null +++ b/src/buttons/skip.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'skip', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + await queue.node.skip() + return interaction.followUp({ content: 'Musique passée !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/stop.ts b/src/buttons/stop.ts new file mode 100755 index 0000000..82f7cc1 --- /dev/null +++ b/src/buttons/stop.ts @@ -0,0 +1,15 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'stop', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + await queue.delete() + return interaction.followUp({ content: 'Musique arrêtée !', ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/volume_down.ts b/src/buttons/volume_down.ts new file mode 100755 index 0000000..dfe126e --- /dev/null +++ b/src/buttons/volume_down.ts @@ -0,0 +1,16 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'volume_down', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + let volume = queue.node.volume - 10 + await queue.node.setVolume(volume) + return interaction.followUp({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) + } +} \ No newline at end of file diff --git a/src/buttons/volume_up.ts b/src/buttons/volume_up.ts new file mode 100755 index 0000000..c08d4b2 --- /dev/null +++ b/src/buttons/volume_up.ts @@ -0,0 +1,16 @@ +import { ButtonInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + id: 'volume_up', + async execute(interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return + let queue = useQueue(guild.id) + if (!queue) return + + let volume = queue.node.volume + 10 + await queue.node.setVolume(volume) + return interaction.followUp({ content: `🔊 | Volume modifié à ${volume}% !`, ephemeral: true }) + } +} \ No newline at end of file diff --git a/commands/global/amp.js b/src/commands/global/amp.ts old mode 100644 new mode 100755 similarity index 75% rename from commands/global/amp.js rename to src/commands/global/amp.ts index b271996..d03ba32 --- a/commands/global/amp.js +++ b/src/commands/global/amp.ts @@ -1,12 +1,34 @@ -const { SlashCommandBuilder, EmbedBuilder, inlineCode } = require('discord.js') -const dotenv = require('dotenv') -dotenv.config() +import { SlashCommandBuilder, ChatInputCommandInteraction, AutocompleteInteraction, EmbedBuilder, inlineCode } from 'discord.js' +import * as AMP from '../../utils/amp' +import 'dotenv/config' -const appDir = require('path').dirname(require.main.filename) -const API = require('require-all')(appDir + '/utilsAMP') +interface ListInstancesResult { + status: string + data: { + result: [ + Host: { + AvailableInstances: any[] + FriendlyName: string + } + ] + } +} +interface InstanceFields { + name: string + value: string + inline: boolean +} -function failMsg(data) { return `La commande a échouée !\n${inlineCode(`${data.Title}: ${data.Message}`)}` } -function errorMsg(data) { return `Y'a eu une erreur !\n${inlineCode(`${data.error_code}`)}` } +interface failData { + Title: string + Message: string +} +interface errorData { + error_code: string +} + +function failMsg(data: any) { return `La commande a échouée !\n${inlineCode(`${data.Title}: ${data.Message}`)}` } +function errorMsg(data: any) { return `Y'a eu une erreur !\n${inlineCode(`${data.error_code}`)}` } module.exports = { data: new SlashCommandBuilder().setName('amp').setDescription('Accède à mon panel de jeu AMP !') @@ -25,12 +47,13 @@ module.exports = { /*.addSubcommand(subcommand => subcommand.setName('restart').setDescription('Redémarre une instance.') .addStringOption(option => option.setName('name').setDescription("Nom de l'instance").setRequired(true)))*/), - async autocompleteRun(interaction) { + async autocompleteRun(interaction: AutocompleteInteraction) { let query = interaction.options.getString('instance', true) // Check if the SessionID is still valid - let sessionID = dotenv.config().parsed.AMP_SESSIONID - let session = await API.CheckSession(sessionID) + //let sessionID = dotenv.config().parsed.AMP_SESSIONID + let sessionID = process.env.AMP_SESSIONID as string + let session = await AMP.CheckSession(sessionID) if (session.status === 'fail') { if (process.env.AMP_REMEMBER_TOKEN) { // Refresh the SessionID if the RememberMeToken is available @@ -40,7 +63,7 @@ module.exports = { token: process.env.AMP_REMEMBER_TOKEN, rememberMe: true } - let result = await API.Core.Login(details) + let result = await AMP.Core.Login(details) console.log(result) if (result.status === 'success') sessionID = result.data.sessionID else if (result.status === 'fail') return interaction.respond([]) @@ -48,17 +71,18 @@ module.exports = { } else { // If no RememberMeToken is available, ask to login - return await interaction.followUp(`Tu dois te connecter avant d'effectuer une autre commande !`) + //return await interaction.followUp(`Tu dois te connecter avant d'effectuer une autre commande !`) + return await interaction.respond([]) } } else if (session.status === 'error') return interaction.respond([]) - let choices = [] - let result = await API.ADSModule.GetInstances(sessionID) + let choices: any = [] + let result = await AMP.ADSModule.GetInstances(sessionID) if (result.status === 'success') { - let hosts = result.data.result + let hosts = result.data.result as any[] hosts.forEach(host => { - let instances = host.AvailableInstances + let instances = host.AvailableInstances as any[] instances.forEach(instance => { if (instance.FriendlyName.includes(query)) choices.push({ name: `${host.FriendlyName} - ${instance.FriendlyName}`, value: instance.InstanceID }) }) @@ -69,7 +93,7 @@ module.exports = { return interaction.respond(choices) }, - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { // Let the user login if (interaction.options.getSubcommand() == 'login') { // Get a SessionID and a RememberMeToken if wanted @@ -82,7 +106,7 @@ module.exports = { rememberMe: interaction.options.getBoolean('remember') } - let result = await API.Core.Login(details) + let result = await AMP.Core.Login(details) if (result.status === 'success') return await interaction.followUp(`Tu es connecté au panel sous **${result.data.userInfo.Username}** !`) else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data)) else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data)) @@ -90,8 +114,9 @@ module.exports = { await interaction.deferReply() // Check if the SessionID is still valid - let sessionID = dotenv.config().parsed.AMP_SESSIONID - let session = await API.CheckSession(sessionID) + //let sessionID = dotenv.config().parsed.AMP_SESSIONID + let sessionID = process.env.AMP_SESSIONID as string + let session = await AMP.CheckSession(sessionID) if (session.status === 'fail') { console.log(session) @@ -103,7 +128,7 @@ module.exports = { token: process.env.AMP_REMEMBER_TOKEN, rememberMe: true } - let result = await API.Core.Login(details) + let result = await AMP.Core.Login(details) console.log(result) if (result.status === 'success') sessionID = result.data.sessionID else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data)) @@ -118,12 +143,12 @@ module.exports = { if (interaction.options.getSubcommandGroup() == 'instances') { if (interaction.options.getSubcommand() == 'list') { - let result = await API.ADSModule.GetInstances(sessionID) + let result = await AMP.ADSModule.GetInstances(sessionID) as ListInstancesResult if (result.status === 'success') { await interaction.followUp({ content: `${result.data.result.length} hôtes trouvés !` }) result.data.result.forEach(async host => { - let fields = [] + let fields = [] as InstanceFields[] host.AvailableInstances.forEach(instance => { fields.push({ name: instance.FriendlyName, @@ -134,10 +159,10 @@ module.exports = { let embed = new EmbedBuilder() .setTitle(host.FriendlyName) .setDescription(`Liste des ${host.AvailableInstances.length} instances :`) - .setColor(interaction.guild.members.me.displayColor) + .setColor(interaction.guild?.members.me?.displayColor || '#ffc370') .setTimestamp() .setFields(fields) - return await interaction.channel.send({ embeds: [embed] }) + return await interaction.channel?.send({ embeds: [embed] }) }) } else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data)) @@ -145,10 +170,10 @@ module.exports = { } else if (interaction.options.getSubcommand() == 'manage') { let instanceID = interaction.options.getString('instance', true) - let result = await API.ADSModule.ManageInstance(sessionID, instanceID) + let result = await AMP.ADSModule.ManageInstance(sessionID, instanceID) if (result.status === 'success') { - let server = await API.ADSModule.Servers(sessionID, instanceID) + let server = await AMP.ADSModule.Servers(sessionID, instanceID) console.log(server) if (server.status === 'success') return await interaction.followUp(`Ok !`) @@ -160,7 +185,9 @@ module.exports = { } else if (interaction.options.getSubcommand() == 'restart') { let query = interaction.options.getString('name') - let result = await API.ADSModule.RestartInstance(sessionID, query) + if (!query) return + + let result = await AMP.ADSModule.RestartInstance(sessionID, query) if (result.status === 'success') return await interaction.followUp(`Ok !`) else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data)) diff --git a/src/commands/global/crack.ts b/src/commands/global/crack.ts new file mode 100755 index 0000000..508b49d --- /dev/null +++ b/src/commands/global/crack.ts @@ -0,0 +1,58 @@ +import { SlashCommandBuilder, EmbedBuilder, ChatInputCommandInteraction, MessageReaction, User }from 'discord.js' +import * as crack from '../../utils/crack' + +module.exports = { + data: new SlashCommandBuilder().setName('crack').setDescription('Télécharge un crack sur le site online-fix.me !') + .addStringOption(option => option.setName('jeu').setDescription('Quel jeu tu veux DL ?').setRequired(true)), + async execute(interaction: ChatInputCommandInteraction) { + await interaction.deferReply() + + let query = interaction.options.getString('jeu') + if (!query) return + + let games = await crack.search(query) as crack.Game[] + if (!Array.isArray(games)) { + //if (games.toString() == "TypeError: Cannot read properties of undefined (reading 'split')") return interaction.followUp({ content: `J'ai rien trouvé pour "${query}" !` }) + //else return interaction.followUp({ content: "Une erreur s'est produite ! ```" + games + "```" }) + return interaction.followUp({ content: `J'ai rien trouvé pour "${query}" !` }) + } + + let game = {} as crack.Game + if (games.length > 1) { + games = games.slice(0, 9) + let list = '' + for (let i = 0; i < games.length; i++) list += `\n${i + 1}. ${games[i].name} (${games[i].link})` + let message = await interaction.followUp({ content: `J'ai trouvé plusieurs jeux pour "${query}" ! ${list}` }) + + let emojis = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣'] + for (let i = 0; i < games.length; i++) await message.react(emojis[i]) + + // Wait for a reaction to be added by the interaction author. + const filter: any = (reaction: MessageReaction, user: User) => { if (reaction.emoji.name) return emojis.includes(reaction.emoji.name) && user.id === interaction.user.id } + await message.awaitReactions({ filter, max: 1, time: 5000, errors: ['time'] }).then(collected => { + console.log(collected) + if (!collected.first) return + let reaction = collected.first() + let index = emojis.indexOf(reaction?.emoji.name ?? '') + game = games[index] + }).catch(() => { return interaction.followUp({ content: 'T\'as mis trop de temps à choisir !' }) }) + } + else game = games[0] + + let url = await crack.repo(game) + if (!url) return + let file = await crack.torrent(url) + if (!file) return + let filePath = await crack.download(url, file) + if (!filePath) return + let link = await crack.magnet(filePath) + + let embed = new EmbedBuilder() + .setColor('#ffc370') + .setTitle(game.name) + .setURL(game.link) + .setDescription(`Voici ce que j'ai trouvé pour "${query}".\nTu peux aussi cliquer sur [ce lien](https://angels-dev.fr/magnet/${link}) pour pouvoir télécharger le jeu direct !`) + + await interaction.followUp({ embeds: [embed], files: [filePath] }) + } +} \ No newline at end of file diff --git a/src/commands/global/papa.ts b/src/commands/global/papa.ts new file mode 100755 index 0000000..5a20965 --- /dev/null +++ b/src/commands/global/papa.ts @@ -0,0 +1,34 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction, GuildMember } from 'discord.js' +import { getVoiceConnection, joinVoiceChannel } from '@discordjs/voice' + +module.exports = { + data: new SlashCommandBuilder() + .setName('papa') + .setDescription('Si papa m\'appelle, je le rejoins !'), + async execute(interaction: ChatInputCommandInteraction) { + if (interaction.user.id !== '223831938346123275') return interaction.reply({ content: 'T\'es pas mon père, dégage !' }) + + let guild = interaction.guild + if (!guild) return interaction.reply({ content: 'Je ne peux pas rejoindre ton vocal en message privé, papa !' }) + + let member = interaction.member as GuildMember + + let botChannel = guild.members.me?.voice.channel + let papaChannel = member.voice.channel + + if (!papaChannel && botChannel) { + const voiceConnection = getVoiceConnection(guild.id); + if (voiceConnection) voiceConnection.destroy() + return interaction.reply({ content: 'Je quitte le vocal, papa !' }) + } + else if (papaChannel && (!botChannel || botChannel.id !== papaChannel.id)) { + joinVoiceChannel({ + channelId: papaChannel.id, + guildId: papaChannel.guild.id, + adapterCreator: papaChannel.guild.voiceAdapterCreator, + }) + return interaction.reply({ content: 'Je rejoins ton vocal, papa !' }) + } + else return interaction.reply({ content: 'Je suis déjà dans ton vocal, papa !' }) + } +} \ No newline at end of file diff --git a/commands/global/parle.js b/src/commands/global/parle.ts similarity index 67% rename from commands/global/parle.js rename to src/commands/global/parle.ts index 30e6e3b..41dfa4a 100755 --- a/commands/global/parle.js +++ b/src/commands/global/parle.ts @@ -1,21 +1,26 @@ -const { SlashCommandBuilder } = require('discord.js') -const { joinVoiceChannel, createAudioPlayer, createAudioResource, AudioPlayerStatus, EndBehaviorType } = require('@discordjs/voice') -const appDir = require('path').dirname(require.main.filename) +import { SlashCommandBuilder, ChatInputCommandInteraction, GuildMember } from 'discord.js' +import { joinVoiceChannel, createAudioPlayer, createAudioResource, AudioPlayerStatus, EndBehaviorType } from '@discordjs/voice' module.exports = { data: new SlashCommandBuilder() .setName('parle') .setDescription('Fais moi parler par dessus quelqu\'un de chiant dans le vocal') .addUserOption(option => option.setName('user').setDescription('La personne en question').setRequired(true)), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { if (interaction.user.id !== '223831938346123275') return await interaction.reply({ content: 'Tu n\'as pas le droit d\'utiliser cette commande !', ephemeral: true }) let user = interaction.options.getUser('user') - let member = interaction.guild.members.cache.get(user.id) + if (!user) return + let guild = interaction.guild + if (!guild) return + let member = guild.members.cache.get(user.id) as GuildMember + if (!member) return + let caller = interaction.member as GuildMember + if (!caller) return - if (!interaction.member.voice.channel) return await interaction.reply({ content: 'You must be in a voice channel to use this command.', ephemeral: true }) + if (!caller.voice.channel) return await interaction.reply({ content: 'You must be in a voice channel to use this command.', ephemeral: true }) if (!member.voice.channel) return await interaction.reply({ content: 'The member must be in a voice channel to use this command.', ephemeral: true }) - if (interaction.member.voice.channelId !== member.voice.channelId) return await interaction.reply({ content: 'You must be in the same voice channel than the member to use this command.', ephemeral: true }) + if (caller.voice.channelId !== member.voice.channelId) return await interaction.reply({ content: 'You must be in the same voice channel than the member to use this command.', ephemeral: true }) await interaction.reply({ content: 'Je vais parler par dessus cette personne !', ephemeral: true }) @@ -45,26 +50,27 @@ module.exports = { player.on(AudioPlayerStatus.Idle, () => { playing = false }) let connection = joinVoiceChannel({ - channelId: interaction.member.voice.channelId, - guildId: interaction.guildId, - adapterCreator: interaction.guild.voiceAdapterCreator, + channelId: caller.voice.channelId as string, + guildId: interaction.guildId as string, + adapterCreator: guild.voiceAdapterCreator, selfDeaf: false }) connection.subscribe(player) let stream = connection.receiver.subscribe(user.id, { end: { behavior: EndBehaviorType.Manual } }) stream.on('data', (chunk) => { + if (!user) return if (connection.receiver.speaking.users.has(user.id) && !playing) { playing = true - let resource = createAudioResource(appDir + '/parle.mp3', { inlineVolume: true }) + let resource = createAudioResource('../../static/parle.mp3', { inlineVolume: true }) //let resource = createAudioResource(file.attachments.first().url, { inlineVolume: true }) - resource.volume.setVolume(0.2) + if (resource.volume) resource.volume.setVolume(0.2) player.play(resource) } }) interaction.client.on('voiceStateUpdate', (oldState, newState) => { - if (oldState.id === member.id && newState.channelId !== interaction.member.voice.channelId) { + if (oldState.id === member.id && newState.channelId !== caller.voice.channelId) { stream.destroy() connection.disconnect() } diff --git a/commands/global/ping.js b/src/commands/global/ping.ts similarity index 72% rename from commands/global/ping.js rename to src/commands/global/ping.ts index 43ca90f..1b78558 100755 --- a/commands/global/ping.js +++ b/src/commands/global/ping.ts @@ -1,10 +1,10 @@ -const { SlashCommandBuilder } = require('discord.js') +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' module.exports = { data: new SlashCommandBuilder() .setName('ping') .setDescription('Check the latency of the bot'), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { let sent = await interaction.reply({ content: 'Pinging...', fetchReply: true }) interaction.editReply(`Websocket heartbeat: ${interaction.client.ws.ping}ms.\nRoundtrip latency: ${sent.createdTimestamp - interaction.createdTimestamp}ms`) } diff --git a/commands/global/spam.js b/src/commands/global/spam.ts similarity index 79% rename from commands/global/spam.js rename to src/commands/global/spam.ts index 85d862f..e007e7d 100755 --- a/commands/global/spam.js +++ b/src/commands/global/spam.ts @@ -1,4 +1,4 @@ -const { SlashCommandBuilder } = require('discord.js') +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' module.exports = { data: new SlashCommandBuilder() @@ -7,14 +7,18 @@ module.exports = { .addUserOption(option => option.setName('user').setDescription('Spam').setRequired(true)) .addStringOption(option => option.setName('string').setDescription('Spam').setRequired(true)) .addIntegerOption(option => option.setName('integer').setDescription('Spam').setRequired(true)), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { let user = interaction.options.getUser('user') let string = interaction.options.getString('string') let integer = interaction.options.getInteger('integer') + await interaction.reply({ content: 'Spam', ephemeral: true }) let i = 0 function myLoop() { setTimeout(function () { + if (!user) return + if (!string) return + if (!integer) return user.send(string).catch(error => console.error(error)) i++ if (i < integer) myLoop() diff --git a/commands/global/update.js b/src/commands/global/update.ts similarity index 67% rename from commands/global/update.js rename to src/commands/global/update.ts index d09ebcd..0dfeae5 100755 --- a/commands/global/update.js +++ b/src/commands/global/update.ts @@ -1,15 +1,17 @@ -const { SlashCommandBuilder } = require('discord.js') +import { SlashCommandBuilder, ChatInputCommandInteraction, Guild } from 'discord.js' module.exports = { data: new SlashCommandBuilder() .setName('update') .setDescription('Update the member count channel.'), - async execute(interaction) { - let guild = interaction.guild + async execute(interaction: ChatInputCommandInteraction) { + let guild = interaction.guild as Guild + guild.members.fetch().then(() => { var i = 0 guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) let channel = guild.channels.cache.get('1091140609139560508') + if (!channel) return channel.setName(`${i} Gens Posés`) interaction.reply(`${i} Gens Posés !`) }).catch(console.error) diff --git a/commands/music/loop.js b/src/commands/player/loop.ts similarity index 58% rename from commands/music/loop.js rename to src/commands/player/loop.ts index accb00c..85ed1ac 100755 --- a/commands/music/loop.js +++ b/src/commands/player/loop.ts @@ -1,5 +1,5 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js' +import { useQueue } from'discord-player' module.exports = { data: new SlashCommandBuilder() @@ -10,10 +10,12 @@ module.exports = { .setRequired(true) .setMinValue(0) .setMaxValue(3)), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { let loop = interaction.options.getInteger('loop') - let queue = useQueue(interaction.guild.id) - queue.setRepeatMode(loop) + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.setRepeatMode(loop as number) return await interaction.reply(`Boucle ${loop === 0 ? 'désactivée' : loop === 1 ? 'en mode Titre' : loop === 2 ? 'en mode File d\'Attente' : 'en autoplay'}.`) } } \ No newline at end of file diff --git a/commands/music/lyrics.js b/src/commands/player/lyrics.ts similarity index 81% rename from commands/music/lyrics.js rename to src/commands/player/lyrics.ts index a7bd2ff..9c9a072 100755 --- a/commands/music/lyrics.js +++ b/src/commands/player/lyrics.ts @@ -1,18 +1,18 @@ -const { SlashCommandBuilder, EmbedBuilder } = require('discord.js') -const { useQueue } = require('discord-player') -const { lyricsExtractor } = require('@discord-player/extractor') +import { ChatInputCommandInteraction, SlashCommandBuilder, EmbedBuilder } from 'discord.js' +import { useQueue } from 'discord-player' +import { lyricsExtractor } from '@discord-player/extractor' module.exports = { data: new SlashCommandBuilder() .setName('lyrics') .setDescription('Rechercher les paroles d\'une musique.') .addStringOption(option => option.setName('recherche').setDescription('Chercher une musique spécifique')), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { await interaction.deferReply() let query = interaction.options.getString('recherche', false) if (!query) { - let queue = useQueue(interaction.guild.id) + let queue = useQueue(interaction.guild?.id ?? '') if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) let track = queue.currentTrack if (!track) return interaction.followUp({ content: 'Aucune musique en cours, recherche en une plutôt !' }) diff --git a/src/commands/player/pause.ts b/src/commands/player/pause.ts new file mode 100755 index 0000000..ca869dc --- /dev/null +++ b/src/commands/player/pause.ts @@ -0,0 +1,15 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + data: new SlashCommandBuilder() + .setName('pause') + .setDescription('Met en pause la musique.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.node.setPaused(!queue.node.isPaused()) + return await interaction.reply('Musique mise en pause !') + } +} \ No newline at end of file diff --git a/commands/music/play.js b/src/commands/player/play.ts similarity index 62% rename from commands/music/play.js rename to src/commands/player/play.ts index 261cbe5..22a62e3 100755 --- a/commands/music/play.js +++ b/src/commands/player/play.ts @@ -1,16 +1,19 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useMasterPlayer, useQueue, QueryType } = require('discord-player') +import { SlashCommandBuilder, ChatInputCommandInteraction, AutocompleteInteraction, GuildMember } from 'discord.js' +import { useMainPlayer, useQueue, QueryType } from 'discord-player' +import writeEnv from '../../utils/writeEnv' + +export interface TrackSearchResult { name: string, value: string } module.exports = { data: new SlashCommandBuilder() .setName('play') .setDescription('Jouer une musique.') .addStringOption(option => option.setName('recherche').setDescription('Titre de la musique à chercher').setRequired(true).setAutocomplete(true)), - async autocompleteRun(interaction) { + async autocompleteRun(interaction: AutocompleteInteraction) { let query = interaction.options.getString('recherche', true) if (!query) return interaction.respond([]) - let player = useMasterPlayer() + let player = useMainPlayer() const resultsYouTube = await player.search(query, { searchEngine: QueryType.YOUTUBE }) const resultsSpotify = await player.search(query, { searchEngine: QueryType.SPOTIFY_SEARCH }) @@ -24,27 +27,28 @@ module.exports = { value: t.url })) - const tracks = [] - tracksYouTube.forEach((t) => tracks.push({ name: t.name, value: t.value })); - tracksSpotify.forEach((t) => tracks.push({ name: t.name, value: t.value })); + const tracks: TrackSearchResult[] = [] + tracksYouTube.forEach((t) => tracks.push({ name: t.name, value: t.value })) + tracksSpotify.forEach((t) => tracks.push({ name: t.name, value: t.value })) return interaction.respond(tracks) }, - async execute(interaction) { - let voiceChannel = interaction.member.voice.channel - if (!voiceChannel) return await interaction.reply({ content: "T'es pas dans un vocal, idiot !", ephemeral: true }) + async execute(interaction: ChatInputCommandInteraction) { + let member = interaction.member as GuildMember + let voiceChannel = member.voice.channel + if (!voiceChannel) return await interaction.reply({ content: 'T\'es pas dans un vocal, idiot !', ephemeral: true }) - let botChannel = interaction.guild.members.me.voice.channel - if (botChannel && voiceChannel.id !== botChannel.id) return await interaction.reply({ content: "T'es pas dans mon vocal !", ephemeral: true }) + let botChannel = interaction.guild?.members.me?.voice.channel + if (botChannel && voiceChannel.id !== botChannel.id) return await interaction.reply({ content: 'T\'es pas dans mon vocal !', ephemeral: true }) await interaction.deferReply() let query = interaction.options.getString('recherche', true) - let player = useMasterPlayer() - let queue = useQueue(interaction.guild.id) + let player = useMainPlayer() + let queue = useQueue(interaction.guild?.id ?? '') - if (!queue) { - queue = player.nodes.create(interaction.guild, { + if (!queue) { + if (interaction.guild) queue = player.nodes.create(interaction.guild, { metadata: { channel: interaction.channel, client: interaction.guild.members.me, @@ -53,32 +57,35 @@ module.exports = { selfDeaf: true, volume: 20, leaveOnEmpty: true, - leaveOnEmptyCooldown: 300000, + leaveOnEmptyCooldown: 30000, leaveOnEnd: true, - leaveOnEndCooldown: 300000, - skipOnNoStream: true + leaveOnEndCooldown: 300000 }) + else return } try { if (!queue.connection) await queue.connect(voiceChannel) } - catch (error) { console.error(error); return interaction.followUp(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + catch (error: any) { console.error(error); return interaction.followUp(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + // Write the values in the .env file to recover the player if the bot restarts + writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', interaction.channel?.id ?? '') + writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', voiceChannel.id) + + // Search the song let result = await player.search(query, { requestedBy: interaction.user }) if (!result.hasTracks()) return interaction.followUp(`Aucune musique trouvée pour **${query}** !`) let track = result.tracks[0] + console.log(track.duration) + console.log(track.durationMS) let entry = queue.tasksQueue.acquire() await entry.getTask() queue.addTrack(track) - // Write the values in the .env file to recover the player if the bot restarts - writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', interaction.channel.id) - writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', voiceChannel.id) - try { if (!queue.isPlaying()) await queue.node.play() let track_source = track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu' return interaction.followUp(`Chargement de la musique **${track.title}** de **${track.author}** sur **${track_source}**...`) - } catch (error) { console.error(error); return interaction.followUp(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + } catch (error: any) { console.error(error); return interaction.followUp(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } finally { queue.tasksQueue.release() } } } \ No newline at end of file diff --git a/src/commands/player/previous.ts b/src/commands/player/previous.ts new file mode 100755 index 0000000..8ef81d3 --- /dev/null +++ b/src/commands/player/previous.ts @@ -0,0 +1,15 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useHistory } from 'discord-player' + +module.exports = { + data: new SlashCommandBuilder() + .setName('previous') + .setDescription('Joue la musique précédente.'), + async execute(interaction: ChatInputCommandInteraction) { + let history = useHistory(interaction.guild?.id ?? '') + if (!history) return await interaction.reply('Il n\'y a pas d\'historique de musique !') + + await history.previous() + return await interaction.reply('Musique précédente jouée !') + } +} \ No newline at end of file diff --git a/src/commands/player/resume.ts b/src/commands/player/resume.ts new file mode 100755 index 0000000..efe95a0 --- /dev/null +++ b/src/commands/player/resume.ts @@ -0,0 +1,15 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + data: new SlashCommandBuilder() + .setName('resume') + .setDescription('Reprendre la musique.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.node.setPaused(!queue.node.isPaused()) + return await interaction.reply('Musique reprise !') + } +} \ No newline at end of file diff --git a/src/commands/player/shuffle.ts b/src/commands/player/shuffle.ts new file mode 100755 index 0000000..18567c5 --- /dev/null +++ b/src/commands/player/shuffle.ts @@ -0,0 +1,15 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + data: new SlashCommandBuilder() + .setName('shuffle') + .setDescription('Mélange la file d\'attente.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.tracks.shuffle() + return await interaction.reply('File d\'attente mélangée !') + } +} \ No newline at end of file diff --git a/src/commands/player/skip.ts b/src/commands/player/skip.ts new file mode 100755 index 0000000..09387a3 --- /dev/null +++ b/src/commands/player/skip.ts @@ -0,0 +1,15 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +module.exports = { + data: new SlashCommandBuilder() + .setName('skip') + .setDescription('Passer la musique en cours.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.node.skip() + return await interaction.reply('Musique passée !') + } +} \ No newline at end of file diff --git a/src/commands/player/stop.ts b/src/commands/player/stop.ts new file mode 100755 index 0000000..ae7577e --- /dev/null +++ b/src/commands/player/stop.ts @@ -0,0 +1,21 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' +import writeEnv from '../../utils/writeEnv' + +module.exports = { + data: new SlashCommandBuilder() + .setName('stop') + .setDescription('Arrêter la musique.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.delete() + writeEnv('DISCORD_MUSIC_TEXTCHANNEL_ID', '') + writeEnv('DISCORD_MUSIC_VOICECHANNEL_ID', '') + writeEnv('DISCORD_MUSIC_CURRENT_TRACK', '') + writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', '') + + return await interaction.reply('Musique arrêtée !') + } +} \ No newline at end of file diff --git a/commands/music/volume.js b/src/commands/player/volume.ts similarity index 51% rename from commands/music/volume.js rename to src/commands/player/volume.ts index 2b9a39b..d2f4a6d 100755 --- a/commands/music/volume.js +++ b/src/commands/player/volume.ts @@ -1,5 +1,5 @@ -const { SlashCommandBuilder } = require('discord.js') -const { useQueue } = require('discord-player') +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' module.exports = { data: new SlashCommandBuilder() @@ -10,10 +10,12 @@ module.exports = { .setRequired(true) .setMinValue(1) .setMaxValue(100)), - async execute(interaction) { + async execute(interaction: ChatInputCommandInteraction) { let volume = interaction.options.getInteger('volume') - let queue = useQueue(interaction.guild.id) - queue.node.setVolume(volume) + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + queue.node.setVolume(volume as number) return await interaction.reply(`Volume modifié à ${volume}% !`) } } \ No newline at end of file diff --git a/events/error.js b/src/events/error.ts old mode 100644 new mode 100755 similarity index 52% rename from events/error.js rename to src/events/error.ts index 1200bb2..1d855fd --- a/events/error.js +++ b/src/events/error.ts @@ -1,8 +1,8 @@ -const { Events } = require('discord.js') +import { Events } from 'discord.js' module.exports = { name: Events.Error, - execute(error) { + execute(error: any) { console.error(error) } } \ No newline at end of file diff --git a/events/guildMemberAdd.js b/src/events/guildMemberAdd.ts similarity index 81% rename from events/guildMemberAdd.js rename to src/events/guildMemberAdd.ts index d4540fb..568344d 100755 --- a/events/guildMemberAdd.js +++ b/src/events/guildMemberAdd.ts @@ -1,13 +1,15 @@ -const { Events } = require('discord.js') +import { Events, GuildMember } from 'discord.js' module.exports = { name: Events.GuildMemberAdd, - async execute(member) { + async execute(member: GuildMember) { if (member.guild.id !== '1086577543651524699') return member.guild.members.fetch().then(() => { var i = 0 member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) let channel = member.guild.channels.cache.get('1091140609139560508') + if (!channel) return + console.log(channel.name) console.log(`${i} Gens Posés`) channel.setName('Changement...') diff --git a/events/guildMemberRemove.js b/src/events/guildMemberRemove.ts similarity index 81% rename from events/guildMemberRemove.js rename to src/events/guildMemberRemove.ts index 6992378..3a77c33 100755 --- a/events/guildMemberRemove.js +++ b/src/events/guildMemberRemove.ts @@ -1,13 +1,15 @@ -const { Events } = require('discord.js') +import { Events, GuildMember } from 'discord.js' module.exports = { name: Events.GuildMemberRemove, - async execute(member) { + async execute(member: GuildMember) { if (member.guild.id !== '1086577543651524699') return member.guild.members.fetch().then(() => { var i = 0 member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) let channel = member.guild.channels.cache.get('1091140609139560508') + if (!channel) return + console.log(channel.name) console.log(`${i} Gens Posés`) channel.setName('Changement...') diff --git a/events/interactionCreate.js b/src/events/interactionCreate.ts similarity index 55% rename from events/interactionCreate.js rename to src/events/interactionCreate.ts index 88bef92..89a008c 100755 --- a/events/interactionCreate.js +++ b/src/events/interactionCreate.ts @@ -1,37 +1,38 @@ -const { Events } = require('discord.js') - -const appDir = require('path').dirname(require.main.filename) -const editPlayer = require(appDir + '/utilsPlayer/edit.js') -const playerButtons = require(appDir + '/utilsPlayer/buttons.js') +import { Events, Interaction, ChatInputCommandInteraction, AutocompleteInteraction, ButtonInteraction } from 'discord.js' +import editPlayer from '../utilsPlayer/edit' +import playerButtons from '../utilsPlayer/buttons' module.exports = { name: Events.InteractionCreate, - async execute(interaction) { + async execute(interaction: Interaction) { //if (!interaction.isAutocomplete() && !interaction.isChatInputCommand() && !interaction.isButton()) return console.error(`Interaction ${interaction.commandName} is not a command.`) if (interaction.isChatInputCommand()) { - let command = interaction.client.commands.get(interaction.commandName) - if (!command) return console.error(`No command matching ${interaction.commandName} was found.`) + interaction = interaction as ChatInputCommandInteraction + let chatInputCommand = interaction.client.commands.get(interaction.commandName) + if (!chatInputCommand) return console.error(`No chat input command matching ${interaction.commandName} was found.`) - console.log(`\u001b[1;33m Command '${interaction.commandName}' launched by ${interaction.user.tag}`) + console.log(`Command '${interaction.commandName}' launched by ${interaction.user.tag}`) - try { await command.execute(interaction) } + try { await chatInputCommand.execute(interaction) } catch (error) { console.error(`Error executing ${interaction.commandName}:`, error) } } else if (interaction.isAutocomplete()) { + interaction = interaction as AutocompleteInteraction let autoCompleteRun = interaction.client.commands.get(interaction.commandName) if (!autoCompleteRun) return console.error(`No autoCompleteRun matching ${interaction.commandName} was found.`) - console.log(`\u001b[1;33m AutoCompleteRun '${interaction.commandName}' launched by ${interaction.user.tag}`) + console.log(`AutoCompleteRun '${interaction.commandName}' launched by ${interaction.user.tag}`) try { await autoCompleteRun.autocompleteRun(interaction) } catch (error) { console.error(`Error autocompleting ${interaction.commandName}:`, error) } } else if (interaction.isButton()) { + interaction = interaction as ButtonInteraction let button = interaction.client.buttons.get(interaction.customId) if (!button) return console.error(`No button id matching ${interaction.customId} was found.`) - console.log(`\u001b[1;33m Button '${interaction.customId}' clicked by ${interaction.user.tag}`) + console.log(`Button '${interaction.customId}' clicked by ${interaction.user.tag}`) if (playerButtons.includes(interaction.customId)) { await editPlayer(interaction) } diff --git a/src/events/ready.ts b/src/events/ready.ts new file mode 100755 index 0000000..9bc174c --- /dev/null +++ b/src/events/ready.ts @@ -0,0 +1,30 @@ +import { Events, Client, ActivityType } from 'discord.js' +import { useMainPlayer } from 'discord-player' +import replay from '../utilsPlayer/replay' +import disco from '../utilsPlayer/disco' +import 'dotenv/config' + +declare module "discord.js" { + export interface Client { + disco: { interval: NodeJS.Timeout } + } +} + +module.exports = { + name: Events.ClientReady, + once: true, + async execute(client: Client) { + console.log(`Ready! Logged in as ${client.user?.tag ?? 'unknown'}`) + client.user?.setActivity('some bangers...', { type: ActivityType.Listening }) + + await useMainPlayer().extractors.loadDefault(ext => ext === 'YouTubeExtractor' || ext === 'SpotifyExtractor').then(() => console.log('YouTube and Spotify extractors loaded.')).catch(console.error) + + if (process.env.DISCORD_MUSIC_CURRENT_TRACK) await replay(client) + + client.disco = { interval: {} as NodeJS.Timeout } + client.disco.interval = setInterval(async () => { + let state = await disco(client) + if (state === 'clear') clearInterval(client.disco.interval) + }, 2000) + } +} \ No newline at end of file diff --git a/events/voiceStateUpdate.js b/src/events/voiceStateUpdate.ts similarity index 95% rename from events/voiceStateUpdate.js rename to src/events/voiceStateUpdate.ts index f1dd249..4925ac5 100755 --- a/events/voiceStateUpdate.js +++ b/src/events/voiceStateUpdate.ts @@ -1,8 +1,8 @@ -const { Events, AuditLogEvent } = require('discord.js') +import { Events, VoiceState } from 'discord.js' module.exports = { name: Events.VoiceStateUpdate, - async execute(oldState, newState) { + async execute(oldState: VoiceState, newState: VoiceState) { /* let oldMute = oldState.serverMute let newMute = newState.serverMute diff --git a/eventsPlayer/audioTrackAdd.js b/src/eventsPlayer/audioTrackAdd.ts old mode 100644 new mode 100755 similarity index 51% rename from eventsPlayer/audioTrackAdd.js rename to src/eventsPlayer/audioTrackAdd.ts index 35ec162..4c81db9 --- a/eventsPlayer/audioTrackAdd.js +++ b/src/eventsPlayer/audioTrackAdd.ts @@ -1,6 +1,9 @@ -module.exports = { +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' + +export default { name: 'audioTrackAdd', - async execute(queue, track) { + async execute(queue: GuildQueue, track: Track) { // Emitted when the player adds a single song to its queue queue.metadata.channel.send(`Musique **${track.title}** de **${track.author}** ajoutée à la file d'attente !`) } diff --git a/src/eventsPlayer/audioTracksAdd.ts b/src/eventsPlayer/audioTracksAdd.ts new file mode 100755 index 0000000..df416ba --- /dev/null +++ b/src/eventsPlayer/audioTracksAdd.ts @@ -0,0 +1,10 @@ +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' + +export default { + name: 'audioTracksAdd', + async execute(queue: GuildQueue, track: Array) { + // Emitted when the player adds multiple songs to its queue + queue.metadata.channel.send(`Ajout de ${track.length} musiques à la file d'attente !`) + } +} \ No newline at end of file diff --git a/eventsPlayer/debug.js b/src/eventsPlayer/debug.ts old mode 100644 new mode 100755 similarity index 60% rename from eventsPlayer/debug.js rename to src/eventsPlayer/debug.ts index 2945a9f..0dff677 --- a/eventsPlayer/debug.js +++ b/src/eventsPlayer/debug.ts @@ -1,6 +1,8 @@ -module.exports = { +import { GuildQueue } from 'discord-player' + +export default { name: 'debug', - async execute (queue, message) { + async execute(queue: GuildQueue, message: string) { // Emitted when the player queue sends debug info // Useful for seeing what state the current queue is at console.log(`Player debug event: ${message}`) diff --git a/eventsPlayer/disconnect.js b/src/eventsPlayer/disconnect.ts old mode 100644 new mode 100755 similarity index 58% rename from eventsPlayer/disconnect.js rename to src/eventsPlayer/disconnect.ts index 2575e76..b1c7dd5 --- a/eventsPlayer/disconnect.js +++ b/src/eventsPlayer/disconnect.ts @@ -1,6 +1,10 @@ -module.exports = { +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' +import writeEnv from '../utils/writeEnv' + +export default { name: 'disconnect', - async execute(queue, track) { + async execute(queue: GuildQueue, track: Track) { // Emitted when the bot leaves the voice channel queue.metadata.channel.send("J'ai quitté le vocal !") diff --git a/eventsPlayer/emptyChannel.js b/src/eventsPlayer/emptyChannel.ts old mode 100644 new mode 100755 similarity index 57% rename from eventsPlayer/emptyChannel.js rename to src/eventsPlayer/emptyChannel.ts index 8b29cfa..7b8be1e --- a/eventsPlayer/emptyChannel.js +++ b/src/eventsPlayer/emptyChannel.ts @@ -1,6 +1,9 @@ -module.exports = { +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' + +export default { name: 'emptyChannel', - async execute(queue, track) { + async execute(queue: GuildQueue, track: Track) { // Emitted when the voice channel has been empty for the set threshold // Bot will automatically leave the voice channel with this event queue.metadata.channel.send(`Je quitte le vocal car il est vide depuis trop longtemps.`) diff --git a/src/eventsPlayer/emptyQueue.ts b/src/eventsPlayer/emptyQueue.ts new file mode 100755 index 0000000..ef2bdd0 --- /dev/null +++ b/src/eventsPlayer/emptyQueue.ts @@ -0,0 +1,10 @@ +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' + +export default { + name: 'emptyQueue', + async execute(queue: GuildQueue) { + // Emitted when the player queue has finished + queue.metadata.channel.send("File d'attente vide !") + } +} \ No newline at end of file diff --git a/src/eventsPlayer/error.ts b/src/eventsPlayer/error.ts new file mode 100755 index 0000000..b53a818 --- /dev/null +++ b/src/eventsPlayer/error.ts @@ -0,0 +1,10 @@ +import { GuildQueue } from 'discord-player' + +export default { + name: 'error', + async execute(queue: GuildQueue, error: Error) { + // Emitted when the player queue encounters error + console.log(`General player error event: ${error.message}`) + console.error(error) + } +} \ No newline at end of file diff --git a/eventsPlayer/playerError.js b/src/eventsPlayer/playerError.ts old mode 100644 new mode 100755 similarity index 62% rename from eventsPlayer/playerError.js rename to src/eventsPlayer/playerError.ts index 529f560..289a9fc --- a/eventsPlayer/playerError.js +++ b/src/eventsPlayer/playerError.ts @@ -1,6 +1,8 @@ -module.exports = { +import { GuildQueue } from 'discord-player' + +export default { name: 'playerError', - async execute(queue, error) { + async execute(queue: GuildQueue, error: Error) { // Emitted when the audio player errors while streaming audio track console.log(`\u001b[1;31m Player error event: ${error.message}`) console.error(error) diff --git a/src/eventsPlayer/playerSkip.ts b/src/eventsPlayer/playerSkip.ts new file mode 100755 index 0000000..941ca55 --- /dev/null +++ b/src/eventsPlayer/playerSkip.ts @@ -0,0 +1,10 @@ +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' + +export default { + name: 'playerSkip', + async execute(queue: GuildQueue, track: Track) { + // Emitted when the audio player fails to load the stream for a song + queue.metadata.channel.send(`Musique **${track.title}** de **${track.author}** passée !`) + } +} \ No newline at end of file diff --git a/src/eventsPlayer/playerStart.ts b/src/eventsPlayer/playerStart.ts new file mode 100755 index 0000000..b08129a --- /dev/null +++ b/src/eventsPlayer/playerStart.ts @@ -0,0 +1,13 @@ +import { GuildQueue, Track } from 'discord-player' +import { PlayerMetadata } from '../utilsPlayer/metadata' +import writeEnv from '../utils/writeEnv' + +export default { + name: 'playerStart', + async execute(queue: GuildQueue, track: Track) { + // Emitted when the player starts to play a song + queue.metadata.channel.send(`Lecture de **${track.title}** de **${track.author}** !`) + + writeEnv(`DISCORD_MUSIC_CURRENT_TRACK`, track.url) + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100755 index 0000000..3e49645 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,89 @@ +// PACKAGES +import { Client, Collection, GatewayIntentBits, REST, Routes, ChatInputCommandInteraction, AutocompleteInteraction, ButtonInteraction } from 'discord.js' +import { Player } from 'discord-player' +import path from 'path' +import fs from 'fs' +import 'dotenv/config' + +export interface Command { + name: string, + description: string, + data: any, + autocompleteRun: (interaction: AutocompleteInteraction) => any, + execute: (interaction: ChatInputCommandInteraction) => any +} +export interface Button { + name: string, + description: string, + id: string, + execute: (interaction: ButtonInteraction) => any +} + +declare module 'discord.js' { + export interface Client { + commands: Collection + buttons: Collection + } +} + + +// CLIENT INITIALIZATION +let intents = [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildVoiceStates] +const client = new Client({ intents }) + +// EVENTS HANDLING +const eventFiles = fs.readdirSync(path.join(__dirname, './events')).filter(file => file.endsWith('.ts')) +eventFiles.forEach(file => { + let event = require(path.join(__dirname, './events', file)) + if (event.once) client.once(event.name, (...args) => { event.execute(...args) }) + else client.on(event.name, (...args) => { event.execute(...args) }) +}) + +// COMMANDS HANDLING +client.commands = new Collection() + +const commandFolders = fs.readdirSync(path.join(__dirname, './commands')) +commandFolders.forEach(folder => { + let folderPath = path.join(__dirname, './commands', folder) + let commandFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.ts')) + commandFiles.forEach(file => { + let command = require(path.join(folderPath, file)) + if ('data' in command && 'execute' in command) { + const commandData = command.data.toJSON() + if (commandData) client.commands.set(commandData.name, command) + } else console.log(`[WARNING] The command at ${`${folderPath}/${file}`} is missing a required "data" or "execute" property.`) + }) +}) + +// COMMANDS REGISTERING +const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN as string) +async () => { + try { await rest.put(Routes.applicationCommands(process.env.DISCORD_APP_ID as string), { body: client.commands }) } + catch (error) { console.error(error) } +} + +// BUTTONS HANDLING +client.buttons = new Collection() + +const buttonFiles = fs.readdirSync(path.join(__dirname, './buttons')).filter(file => file.endsWith('.ts')) +buttonFiles.forEach(file => { + let button = require(path.join(__dirname, './buttons', file)) + if ('id' in button && 'execute' in button) client.buttons.set(button.id, button) + else console.log(`[WARNING] The button ${file} is missing a required "id" or "execute" property.`) +}) + + +// PLAYER INITIALIZATION +const player = new Player(client) + +// PLAYER EVENTS HANDLING +const eventPlayerFiles = fs.readdirSync(path.join(__dirname, './eventsPlayer')).filter(file => file.endsWith('.ts')) +eventPlayerFiles.forEach(async file => { + let event = await import(path.join(__dirname, './eventsPlayer', file)) + if (event.default.name === 'debug') return + player.events.on(event.default.name, (...args: any[]) => event.default.execute(...args)) +}) + + +// LAUNCH +client.login() \ No newline at end of file diff --git a/parle.mp3 b/src/static/parle.mp3 old mode 100644 new mode 100755 similarity index 100% rename from parle.mp3 rename to src/static/parle.mp3 diff --git a/stronger_shorter.mp3 b/src/static/stronger_shorter.mp3 similarity index 100% rename from stronger_shorter.mp3 rename to src/static/stronger_shorter.mp3 diff --git a/src/utils/amp.ts b/src/utils/amp.ts new file mode 100644 index 0000000..7f8a93d --- /dev/null +++ b/src/utils/amp.ts @@ -0,0 +1,95 @@ +import axios from 'axios' +import writeEnv from './writeEnv' + +export const ADSModule = { + async GetInstances(SESSIONID: string) { + return await axios.post(`${process.env.AMP_HOST}/API/ADSModule/GetInstances`, { + SESSIONID + }).then(response => { + if (!response.data.result) return { status: 'fail', data: response.data } + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) + }, + + async ManageInstance(SESSIONID: string, InstanceId: string) { + return await axios.post(`${process.env.AMP_HOST}/API/ADSModule/ManageInstance`, { + SESSIONID, + InstanceId + }).then(response => { + console.log(response.data) + + if (!response.data.result) return { status: 'fail', data: response.data } + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) + }, + + async RestartInstance(SESSIONID: string, InstanceName: string) { + return await axios.post(`${process.env.AMP_HOST}/API/ADSModule/RestartInstance`, { + SESSIONID, + InstanceName + }).then(response => { + console.log(response.data) + + //if (!response.data.success) return { status: 'fail', data: response.data } + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) + }, + + async Servers(SESSIONID: string, InstanceId: string) { + return await axios.get(`${process.env.AMP_HOST}/API/ADSModule/Servers`, { + data: { + SESSIONID, + InstanceId + } + }).then(response => { + console.log(response) + console.log(response.data) + + if (!response.data.result) return { status: 'fail', data: response.data } + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) + } +} + +export const Core = { + async Login(details: any) { + return await axios.post(`${process.env.AMP_HOST}/API/Core/Login`, + details + ).then(response => { + if (!response.data.success) return { status: 'fail', data: response.data } + + writeEnv('AMP_USERNAME', response.data.userInfo.Username) + writeEnv('AMP_SESSIONID', response.data.sessionID) + writeEnv('AMP_REMEMBER_TOKEN', response.data.rememberMeToken) + + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) + } +} + +export async function CheckSession(SESSIONID: string) { + return await axios.post(`${process.env.AMP_HOST}/API/ADSModule/GetInstances`, { + SESSIONID + }).then(response => { + if (!response.data.result) return { status: 'fail', data: response.data } + return { status: 'success', data: response.data } + }).catch(error => { + console.error(error) + return { status: 'error', data: error } + }) +} \ No newline at end of file diff --git a/src/utils/crack.ts b/src/utils/crack.ts new file mode 100644 index 0000000..21ba53b --- /dev/null +++ b/src/utils/crack.ts @@ -0,0 +1,98 @@ +import parseTorrent, { toMagnetURI } from 'parse-torrent' +import iconv from 'iconv-lite' +import axios from 'axios' +import path from 'path' +import fs from 'fs' + +export declare class Game { + name: string + link: string +} + +const headers = { + h1: { + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "x-requested-with": "XMLHttpRequest" + }, + h2: { + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", + "accept-language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", + "cache-control": "no-cache", + "pragma": "no-cache", + "sec-ch-ua": "\"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"110\", \"Opera GX\";v=\"96\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-dest": "document", + "sec-fetch-mode": "navigate", + "sec-fetch-site": "none", + "sec-fetch-user": "?1", + "upgrade-insecure-requests": "1", + "cookie": "online_fix_auth=gAAAAABkKM0s9WNLe_V6euTnJD7UQjppVty9B7OOyHBYOyVcbcejj8F6KveBcLxlf3mlx_vE7JEFPHlrpj-Aq6BFJyKPGzxds_wpcPV2MdXPyDGQLsz4mAvt3qgTgGg25MapWo_fSIOMiAAsF4Gv_uh4kUOiR_jgbHCZWJGPgpNQwU2HFFyvahYR6MzR7nYE9-fCmrev3obkRbro43vIVTTX4UyJMRHadrsY5Q-722TzinCZVmAuJfc=; dle_password=89465c26673e0199e5272e4730772c35; _ym_uid=1670534560361937997; _ym_d=1680394955; _ym_isad=2; dle_user_id=2619796; PHPSESSID=3v8sd281sr0n1n9f1p66q25sa2", + "Referer": "https://online-fix.me/", + "Referrer-Policy": "strict-origin-when-cross-origin" + } +} + +export async function search(query: string) { + let body = await fetch("https://online-fix.me/engine/ajax/search.php", { headers: headers.h1, body: `query=${query}`, method: "POST" }) + .then(response => response.arrayBuffer()) + .then(arrayBuffer => { return iconv.decode(Buffer.from(arrayBuffer), 'win1251') }) + .catch(console.error) + try { + if (!body) return + let matches = body.split('')[1].split('')[0].split('') + let games = [] as Game[] + matches.pop() + matches.forEach(async match => { + let name = match.split('">')[1].split('')[0].slice(0, -8) + let link = match.split('')[0] + games.push({ name, link }) + }) + return games + } catch (error) { return error } +} + +export async function repo(game: Game) { + let body = await fetch(game.link, { headers: headers.h2, body: null, method: "GET" }) + .then(response => response.arrayBuffer()) + .then(arrayBuffer => { return iconv.decode(Buffer.from(arrayBuffer), 'win1251') }) + .catch(console.error) + try { + if (!body) return + let name = body.split('https://uploads.online-fix.me:2053/torrents/')[1].split('"')[0] + let url = `https://uploads.online-fix.me:2053/torrents/${name}` + return url + } catch (error) { console.error(error) } +} + +export async function torrent(url: string) { + let response = await fetch(url, { headers: headers.h2, body: null, method: "GET" }).catch(console.error) + try { + if (!response) return + let body = await response.text() + let file = body.split('')[0] + return file + } catch (error) { console.error(error) } +} + +export async function download(url: string, file: string) { + let filePath = path.join(__dirname, '../../public/cracks/', file) + let writer = fs.createWriteStream(filePath) + try { + await axios({ url: url + file, method: 'GET', responseType: 'stream', headers: headers.h2 }).then(response => { + return new Promise((resolve, reject) => { + response.data.pipe(writer) + let error = null as unknown as Error + writer.on('error', err => { error = err; writer.close(); reject(err) }) + writer.on('close', () => { if (!error) resolve(true) }) + }) + }).catch(console.error) + return filePath + } catch (error) { console.error(error) } +} + +export async function magnet(filePath: string) { + let torrentData = parseTorrent(fs.readFileSync(filePath)) + let uri = toMagnetURI(torrentData) + return uri +} \ No newline at end of file diff --git a/utils/getUptime.js b/src/utils/getUptime.ts old mode 100644 new mode 100755 similarity index 64% rename from utils/getUptime.js rename to src/utils/getUptime.ts index ddc6d4f..89c25f9 --- a/utils/getUptime.js +++ b/src/utils/getUptime.ts @@ -1,4 +1,7 @@ -module.exports = function (uptime) { +import { Client } from 'discord.js' + +export default function (uptime: Client["uptime"]) { + if (!uptime) return '0J, 0H, 0M et 0S' let days = Math.floor(uptime / 86400000) let hours = Math.floor(uptime / 3600000) % 24 let minutes = Math.floor(uptime / 60000) % 60 diff --git a/utils/writeEnv.js b/src/utils/writeEnv.ts old mode 100644 new mode 100755 similarity index 70% rename from utils/writeEnv.js rename to src/utils/writeEnv.ts index 47a5cc6..da84872 --- a/utils/writeEnv.js +++ b/src/utils/writeEnv.ts @@ -1,6 +1,6 @@ -const fs = require('fs') +import fs from 'fs' -module.exports = writeEnv = ((variable, value) => { +export default ((variable: string, value: string) => { let parsedFile = fs.readFileSync('./.env', 'utf8') parsedFile = parsedFile.replace(new RegExp(`${variable} = .*`, 'g'), `${variable} = ${value}`) fs.writeFileSync('./.env', parsedFile) diff --git a/utilsAMP/ADSModule/GetInstances.js b/src/utilsAMP/ADSModule/GetInstances.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/ADSModule/GetInstances.js rename to src/utilsAMP/ADSModule/GetInstances.ts diff --git a/utilsAMP/ADSModule/ManageInstance.js b/src/utilsAMP/ADSModule/ManageInstance.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/ADSModule/ManageInstance.js rename to src/utilsAMP/ADSModule/ManageInstance.ts diff --git a/utilsAMP/ADSModule/RestartInstance.js b/src/utilsAMP/ADSModule/RestartInstance.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/ADSModule/RestartInstance.js rename to src/utilsAMP/ADSModule/RestartInstance.ts diff --git a/utilsAMP/ADSModule/Servers.js b/src/utilsAMP/ADSModule/Servers.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/ADSModule/Servers.js rename to src/utilsAMP/ADSModule/Servers.ts diff --git a/utilsAMP/CheckSession.js b/src/utilsAMP/CheckSession.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/CheckSession.js rename to src/utilsAMP/CheckSession.ts diff --git a/utilsAMP/Core/Login.js b/src/utilsAMP/Core/Login.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsAMP/Core/Login.js rename to src/utilsAMP/Core/Login.ts diff --git a/utilsCrack/download.js b/src/utilsCrack/download.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/download.js rename to src/utilsCrack/download.ts diff --git a/utilsCrack/headers.js b/src/utilsCrack/headers.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/headers.js rename to src/utilsCrack/headers.ts diff --git a/utilsCrack/magnet.js b/src/utilsCrack/magnet.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/magnet.js rename to src/utilsCrack/magnet.ts diff --git a/utilsCrack/repo.js b/src/utilsCrack/repo.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/repo.js rename to src/utilsCrack/repo.ts diff --git a/utilsCrack/search.js b/src/utilsCrack/search.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/search.js rename to src/utilsCrack/search.ts diff --git a/utilsCrack/torrent.js b/src/utilsCrack/torrent.ts old mode 100644 new mode 100755 similarity index 100% rename from utilsCrack/torrent.js rename to src/utilsCrack/torrent.ts diff --git a/src/utilsPlayer/buttons.ts b/src/utilsPlayer/buttons.ts new file mode 100755 index 0000000..b2fd664 --- /dev/null +++ b/src/utilsPlayer/buttons.ts @@ -0,0 +1 @@ +export default ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up'] \ No newline at end of file diff --git a/src/utilsPlayer/disco.ts b/src/utilsPlayer/disco.ts new file mode 100755 index 0000000..e02ba51 --- /dev/null +++ b/src/utilsPlayer/disco.ts @@ -0,0 +1,40 @@ +import { Client, TextChannel } from 'discord.js' +import { useQueue } from 'discord-player' +import getUptime from '../utils/getUptime' +import writeEnv from '../utils/writeEnv' +import generate from './generate' + +export default async (client: Client) => { + let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID as string) + if (!guild) { + clearInterval(client.disco.interval) + console.log(`Aucun serveur trouvé avec l'id \`${process.env.DISCORD_GUILD_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + return 'clear' + } + + // Keep track of the music progress if the bot reboots + let queue = useQueue(guild.id) + if (queue) if (queue.isPlaying()) writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', queue.node.playbackTime.toString()) + + let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID as string) as TextChannel + if (!channel) { + clearInterval(client.disco.interval) + console.log(`Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + return 'clear' + } + + let { embed, components } = await generate(guild) + if (components && embed.data.footer) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) + else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) + + let messages = await channel.messages.fetch() + messages.forEach(msg => { if (msg.member) if (!msg.author.bot && !msg.member.roles.cache.has(process.env.DISCORD_ROLE_ID as string)) msg.delete() }) + + let botMessage = messages.find(msg => client.user && msg.author.id === client.user.id) + if (botMessage) { + if (!components && botMessage.components.length > 0) { + await botMessage.delete() + return channel.send({ embeds: [embed] }) + } else if (components) return botMessage.edit({ embeds: [embed], components }) + } else return channel.send({ embeds: [embed] }) +} \ No newline at end of file diff --git a/src/utilsPlayer/edit.ts b/src/utilsPlayer/edit.ts new file mode 100755 index 0000000..b494636 --- /dev/null +++ b/src/utilsPlayer/edit.ts @@ -0,0 +1,13 @@ +import { ButtonInteraction } from 'discord.js' +import generatePlayer from './generate' + +export default async (interaction: ButtonInteraction) => { + let guild = interaction.guild + if (!guild) return await interaction.reply({ content: 'Cette commande n\'est pas disponible en message privé.', ephemeral: true }) + + let { components } = await generatePlayer(guild) + if (!components) return + + components.forEach((actionRow) => actionRow.components.forEach((button) => button.setDisabled(true))) + await interaction.update({ components }) +} \ No newline at end of file diff --git a/utilsPlayer/generate.js b/src/utilsPlayer/generate.ts old mode 100644 new mode 100755 similarity index 74% rename from utilsPlayer/generate.js rename to src/utilsPlayer/generate.ts index 74c2d65..7d3a7c5 --- a/utilsPlayer/generate.js +++ b/src/utilsPlayer/generate.ts @@ -1,7 +1,7 @@ -const { EmbedBuilder, ButtonBuilder, ActionRowBuilder } = require('discord.js') -const { useQueue } = require('discord-player') +import { EmbedBuilder, ButtonBuilder, ActionRowBuilder, Guild } from 'discord.js' +import { useQueue } from 'discord-player' -module.exports = async (guild) => { +export default async (guild: Guild) => { let embed = new EmbedBuilder().setColor('#ffc370') let queue = useQueue(guild.id) @@ -24,15 +24,14 @@ module.exports = async (guild) => { { name: 'Durée', value: track.duration, inline: true }, { name: 'Source', value: track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu', inline: true }, { name: 'Volume', value: `${queue.node.volume}%`, inline: true }, - { name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() }, - { name: 'Loop', value: queue.repeatMode ? queue.repeatMode === 2 ? "File d'Attente" : "Titre" : "Off", inline: true }, - { name: 'Autoplay', value: queue.autoplay ? "On" : "Off", inline: true } + { name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() || 'Aucune' }, + { name: 'Loop', value: queue.repeatMode === 3 ? 'Autoplay' : queue.repeatMode === 2 ? 'File d\'Attente' : queue.repeatMode === 1 ? 'Titre' : 'Off', inline: true } ) .setDescription(`**Musique suivante :** ${queue.tracks.data[0] ? queue.tracks.data[0].title : 'Aucune'}`) - .setFooter({ text: `Demandé par ${track.requestedBy.tag}` }) - + .setFooter({ text: `Demandé par ${track.requestedBy ? track.requestedBy.tag : 'Inconnu'}` }) + let components = [ - new ActionRowBuilder().addComponents( + new ActionRowBuilder().addComponents( new ButtonBuilder() .setLabel(queue.node.isPaused() ? '▶️' : '⏸️') .setStyle(2) @@ -57,7 +56,7 @@ module.exports = async (guild) => { .setCustomId('volume_up') .setDisabled(queue.node.volume === 100) ), - new ActionRowBuilder().addComponents( + new ActionRowBuilder().addComponents( new ButtonBuilder() .setLabel('🔀') .setStyle(2) @@ -70,7 +69,7 @@ module.exports = async (guild) => { .setLabel('⏮️') .setStyle(2) .setCustomId('previous') - .setDisabled(queue.previousTracks ? !queue.previousTracks[0] : true) + .setDisabled(queue.history.previousTrack ? false : true) ) ] return ({ embed, components }) diff --git a/src/utilsPlayer/metadata.ts b/src/utilsPlayer/metadata.ts new file mode 100644 index 0000000..0494b56 --- /dev/null +++ b/src/utilsPlayer/metadata.ts @@ -0,0 +1,24 @@ +import { CommandInteraction, Guild, GuildChannel, TextBasedChannel, VoiceChannel } from 'discord.js' + +type ChannelInferrable = { + channel: TextBasedChannel | VoiceChannel + guild?: Guild +} + +export class PlayerMetadata { + public constructor(public data: ChannelInferrable) { + if (data.channel.isDMBased()) { throw new Error('PlayerMetadata cannot be created from a DM') } + if (!data.channel) { throw new Error('PlayerMetadata can only be created from a channel') } + } + public get channel() { return this.data.channel! } + public get guild() { return this.data.guild || (this.data.channel as GuildChannel).guild } + + public static create(data: ChannelInferrable | CommandInteraction) { + if (data instanceof CommandInteraction) { + if (!data.inGuild()) { throw new Error('PlayerMetadata cannot be created from a DM') } + + return new PlayerMetadata({ channel: data.channel!, guild: data.guild! }) + } + return new PlayerMetadata(data); + } +} \ No newline at end of file diff --git a/src/utilsPlayer/replay.ts b/src/utilsPlayer/replay.ts new file mode 100755 index 0000000..8be1cd9 --- /dev/null +++ b/src/utilsPlayer/replay.ts @@ -0,0 +1,42 @@ +import { Client, TextChannel, VoiceChannel } from 'discord.js' +import { useMainPlayer } from 'discord-player' + +export default async (client: Client) => { + let textChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_TEXTCHANNEL_ID as string) as TextChannel + if (!textChannel) return console.log(`Aucun channel trouvé avec l'id \`${process.env.DISCORD_MUSIC_TEXTCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + let voiceChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_VOICECHANNEL_ID as string) as VoiceChannel + if (!voiceChannel) return console.log(`Aucun channel trouvé avec l'id \`${process.env.DISCORD_MUSIC_VOICECHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + + let player = useMainPlayer() + let queue = player.nodes.create(textChannel.guild, { + metadata: { + channel: textChannel, + client: textChannel.guild.members.me, + requestedBy: client.user + }, + selfDeaf: true, + volume: 20, + leaveOnEmpty: true, + leaveOnEmptyCooldown: 30000, + leaveOnEnd: true, + leaveOnEndCooldown: 300000 + }) + + try { if (!queue.connection) await queue.connect(voiceChannel) } + catch (error: any) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + + let result = await player.search(process.env.DISCORD_MUSIC_CURRENT_TRACK as string, { requestedBy: client.user || undefined }) + if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${process.env.DISCORD_MUSIC_CURRENT_TRACK}** !`) + let track = result.tracks[0] + + let entry = queue.tasksQueue.acquire() + await entry.getTask() + queue.addTrack(track) + + try { + await queue.node.play() + await queue.node.seek(Number(process.env.DISCORD_MUSIC_CURRENT_PROGRESS)) + await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) + } catch (error: any) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + finally { queue.tasksQueue.release() } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100755 index 0000000..19e37f7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "module": "CommonJS", /* Specify what module code is generated. */ + "types": ["node"], /* Specify type package names to be included without being referenced in a source file. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "strict": true, /* Enable all strict type-checking options. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["./src/**/*"] +} diff --git a/utils/initSequelize.js b/utils/initSequelize.js deleted file mode 100644 index 547aa43..0000000 --- a/utils/initSequelize.js +++ /dev/null @@ -1,10 +0,0 @@ -const Sequelize = require('sequelize') -require('dotenv').config() - -module.exports = new Sequelize(process.env.SEQUELIZE_DATABASE, process.env.SEQUELIZE_USER, process.env.SEQUELIZE_PASSWORD, { - host: process.env.SEQUELIZE_HOST, - dialect: process.env.SEQUELIZE_DIALECT, - dialectOptions: process.env.SEQUELIZE_DIALECTOPTIONS, - logging: process.env.SEQUELIZE_LOGGING === 'true', - storage: process.env.SEQUELIZE_STORAGE -}) \ No newline at end of file diff --git a/utilsPlayer/buttons.js b/utilsPlayer/buttons.js deleted file mode 100644 index 391a0de..0000000 --- a/utilsPlayer/buttons.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up'] \ No newline at end of file diff --git a/utilsPlayer/disco.js b/utilsPlayer/disco.js deleted file mode 100644 index 168df11..0000000 --- a/utilsPlayer/disco.js +++ /dev/null @@ -1,50 +0,0 @@ -const { useQueue } = require('discord-player') - -const appDir = require('path').dirname(require.main.filename) -const generate = require(appDir + '/utilsPlayer/generate.js') -const getUptime = require(appDir + '/utils/getUptime.js') - -module.exports = replay = async (client) => { - //client.guilds.cache.each(async guild => { - //const Data = sequelize.define(guild.id, { - // playerChannelId: DataTypes.STRING - //}) - //await sequelize.sync({ force: true }) - - //if (!Data.playerChannelId) { - // clearInterval(interval) - // console.log(`\u001b[1;31m Aucun channel inscrit dans la base, veuillez utiliser la commande \`/setchannel\` !`) - // return 'clear' - //} - //let channel = client.channels.cache.get(Data.playerChannelId) - - let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID) - if (!guild) { - clearInterval(interval) - console.log(`\u001b[1;31m Error: Aucun serveur trouvé avec l'id \`${process.env.DISCORD_GUILD_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) - return 'clear' - } - - // Keep track of the music progress if the bot reboots - let queue = useQueue(guild.id) - if (queue) if (queue.isPlaying()) writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', queue.node.playbackTime) - - let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID) - if (!channel) { - clearInterval(interval) - console.log(`\u001b[1;31m Error: Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) - return 'clear' - } - - let { embed, components } = await generate(guild) - if (components) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) - else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) - - let messages = await channel.messages.fetch() - let botMessage = messages.find(msg => msg.author.id === client.user.id) - - if (!botMessage || (!components && botMessage.components.length > 0)) { - await channel.bulkDelete(messages) - return channel.send({ embeds: [embed] }) - } else return botMessage.edit({ embeds: [embed], components }) -} \ No newline at end of file diff --git a/utilsPlayer/edit.js b/utilsPlayer/edit.js deleted file mode 100644 index d9422e4..0000000 --- a/utilsPlayer/edit.js +++ /dev/null @@ -1,63 +0,0 @@ -const { ActionRowBuilder, ButtonBuilder } = require('discord.js') - -module.exports = async (interaction) => { - /*let components = [ - new ActionRowBuilder().addComponents( - interaction.message.components[0].components.forEach(button => { - return new ButtonBuilder().setCustomId(button.customId).setLabel(button.label).setStyle(button.style).setDisabled(true) - }) - ), - new ActionRowBuilder().addComponents( - interaction.message.components[1].components.forEach(button => { - return new ButtonBuilder().setCustomId(button.customId).setLabel(button.label).setStyle(button.style).setDisabled(true) - }) - ) - ]*/ - let components = [ - new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setLabel(interaction.message.components[0].components[0].label) - .setStyle(2) - .setCustomId(interaction.message.components[0].components[0].customId) - .setDisabled(true), - new ButtonBuilder() - .setLabel('⏹️') - .setStyle(2) - .setCustomId('stop') - .setDisabled(true), - new ButtonBuilder() - .setLabel('⏭️') - .setStyle(2) - .setCustomId('skip') - .setDisabled(true), - new ButtonBuilder() - .setLabel('🔉') - .setStyle(2) - .setCustomId('volume_down') - .setDisabled(true), - new ButtonBuilder() - .setLabel('🔊') - .setStyle(2) - .setCustomId('volume_up') - .setDisabled(true) - ), - new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setLabel('🔀') - .setStyle(2) - .setCustomId('shuffle') - .setDisabled(true), - new ButtonBuilder() - .setLabel('🔁') - .setStyle(2) - .setCustomId('loop') - .setDisabled(true), - new ButtonBuilder() - .setLabel('⏮️') - .setStyle(2) - .setCustomId('previous') - .setDisabled(true) - ) - ] - await interaction.update({ components }) -} \ No newline at end of file diff --git a/utilsPlayer/replay.js b/utilsPlayer/replay.js deleted file mode 100644 index 2e0243e..0000000 --- a/utilsPlayer/replay.js +++ /dev/null @@ -1,42 +0,0 @@ -const { useMasterPlayer } = require('discord-player') - -module.exports = replay = async (client) => { - let textChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_TEXTCHANNEL_ID) - let voiceChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_VOICECHANNEL_ID) - - let player = useMasterPlayer() - let queue = player.nodes.create(textChannel.guild, { - metadata: { - channel: textChannel, - client: textChannel.guild.members.me, - requestedBy: client.user - }, - selfDeaf: true, - volume: 20, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 300000, - leaveOnEnd: true, - leaveOnEndCooldown: 300000, - skipOnNoStream: true - }) - - try { if (!queue.connection) await queue.connect(voiceChannel) } - catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } - - let result = await player.search(process.env.DISCORD_MUSIC_CURRENT_TRACK, { requestedBy: client.user }) - if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${query}** !`) - let track = result.tracks[0] - - let entry = queue.tasksQueue.acquire() - await entry.getTask() - queue.addTrack(track) - - let progress = process.env.DISCORD_MUSIC_CURRENT_PROGRESS - - try { - await queue.node.play() - queue.node.seek(progress) - await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) - } catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } - finally { queue.tasksQueue.release() } -} \ No newline at end of file