diff --git a/.env.dist b/.env.dist index 2b156c3..16f27d7 100644 --- a/.env.dist +++ b/.env.dist @@ -2,6 +2,5 @@ BOT_TOKEN = Your_Bot_Token CHANNEL_ID = Your_Channel_Id VOICE_CHANNEL_ID = Your_Voice_Channel_Id USER_ID = Your_User_Id -GOOGLE_YOUTUBE_API_KEY = Your_Youtube_Api_Key XIAOMI_SONG = false TRIGGER_PREFIX = '&' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 44af2a8..9323705 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ src .env.prin .env.copy codeExample +OLD +wait_* \ No newline at end of file diff --git a/README.md b/README.md index c04142d..9f655d3 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,18 @@ This project being at the beginning "Je Reviens Of DevilKing", so it can also se ## How to use it ? The bot has 4 commands: -_You have to add the prefix before each command (e.g. `&p [music]`)_ +_You have to add your prefix before each command (e.g. `&p [music]`)_ -- `p [music url or music name]` is used to start playing music. -- `s` is used to skip the current music -- `w` is used to pause the current music -- `r` is used to resume the current music -- `fo` disconnects the bot and stops the music playing -- `ne` play the french Xiaomi 11 Lite NE Song. -- `q` display the current music queue. -- `feur` is used to be able to "feur" your friends +- `play [music url or music name]` is used to start playing music (or `p`). +- `skip` is used to skip the current music (or `s`). +- `pause` is used to pause the current music (or `pa`). +- `resume` is used to resume the current music (or `re`). +- `fuckoff` disconnects the bot and stops the music playing (or `fo`). +- `queue` display the current music queue (or `q`). ## Deploys -**You will need a _Youtube API Key_ and a _Discord Developper Application_ !!** +**You will need a _Discord Developper Application_ !!** ### Deploy on Heroku @@ -46,33 +44,24 @@ The bot uses : - Discord.JS - [Website](https://discord.js.org/#/) - [Github repository](https://github.com/discordjs/discord.js/) - dotenv - [dotenv on npm](https://www.npmjs.com/package/dotenv) -- esm - [esm on npm](https://www.npmjs.com/package/esm) -- google APIs [Website](https://developers.google.com/) - [npm](https://www.npmjs.com/package/googleapis) - ffmpeg - [website](https://www.ffmpeg.org/) - fluent ffmpeg - [fluent-ffmpeg on npm](https://www.npmjs.com/package/fluent-ffmpeg) -- ytdl core - [Github repository](https://github.com/fent/node-ytdl-core) - [ytdl on npm](https://www.npmjs.com/package/ytdl-core) +- play-dl - [Github repository](https://github.com/play-dl/play-dl) - [ytdl on npm](https://www.npmjs.com/package/play-dl) - Heroku Buildpack FFMPEG - [Github repository](https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest) # Made by DestCom | Who | Mail | LinkedIn | GitHub | Portfolio | | ------------------------ | ------------------------------------------ | ------------------------------------------------ | ------------------------------------- | -------------------------------------------- | -| Azevedo Da Silva Antoine | [HERE](antoine.azevedo-da-silva@hetic.net) | [HERE](https://www.linkedin.com/in/antoine-ads/) | [HERE](https://github.com/DestroyCom) | [HERE](https://destroykeaum.alwaysdata.net/) | +| Azevedo Da Silva Antoine | [HERE](antoine.azevedo-da-silva@hetic.net) | [HERE](https://www.linkedin.com/in/antoine-ads/) | [HERE](https://github.com/DestroyCom) | [HERE](https://destcom.herokuapp.com/) | #### Roadmap -- [x] Basic features (play/skip/quit) -- [x] Searching music (Youtube API) -- [x] Add first discord embeds -- [x] Update Readme (How to deploy) -- [x] Handle playlist request [Planned for 0.7 realease] -- [x] Add "pause" & "resume" feature [Planned for 0.8 realease] -- [x] Delete request message [Planned for 0.8 realease] -- [x] Display actual song queue [Planned for 0.8 realease] -- [ ] Transform current function into modules [Planned for 0.9 realease] -- [x] Add customs prefix [Planned for 0.8 realease] -- [ ] Add help for getting API Key [Planned for 0.9 realease] -- [ ] Change the "Xiaomi Song" into a custom song selection & add a disabling method [Planned before 0.9 realease] +_See old steps of the roadmap at [archives/TODO.md](./archives/TODO.md)_ + +- [ ] Transform repetitive code into modules or functions [Planned for 0.9 realease] +- [ ] Add a redo play [Planned before 1.0 realease] +- [ ] Change the "Xiaomi Song" into a custom song selection & add a disabling method [Planned before 1.0 realease] - [ ] Fix "I'll be back" features and creates a disabling method [Planned before 1.0 realease] - [ ] Add multi-language support (English/French to start) [Planned before 1.0 realease] - [ ] Add Smart Assistant support [No plan] diff --git a/app.js b/app.js index 8aa1a52..b27b3f6 100644 --- a/app.js +++ b/app.js @@ -1,22 +1,12 @@ require("dotenv").config(); -//const ytdl = require("ytdl-core-discord"); const playdl = require("play-dl"); /* playdl.getFreeClientID().then((clientID) => { playdl.setToken({ soundcloud: process.env.SOUNDCLOUD_CLIENT_ID, }); }); */ -const { Client, Intents, MessageEmbed } = require("discord.js"); -const { - createAudioResource, - createAudioPlayer, - joinVoiceChannel, - generateDependencyReport, - NoSubscriberBehavior, -} = require("@discordjs/voice"); - -console.log(generateDependencyReport()); +const { Client, Intents } = require("discord.js"); const clientDiscord = new Client({ intents: [ @@ -42,7 +32,8 @@ const clientDiscord = new Client({ const PREFIX = process.env.TRIGGER_PREFIX; const queue = new Map(); -const { google } = require("googleapis"); +const actions = require("./components/action_function"); +const queue_handler = require("./components/queue_constructor"); //When the bot connect for the first time clientDiscord.once("ready", () => { @@ -60,7 +51,7 @@ clientDiscord.on("disconnect", (message) => { if (!serverQueue) return message.channel.send({ - content: "There is no song that I could stop!", + content: "Je ne suis pas connecté dans un salon vocal !", }); serverQueue.songs = []; @@ -70,7 +61,6 @@ clientDiscord.on("disconnect", (message) => { //Error handler - ex : ECONNRESET clientDiscord.on("uncaughtException", (err) => { - const serverQueue = undefined; console.log(err); }); @@ -80,44 +70,47 @@ clientDiscord.on("error", (error) => { //Main chat listener clientDiscord.on("messageCreate", (message) => { - //If the bot speaks or word dosent start with triggerd command, ignore the message - if (message.author.bot) return; - if (!message.content.startsWith(PREFIX)) return; + if (message.author.bot || !message.content.startsWith(PREFIX)) return; const serverQueue = queue.get(message.guild.id); - - message.delete(); - - if (message.content.startsWith(PREFIX + "feur")) { - //Feur case - message.channel.send({ - content: "https://destroykeaum.alwaysdata.net/assets/other/feur.mp4", - }); - } else if (message.content.startsWith(`${PREFIX}p`)) { - console.log("play"); - //play case - getURL(message, serverQueue); - return; - } else if (message.content.startsWith(`${PREFIX}s`)) { - //skip case - skip(message, serverQueue); - return; - } else if (message.content.startsWith(`${PREFIX}fo`)) { - //disconnect case - stop(message, serverQueue); - return; - } else if (message.content.startsWith(`${PREFIX}w`)) { - //pause case - pause(message, serverQueue); - } else if (message.content.startsWith(`${PREFIX}r`)) { - //pause case - resume(message, serverQueue); - } else if (message.content.startsWith(`${PREFIX}q`)) { - //pause case - actualQueue(message); - } else { - message.channel.send({ content: "La commande n'existe pas !" }); //error case + let messageArray = message.content.split(" "); + + const command = messageArray[0].slice(PREFIX.length); + switch (command) { + case "play": + case "p": + getURL(message, serverQueue); + break; + case "skip": + case "s": + actions.skip(message, serverQueue, queue); + break; + case "fuckoff": + case "fo": + actions.stop(message, serverQueue, queue); + break; + case "pause": + case "pa": + actions.pause(message, serverQueue); + break; + case "resume": + case "re": + actions.resume(message, serverQueue); + break; + case "queue": + case "q": + actions.queue(message, queue); + break; + default: + message.channel.send({ + content: "La commande n'existe pas !", + }); + break; } + + setTimeout(() => { + message.delete(); + }, 1000); }); /* @@ -142,11 +135,8 @@ clientDiscord.on('voiceStateUpdate', (oldMember, newMember) => { }); */ -function getURL(message, serverQueue) { - const arg = message.content.split(" "); - const messageReceived = message.content; - const youtubeUrlPattern = - /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$/; +async function getURL(message) { + var arg = message.content.split(" ").slice(1); const voiceChannel = message.member.voice.channel; if (!voiceChannel) { @@ -155,6 +145,7 @@ function getURL(message, serverQueue) { "Vous avez besoin d'etre dans un salon vocal pour jouer une musique !", }); } + const permissions = voiceChannel.permissionsFor(message.client.user); if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) { return message.channel.send({ @@ -162,545 +153,70 @@ function getURL(message, serverQueue) { "Le bot a besoin de la permission d'acceder et de parler dans le salon vocal !", }); } - if (arg[1] === undefined) { - return message.channel.send({ content: "Erreur dans la commande !" }); - } - const playlistUrlValid = youtubeUrlPattern.test(arg[1]); - - if (!playlistUrlValid) { - let tmpQuery = ""; - if (messageReceived.includes(PREFIX + "play ")) { - tmpQuery = messageReceived.replace(PREFIX + "play ", ""); - } - if (messageReceived.includes(PREFIX + "p ")) { - tmpQuery = messageReceived.replace(PREFIX + "p ", ""); - } - - google - .youtube("v3") - .search.list({ - key: process.env.GOOGLE_YOUTUBE_API_KEY, - part: "snippet", - q: tmpQuery, - }) - .then((response) => { - let urlTmp = - "https://www.youtube.com/watch?v=" + - response.data.items[0].id.videoId; - execute(urlTmp, message, serverQueue, urlTmp); - }) - .catch((err) => console.log(err)); - } else { - let playlistPattern = new RegExp("[&?]list=([a-z0-9_-]+)", "i"); - if (playlistPattern.test(arg[1])) { - executePlaylist(arg[1], message, serverQueue, arg[1]); - } else { - execute(arg[1], message, serverQueue, arg[1]); - } - } -} - -async function executePlaylist(playlistURL, message, serverQueue, querySearch) { - var responsePlaylistSearch = ""; - var responsePlaylistInfo = ""; - let playlistUrlId = ""; - let extractIdPattern = new RegExp("[&?]list=([a-z0-9_-]+)", "i"); - let extractedID = extractIdPattern.exec(playlistURL); - playlistUrlId = extractedID[1]; - - responsePlaylistInfo = await google - .youtube("v3") - .playlists.list({ - key: process.env.GOOGLE_YOUTUBE_API_KEY, - part: "snippet", - maxResults: 49, - id: playlistUrlId, - }) - .then((response) => { - return response.data.items; - }) - .catch((err) => console.log(err)); - - responsePlaylistSearch = await google - .youtube("v3") - .playlistItems.list({ - key: process.env.GOOGLE_YOUTUBE_API_KEY, - part: "snippet", - maxResults: 49, - playlistId: playlistUrlId, - }) - .then((response) => { - return response.data.items; - }) - .catch((err) => console.log(err)); - - var videoIdPlaylist = []; - - for (let i = 0; i < responsePlaylistSearch.length; i++) { - videoIdPlaylist.push(responsePlaylistSearch[i].snippet.resourceId.videoId); + if (arg[0] === undefined) { + return message.channel.send({ + content: "Erreur dans la commande !", + }); } - const playlistID = videoIdPlaylist; - - const embedPlayedPlaylist = new MessageEmbed() - .setTitle(message.author.username + " a ajouté une playlist !") - .setAuthor({ - name: message.author.username, - iconURL: message.author.avatarURL(), - }) - .setColor("#C4302B") - .setFooter({ - text: "StroyCord/D-Key Bot", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setThumbnail( - responsePlaylistInfo[0].snippet.thumbnails[ - Object.keys(responsePlaylistInfo[0].snippet.thumbnails)[ - Object.keys(responsePlaylistInfo[0].snippet.thumbnails).length - 1 - ] - ].url - ) - .setTimestamp() - .setURL("https://youtube.com/playlist?list=" + responsePlaylistInfo[0].id) - .addFields( - { - name: "Nom de la playlist :", - value: responsePlaylistInfo[0].snippet.title, - inline: true, - }, - { - name: "Playlist crée par :", - value: responsePlaylistInfo[0].snippet.channelTitle, - inline: true, - }, - { - name: "Mis en file d'attente :", - value: responsePlaylistSearch.length - 1 + " musiques", - } + const test_type = playdl.yt_validate(arg[0]); + + if (test_type === "search") { + arg = await message.content.replace(PREFIX + "p", ""); + let searchedVideo = await playdl.search(arg, { limit: 1 }); + + let embed_infos = [message, PREFIX]; + await queue_handler.queue_create( + message, + searchedVideo[0], + voiceChannel, + 0, + embed_infos, + test_type, + queue, + PREFIX ); + } else { + if (test_type === "playlist") { + let playlistData = await playdl.playlist_info(arg[0], { + incomplete: true, + }); - message.channel.send({ embeds: [embedPlayedPlaylist] }); - - for (const [index, id] of playlistID.entries()) { - const serverQueue = queue.get(message.guild.id); - let urlTmp = "https://www.youtube.com/watch?v=" + id; - - const voiceChannel = message.member.voice.channel; - - var songInfo = {}; - try { - var songInfo = await playdl.video_info(urlTmp); - - let minutes = Math.floor(songInfo.video_details.durationInSec / 60); - let seconds = songInfo.video_details.durationInSec - minutes * 60; - - const song = { - title: songInfo.video_details.title, - url: songInfo.video_details.url, - thumbnail: - songInfo.video_details.thumbnails[ - songInfo.video_details.thumbnails.length - 1 - ].url, - requestAuthor: message.author, - querySearch: querySearch, - videoAuthor: songInfo.video_details.channel.name, - videoLength: minutes + ":" + seconds, - }; - - if (index == 0 && !serverQueue) { - const queueContruct = { - textChannel: message.channel, - voiceChannel: voiceChannel, - connection: null, - player: null, - songs: [], - volume: 5, - playing: true, - }; - - queue.set(message.guild.id, queueContruct); - - queueContruct.songs.push(song); - - try { - var connection = await joinVoiceChannel({ - channelId: voiceChannel.id, - guildId: voiceChannel.guild.id, - adapterCreator: voiceChannel.guild.voiceAdapterCreator, - }); - queueContruct.connection = connection; - - var player = createAudioPlayer(); - queueContruct.player = player; - - play(message.guild, queueContruct.songs[0]); - } catch (error) { - console.log(error); - queue.delete(message.guild.id); - - return message.channel.send({ content: error }); - } - } else { - serverQueue.songs.push(song); - } - } catch (err) { - errors(err.statusCode, message); - return; - } - } - - /* - const playlistEmbeds = new Discord.MessageEmbed() - .setTitle(song.title) - .setAuthor(message.author.username, message.author.avatarURL()) - .setColor("#C4302B") - .setFooter("StroyCord/D-Key Bot", "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png") - .setThumbnail(song.thumbnail) - .setTimestamp() - .setURL(song.url) - .addFields({ - name: message.author.username + " a demandé cette musique !", - value: song.title - }); - message.channel.send(embedPlayed) - */ -} - -async function execute(url, message, serverQueue, querySearch) { - const voiceChannel = message.member.voice.channel; - - try { - var songInfo = await playdl.video_info(url); - - let minutes = Math.floor(songInfo.video_details.durationInSec / 60); - let seconds = songInfo.video_details.durationInSec - minutes * 60; - seconds = seconds < 10 ? "0" + seconds : seconds; - - const song = { - title: songInfo.video_details.title, - url: songInfo.video_details.url, - thumbnail: - songInfo.video_details.thumbnails[ - songInfo.video_details.thumbnails.length - 1 - ].url, - requestAuthor: message.author, - querySearch: querySearch, - videoAuthor: songInfo.video_details.channel.name, - videoLength: minutes + ":" + seconds, - }; - - if (!serverQueue) { - const queueContruct = { - textChannel: message.channel, - voiceChannel: voiceChannel, - connection: null, - player: null, - songs: [], - volume: 5, - playing: true, - }; - - queue.set(message.guild.id, queueContruct); - - queueContruct.songs.push(song); - - try { - const embedPlayed = new MessageEmbed() - .setTitle(song.title) - .setAuthor({ - name: message.author.username, - iconURL: message.author.avatarURL(), - }) - .setColor("#C4302B") - .setFooter({ - text: "StroyCord/D-Key Bot", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setThumbnail(song.thumbnail) - .setTimestamp() - .setURL(song.url) - .addFields( - { - name: message.author.username + " a demandé cette musique !", - value: song.title, - }, - { - name: "De :", - value: song.videoAuthor, - inline: true, - }, - { - name: "Trouvé avec :", - value: PREFIX + "p " + song.querySearch, - inline: true, - }, - { - name: "Durée :", - value: song.videoLength, - } - ); - message.channel.send({ embeds: [embedPlayed] }); - - var connection = await joinVoiceChannel({ - channelId: voiceChannel.id, - guildId: voiceChannel.guild.id, - adapterCreator: voiceChannel.guild.voiceAdapterCreator, - }); - queueContruct.connection = connection; - - var player = createAudioPlayer(); - queueContruct.player = player; - - play(message.guild, queueContruct.songs[0]); - return; - } catch (error) { - console.log(error); - queue.delete(message.guild.id); - return message.channel.send({ content: error }); - } - } else { - serverQueue.songs.push(song); - const embedAdded = new MessageEmbed() - .setTitle( - message.author.username + - " a ajouté une musique sur la file d'attente !" - ) - .setAuthor({ - name: message.author.username, - iconURL: message.author.avatarURL(), - trez, - }) - .setColor("#C4302B") - .setFooter({ - text: "StroyCord/D-Key Bot", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setThumbnail(song.thumbnail) - .setTimestamp() - .setURL(song.url) - .addFields( - { - name: song.title, - value: "\u200B", - }, - { - name: "De :", - value: song.videoAuthor, - inline: true, - }, - { - name: "Trouvé avec :", - value: PREFIX + "p " + song.querySearch, - inline: true, - }, - { - name: "Durée :", - value: song.videoLength, - } + let embed_infos = [message, playlistData]; + + for (const [index, video] of playlistData.videos.entries()) { + if (index === 30) break; + let response = null; + response = await queue_handler.queue_create( + message, + video, + voiceChannel, + index, + embed_infos, + test_type, + queue, + PREFIX ); - return message.channel.send({ embeds: [embedAdded] }); - } - } catch (err) { - errors(err.statusCode, message); - return; - } -} - -async function play(guild, song) { - const serverQueue = queue.get(guild.id); - if (!song) { - queue.delete(guild.id); - serverQueue.connection.destroy(); - return; - } - - const source = await playdl.stream(song.url); - const stream = createAudioResource(source.stream, { - inputType: source.type, - }); - - serverQueue.player.play(stream); - - serverQueue.connection.subscribe(serverQueue.player); - - serverQueue.player.on("stateChange", (oldState, newState) => { - console.log( - `Audio player transitioned from ${oldState.status} to ${newState.status}` - ); - - if (newState.status === "idle") { - if (serverQueue.songs.length != 0 && serverQueue.songs.length >= 0) { - serverQueue.songs.shift(); - play(guild, serverQueue.songs[0]); - } else { - queue.delete(guild.id); - serverQueue.connection.destroy(); + if (response === "ERR") break; } - } - }); -} - -function skip(message, serverQueue) { - if (!message.member.voice.channel) - return message.channel.send({ - content: - "Vous avez besoin d'etre dans un salon vocal pour arreter une musique !", - }); - if (!serverQueue) { - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - } - - let tmpGuildObject = { - id: message.guildId, - }; - - serverQueue.songs.shift(); - play(tmpGuildObject, serverQueue.songs[0]); -} - -function stop(message, serverQueue) { - if (!message.member.voice.channel) - return message.channel.send({ - content: - "Vous avez besoin d'etre dans un salon vocal pour arreter le bot !", - }); - - if (!serverQueue) - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - - serverQueue.connection.destroy(); - queue.delete(message.guildId); - - return message.channel - .send({ content: `❌ ${message.author} a déconnecté le bot !` }) - .catch(console.error); -} - -function pause(message, serverQueue) { - if (!message.member.voice.channel) - return message.channel.send({ - content: - "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", - }); - - if (!serverQueue) - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - - if (serverQueue.playing) { - serverQueue.playing = false; - serverQueue.player.pause(); - return message.channel - .send({ content: `⏸ ${message.author} a mis en pause la musique !` }) - .catch(console.error); - } -} - -function resume(message, serverQueue) { - if (!message.member.voice.channel) - return message.channel.send({ - content: - "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", - }); - - if (!serverQueue) - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - - if (!serverQueue.playing) { - serverQueue.playing = true; - serverQueue.player.unpause(); - return message.channel - .send({ content: `▶ ${message.author} a repris la musique !` }) - .catch(console.error); - } -} - -function actualQueue(message) { - const serverQueue = queue.get(message.guild.id); - - if (!serverQueue) - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - - let songsList = serverQueue.songs; - - if (songsList.length === 0) { - return message.channel.send({ - content: "Aucune musique n'est jouée actuellement !", - }); - } - let tabEmbeds = []; - songsList.forEach((song, index) => { - if (index > 10) { - return; - } else if (index === 10) { - tabEmbeds.push({ - name: "...", - value: "\u200B", - }); } else { - tabEmbeds.push({ - name: index + 1 + ". " + song.title, - value: song.videoAuthor + ", " + song.videoLength + " minutes.", - }); + let embed_infos = [message, PREFIX]; + + await queue_handler.queue_create( + message, + { url: arg[0] }, + voiceChannel, + 0, + embed_infos, + test_type, + queue, + PREFIX + ); } - }); - - const embedQueue = new MessageEmbed() - .setTitle( - "Vous avez " + songsList.length + " musiques en liste d'attente !" - ) - .setAuthor({ - name: "Stroycord", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setColor("#37123C") - .setFooter({ - text: "StroyCord/D-Key Bot", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setTimestamp() - .addFields(tabEmbeds); - - return message.channel.send({ embeds: [embedQueue] }); -} - -function errors(errorCode, message) { - switch (errorCode) { - case 403: - case 410: - let errorEmbed = new MessageEmbed() - .setTitle("⚠️ ERREUR : Impossible d'acceder à la musique demandée !") - .setAuthor({ - name: "Stroycord", - iconURL: - "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", - }) - .setColor("#181818") - .setTimestamp() - .addFields({ - name: "Les raisons peuvent etre diverses (vidéo soumise a une limite d'âge, privée, bloquée par les ayants droits)", - value: "Error code : 410", - }); - return message.channel.send({ embeds: [errorEmbed] }); - default: - return; } } +require("./components/bases").dependencies_reports(); clientDiscord.login(process.env.BOT_TOKEN); diff --git a/app.json b/app.json index fb2c7e5..74b7543 100644 --- a/app.json +++ b/app.json @@ -33,11 +33,6 @@ "required": "true", "value": "YOUR CHANNEL_ID" }, - "GOOGLE_YOUTUBE_API_KEY": { - "description": "The API Key from google API used for the music search.", - "required": "true", - "value": "YOUR GOOGLE_YOUTUBE_API_KEY" - }, "XIAOMI_SONG": { "description": "Boolean. if True: Activate the NE command for playing Xiaomi 11 Lite NE Song.", "required": "true", @@ -49,6 +44,6 @@ "value": "&" } }, - "success_url": "https://destroykeaum.alwaysdata.net/caard.html", + "success_url": "https://destcom.herokuapp.com/", "keywords": ["nodejs", "discord", "discordjs", "esm", "dotenv", "music", "youtube"] } \ No newline at end of file diff --git a/archives/TODO.md b/archives/TODO.md new file mode 100644 index 0000000..3f1a1c6 --- /dev/null +++ b/archives/TODO.md @@ -0,0 +1,12 @@ +# Roadmap Archive + +- [x] Basic features (play/skip/quit) +- [x] Searching music (Youtube API) +- [x] Add first discord embeds +- [x] Update Readme (How to deploy) +- [x] Handle playlist request [Planned for 0.7 realease] +- [x] Add "pause" & "resume" feature [Planned for 0.8 realease] +- [x] Delete request message [Planned for 0.8 realease] +- [x] Display actual song queue [Planned for 0.8 realease] +- [x] Add customs prefix [Planned for 0.8 realease] +- [x] ~~Add help for getting API Key [Planned for 0.9 realease]~~ (unnecessary) \ No newline at end of file diff --git a/archives/before-modules/app.js b/archives/before-modules/app.js new file mode 100644 index 0000000..484a0a9 --- /dev/null +++ b/archives/before-modules/app.js @@ -0,0 +1,718 @@ +require("dotenv").config(); + +//const ytdl = require("ytdl-core-discord"); +const playdl = require("play-dl"); +/* playdl.getFreeClientID().then((clientID) => { + playdl.setToken({ + soundcloud: process.env.SOUNDCLOUD_CLIENT_ID, + }); +}); */ +const { Client, Intents, MessageEmbed } = require("discord.js"); +const { + createAudioResource, + createAudioPlayer, + joinVoiceChannel, + generateDependencyReport, + NoSubscriberBehavior, +} = require("@discordjs/voice"); + +console.log(generateDependencyReport()); + +const clientDiscord = new Client({ + intents: [ + Intents.FLAGS.GUILDS, + Intents.FLAGS.GUILD_MEMBERS, + Intents.FLAGS.GUILD_BANS, + Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, + Intents.FLAGS.GUILD_INTEGRATIONS, + Intents.FLAGS.GUILD_WEBHOOKS, + Intents.FLAGS.GUILD_INVITES, + Intents.FLAGS.GUILD_VOICE_STATES, + Intents.FLAGS.GUILD_PRESENCES, + Intents.FLAGS.GUILD_MESSAGES, + Intents.FLAGS.GUILD_MESSAGE_REACTIONS, + Intents.FLAGS.GUILD_MESSAGE_TYPING, + Intents.FLAGS.DIRECT_MESSAGES, + Intents.FLAGS.DIRECT_MESSAGE_REACTIONS, + Intents.FLAGS.DIRECT_MESSAGE_TYPING, + Intents.FLAGS.GUILD_SCHEDULED_EVENTS, + ], +}); + +const PREFIX = process.env.TRIGGER_PREFIX; +const queue = new Map(); + +const { google } = require("googleapis"); + +//When the bot connect for the first time +clientDiscord.once("ready", () => { + console.log(`Logged in as ${clientDiscord.user.tag}!`); +}); + +//When the bot reconnect +clientDiscord.once("reconnecting", () => { + console.log("Reconnecting!"); +}); + +//When the bot disconnect +clientDiscord.on("disconnect", (message) => { + const serverQueue = queue.get(message.guild.id); + + if (!serverQueue) + return message.channel.send({ + content: "There is no song that I could stop!", + }); + + serverQueue.songs = []; + serverQueue.connection.dispatcher.end(); + console.log("Disconnect!"); +}); + +//Error handler - ex : ECONNRESET +clientDiscord.on("uncaughtException", (err) => { + const serverQueue = undefined; + console.log(err); +}); + +clientDiscord.on("error", (error) => { + console.log("Error occured :", error); +}); + +//Main chat listener +clientDiscord.on("messageCreate", (message) => { + //If the bot speaks or word dosent start with triggerd command, ignore the message + if (message.author.bot) return; + if (!message.content.startsWith(PREFIX)) return; + + const serverQueue = queue.get(message.guild.id); + + message.delete(); + + if (message.content.startsWith(PREFIX + "feur")) { + //Feur case + message.channel.send({ + content: "https://destroykeaum.alwaysdata.net/assets/other/feur.mp4", + }); + } else if (message.content.startsWith(`${PREFIX}p`)) { + console.log("play"); + //play case + getURL(message, serverQueue); + return; + } else if (message.content.startsWith(`${PREFIX}s`)) { + //skip case + skip(message, serverQueue); + return; + } else if (message.content.startsWith(`${PREFIX}fo`)) { + //disconnect case + stop(message, serverQueue); + return; + } else if (message.content.startsWith(`${PREFIX}w`)) { + //pause case + pause(message, serverQueue); + } else if (message.content.startsWith(`${PREFIX}r`)) { + //pause case + resume(message, serverQueue); + } else if (message.content.startsWith(`${PREFIX}q`)) { + //pause case + actualQueue(message); + } else { + message.channel.send({ content: "La commande n'existe pas !" }); //error case + } +}); + +/* + +JE Reviens case + +clientDiscord.on('voiceStateUpdate', (oldMember, newMember) => { + let newUserChannel = newMember.channelID; + let oldUserChannel = oldMember.channelID; + + const channel = clientDiscord.channels.cache.get(process.env.CHANNEL_ID); + var leaversUsername = oldMember.member.user.id; + + let channelId = String(process.env.VOICE_CHANNEL_ID); + + if (newUserChannel === channelId) { + return; + } else if (leaversUsername === process.env.USER_ID) { + let msgToSend = "Je reviens !"; + channel.send(msgToSend); + } +}); +*/ + +function getURL(message, serverQueue) { + const arg = message.content.split(" "); + const messageReceived = message.content; + const youtubeUrlPattern = + /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$/; + + const voiceChannel = message.member.voice.channel; + if (!voiceChannel) { + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour jouer une musique !", + }); + } + const permissions = voiceChannel.permissionsFor(message.client.user); + if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) { + return message.channel.send({ + content: + "Le bot a besoin de la permission d'acceder et de parler dans le salon vocal !", + }); + } + if (arg[1] === undefined) { + return message.channel.send({ content: "Erreur dans la commande !" }); + } + + const playlistUrlValid = youtubeUrlPattern.test(arg[1]); + + if (!playlistUrlValid) { + let tmpQuery = ""; + if (messageReceived.includes(PREFIX + "play ")) { + tmpQuery = messageReceived.replace(PREFIX + "play ", ""); + } + if (messageReceived.includes(PREFIX + "p ")) { + tmpQuery = messageReceived.replace(PREFIX + "p ", ""); + } + + google + .youtube("v3") + .search.list({ + key: process.env.GOOGLE_YOUTUBE_API_KEY, + part: "snippet", + q: tmpQuery, + }) + .then((response) => { + let urlTmp = + "https://www.youtube.com/watch?v=" + + response.data.items[0].id.videoId; + execute(urlTmp, message, serverQueue, urlTmp); + }) + .catch((err) => console.log(err)); + } else { + let playlistPattern = new RegExp("[&?]list=([a-z0-9_-]+)", "i"); + if (playlistPattern.test(arg[1])) { + executePlaylist(arg[1], message, serverQueue, arg[1]); + } else { + execute(arg[1], message, serverQueue, arg[1]); + } + } +} + +async function executePlaylist(playlistURL, message, serverQueue, querySearch) { + var responsePlaylistSearch = ""; + var responsePlaylistInfo = ""; + let playlistUrlId = ""; + let extractIdPattern = new RegExp("[&?]list=([a-z0-9_-]+)", "i"); + let extractedID = extractIdPattern.exec(playlistURL); + playlistUrlId = extractedID[1]; + + responsePlaylistInfo = await google + .youtube("v3") + .playlists.list({ + key: process.env.GOOGLE_YOUTUBE_API_KEY, + part: "snippet", + maxResults: 49, + id: playlistUrlId, + }) + .then((response) => { + return response.data.items; + }) + .catch((err) => console.log(err)); + + responsePlaylistSearch = await google + .youtube("v3") + .playlistItems.list({ + key: process.env.GOOGLE_YOUTUBE_API_KEY, + part: "snippet", + maxResults: 49, + playlistId: playlistUrlId, + }) + .then((response) => { + return response.data.items; + }) + .catch((err) => console.log(err)); + + var videoIdPlaylist = []; + + for (let i = 0; i < responsePlaylistSearch.length; i++) { + videoIdPlaylist.push(responsePlaylistSearch[i].snippet.resourceId.videoId); + } + + const playlistID = videoIdPlaylist; + + const embedPlayedPlaylist = new MessageEmbed() + .setTitle(message.author.username + " a ajouté une playlist !") + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setThumbnail( + responsePlaylistInfo[0].snippet.thumbnails[ + Object.keys(responsePlaylistInfo[0].snippet.thumbnails)[ + Object.keys(responsePlaylistInfo[0].snippet.thumbnails).length - 1 + ] + ].url + ) + .setTimestamp() + .setURL("https://youtube.com/playlist?list=" + responsePlaylistInfo[0].id) + .addFields( + { + name: "Nom de la playlist :", + value: responsePlaylistInfo[0].snippet.title, + inline: true, + }, + { + name: "Playlist crée par :", + value: responsePlaylistInfo[0].snippet.channelTitle, + inline: true, + }, + { + name: "Mis en file d'attente :", + value: responsePlaylistSearch.length - 1 + " musiques", + } + ); + + message.channel.send({ embeds: [embedPlayedPlaylist] }); + + for (const [index, id] of playlistID.entries()) { + const serverQueue = queue.get(message.guild.id); + let urlTmp = "https://www.youtube.com/watch?v=" + id; + + const voiceChannel = message.member.voice.channel; + + var songInfo = {}; + try { + var songInfo = await playdl.video_info(urlTmp); + + let minutes = Math.floor(songInfo.video_details.durationInSec / 60); + let seconds = songInfo.video_details.durationInSec - minutes * 60; + + const song = { + title: songInfo.video_details.title, + url: songInfo.video_details.url, + thumbnail: + songInfo.video_details.thumbnails[ + songInfo.video_details.thumbnails.length - 1 + ].url, + requestAuthor: message.author, + querySearch: querySearch, + videoAuthor: songInfo.video_details.channel.name, + videoLength: minutes + ":" + seconds, + }; + + if (index == 0 && !serverQueue) { + const queueContruct = { + textChannel: message.channel, + voiceChannel: voiceChannel, + connection: null, + player: null, + songs: [], + volume: 5, + playing: true, + }; + + queue.set(message.guild.id, queueContruct); + + queueContruct.songs.push(song); + + try { + var connection = await joinVoiceChannel({ + channelId: voiceChannel.id, + guildId: voiceChannel.guild.id, + adapterCreator: voiceChannel.guild.voiceAdapterCreator, + }); + queueContruct.connection = connection; + + var player = createAudioPlayer(); + queueContruct.player = player; + + play(message.guild, queueContruct.songs[0]); + } catch (error) { + console.log(error); + queue.delete(message.guild.id); + + return message.channel.send({ content: error }); + } + } else { + serverQueue.songs.push(song); + } + } catch (err) { + errors(err.statusCode, message); + return; + } + } + + /* + const playlistEmbeds = new Discord.MessageEmbed() + .setTitle(song.title) + .setAuthor(message.author.username, message.author.avatarURL()) + .setColor("#C4302B") + .setFooter("StroyCord/D-Key Bot", "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png") + .setThumbnail(song.thumbnail) + .setTimestamp() + .setURL(song.url) + .addFields({ + name: message.author.username + " a demandé cette musique !", + value: song.title + }); + message.channel.send(embedPlayed) + */ +} + +async function execute(url, message, serverQueue, querySearch) { + const voiceChannel = message.member.voice.channel; + + try { + var songInfo = await playdl.video_info(url); + + let minutes = Math.floor(songInfo.video_details.durationInSec / 60); + let seconds = songInfo.video_details.durationInSec - minutes * 60; + seconds = seconds < 10 ? "0" + seconds : seconds; + + const song = { + title: songInfo.video_details.title, + url: songInfo.video_details.url, + thumbnail: + songInfo.video_details.thumbnails[ + songInfo.video_details.thumbnails.length - 1 + ].url, + requestAuthor: message.author, + querySearch: querySearch, + videoAuthor: songInfo.video_details.channel.name, + videoLength: minutes + ":" + seconds, + }; + + if (!serverQueue) { + const queueContruct = { + textChannel: message.channel, + voiceChannel: voiceChannel, + connection: null, + player: null, + songs: [], + volume: 5, + playing: true, + }; + + queue.set(message.guild.id, queueContruct); + + queueContruct.songs.push(song); + + try { + const embedPlayed = new MessageEmbed() + .setTitle(song.title) + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setThumbnail(song.thumbnail) + .setTimestamp() + .setURL(song.url) + .addFields( + { + name: message.author.username + " a demandé cette musique !", + value: song.title, + }, + { + name: "De :", + value: song.videoAuthor, + inline: true, + }, + { + name: "Trouvé avec :", + value: PREFIX + "p " + song.querySearch, + inline: true, + }, + { + name: "Durée :", + value: song.videoLength, + } + ); + message.channel.send({ embeds: [embedPlayed] }); + + var connection = await joinVoiceChannel({ + channelId: voiceChannel.id, + guildId: voiceChannel.guild.id, + adapterCreator: voiceChannel.guild.voiceAdapterCreator, + }); + queueContruct.connection = connection; + + var player = createAudioPlayer(); + queueContruct.player = player; + + play(message.guild, queueContruct.songs[0]); + return; + } catch (error) { + console.log(error); + queue.delete(message.guild.id); + return message.channel.send({ content: error }); + } + } else { + serverQueue.songs.push(song); + const embedAdded = new MessageEmbed() + .setTitle( + message.author.username + + " a ajouté une musique sur la file d'attente !" + ) + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + trez, + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setThumbnail(song.thumbnail) + .setTimestamp() + .setURL(song.url) + .addFields( + { + name: song.title, + value: "\u200B", + }, + { + name: "De :", + value: song.videoAuthor, + inline: true, + }, + { + name: "Trouvé avec :", + value: PREFIX + "p " + song.querySearch, + inline: true, + }, + { + name: "Durée :", + value: song.videoLength, + } + ); + + return message.channel.send({ embeds: [embedAdded] }); + } + } catch (err) { + errors(err.statusCode, message); + return; + } +} + +async function play(guild, song) { + const serverQueue = queue.get(guild.id); + if (!song) { + queue.delete(guild.id); + serverQueue.connection.destroy(); + return; + } + + var source = null; + /* try { */ + console.log("source", song.url); + source = await playdl.stream(song.url); + + console.log(source); + + const stream = createAudioResource(source.stream, { + inputType: source.type, + }); + + serverQueue.player.play(stream); + + serverQueue.connection.subscribe(serverQueue.player); + /* } catch (err) { + console.log(err, "handleerror"); + skip("skipError", serverQueue); + } */ + + serverQueue.player.on("stateChange", (oldState, newState) => { + console.log( + `Audio player transitioned from ${oldState.status} to ${newState.status}` + ); + + if (newState.status === "idle") { + if (serverQueue.songs.length != 0 && serverQueue.songs.length >= 0) { + serverQueue.songs.shift(); + play(guild, serverQueue.songs[0]); + } else { + queue.delete(guild.id); + serverQueue.connection.destroy(); + } + } + }); +} + +function skip(message, serverQueue) { + if (message !== "skipError") { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour arreter une musique !", + }); + } + if (!serverQueue) { + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + } + + let tmpGuildObject = { + id: message.guildId, + }; + + serverQueue.songs.shift(); + play(tmpGuildObject, serverQueue.songs[0]); +} + +function stop(message, serverQueue) { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour arreter le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + serverQueue.connection.destroy(); + queue.delete(message.guildId); + + return message.channel + .send({ content: `❌ ${message.author} a déconnecté le bot !` }) + .catch(console.error); +} + +function pause(message, serverQueue) { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + if (serverQueue.playing) { + serverQueue.playing = false; + serverQueue.player.pause(); + return message.channel + .send({ content: `⏸ ${message.author} a mis en pause la musique !` }) + .catch(console.error); + } +} + +function resume(message, serverQueue) { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + if (!serverQueue.playing) { + serverQueue.playing = true; + serverQueue.player.unpause(); + return message.channel + .send({ content: `▶ ${message.author} a repris la musique !` }) + .catch(console.error); + } +} + +function actualQueue(message) { + const serverQueue = queue.get(message.guild.id); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + let songsList = serverQueue.songs; + + if (songsList.length === 0) { + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + } + let tabEmbeds = []; + songsList.forEach((song, index) => { + if (index > 10) { + return; + } else if (index === 10) { + tabEmbeds.push({ + name: "...", + value: "\u200B", + }); + } else { + tabEmbeds.push({ + name: index + 1 + ". " + song.title, + value: song.videoAuthor + ", " + song.videoLength + " minutes.", + }); + } + }); + + const embedQueue = new MessageEmbed() + .setTitle( + "Vous avez " + songsList.length + " musiques en liste d'attente !" + ) + .setAuthor({ + name: "Stroycord", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setColor("#37123C") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setTimestamp() + .addFields(tabEmbeds); + + return message.channel.send({ embeds: [embedQueue] }); +} + +function errors(errorCode, message) { + switch (errorCode) { + case 403: + case 410: + let errorEmbed = new MessageEmbed() + .setTitle("⚠️ ERREUR : Impossible d'acceder à la musique demandée !") + .setAuthor({ + name: "Stroycord", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setColor("#181818") + .setTimestamp() + .addFields({ + name: "Les raisons peuvent etre diverses (vidéo soumise a une limite d'âge, privée, bloquée par les ayants droits)", + value: "Error code : 410", + }); + return message.channel.send({ embeds: [errorEmbed] }); + default: + return; + } +} + +clientDiscord.login(process.env.BOT_TOKEN); diff --git a/archives/before-modules/app.json b/archives/before-modules/app.json new file mode 100644 index 0000000..fb2c7e5 --- /dev/null +++ b/archives/before-modules/app.json @@ -0,0 +1,54 @@ +{ + "name": "StroyCord/D-Key Bot - Music Bot for discord", + "description": "A discord bot to play music on discord's VC", + "repository": "https://github.com/DestroyCom/JE-REVIENS-OF-DEVILKING", + "logo": "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + "website": "https://destroykeaum.alwaysdata.net/", + "buildpacks": [{ + "url": "heroku/nodejs" + }, + { + "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest" + } + ], + + "env": { + "BOT_TOKEN": { + "description": "The token of your bot discord.", + "required": "true", + "value": "YOUR BOT_TOKEN" + }, + "USER_ID": { + "description": "The id of the user you want to see when he logs out.", + "required": "true", + "value": "YOUR USER_ID" + }, + "VOICE_CHANNEL_ID": { + "description": "The id of the voice room you are checking.", + "required": "true", + "value": "YOUR VOICE_CHANNEL_ID" + }, + "CHANNEL_ID": { + "description": "The id of the salon where you want to send the message.", + "required": "true", + "value": "YOUR CHANNEL_ID" + }, + "GOOGLE_YOUTUBE_API_KEY": { + "description": "The API Key from google API used for the music search.", + "required": "true", + "value": "YOUR GOOGLE_YOUTUBE_API_KEY" + }, + "XIAOMI_SONG": { + "description": "Boolean. if True: Activate the NE command for playing Xiaomi 11 Lite NE Song.", + "required": "true", + "value": "false" + }, + "TRIGGER_PREFIX": { + "description": "Single Character. The prefix with which you intend to use the bot (e.g. to trigger commands).", + "required": "true", + "value": "&" + } + }, + "success_url": "https://destroykeaum.alwaysdata.net/caard.html", + "keywords": ["nodejs", "discord", "discordjs", "esm", "dotenv", "music", "youtube"] +} \ No newline at end of file diff --git a/archives/before-modules/package.json b/archives/before-modules/package.json new file mode 100644 index 0000000..952595f --- /dev/null +++ b/archives/before-modules/package.json @@ -0,0 +1,33 @@ +{ + "name": "stroycord", + "description": "La fameuse phrase \"je reviens\" de DevilKing a chaque depart de ce dernier de discord INCLUS MAINTENANT UN BOT MUSICAL", + "version": "0.8.4", + "engines": { + "node": "16.13.2" + }, + "scripts": { + "start": "node app.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/DestroyCom/JE-REVIENS-OF-DEVILKING.git" + }, + "author": "Dest.Com", + "license": "MIT", + "bugs": { + "url": "https://github.com/DestroyCom/JE-REVIENS-OF-DEVILKING/issues" + }, + "homepage": "https://github.com/DestroyCom/JE-REVIENS-OF-DEVILKING#readme", + "dependencies": { + "@discordjs/opus": "^0.5.3", + "@discordjs/voice": "^0.7.5", + "discord.js": "^13.6.0", + "dotenv": "^12.0.3", + "ffmpeg": "^0.0.4", + "ffmpeg-static": "^4.4.1", + "googleapis": "^92.0.0", + "libsodium-wrappers": "^0.7.9", + "play-dl": "^1.7.8" + } +} diff --git a/components/action_function.js b/components/action_function.js new file mode 100644 index 0000000..d36ef70 --- /dev/null +++ b/components/action_function.js @@ -0,0 +1,157 @@ +const playdl = require("play-dl"); +const { AudioPlayerStatus, createAudioResource } = require("@discordjs/voice"); + +const embed_constructor = require("./embed_constructor"); + +const play = async (guild, song, queue) => { + const serverQueue = queue.get(guild.id); + if (!song) { + queue.delete(guild.id); + try { + if (serverQueue) { + serverQueue.connection.destroy(); + } + } catch (e) { + console.log("Connection already destroyed"); + console.log(e); + } + return; + } + + var source = await playdl.stream(song.url); + + const stream = createAudioResource(source.stream, { + inputType: source.type, + }); + + serverQueue.player.play(stream); + + serverQueue.connection.subscribe(serverQueue.player); + + serverQueue.player.on(AudioPlayerStatus.Idle, () => { + serverQueue.songs.shift(); + play(guild, serverQueue.songs[0], queue); + }); + + return; +}; + +const skip = (message, serverQueue, queue) => { + if (message !== "skipError") { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour arreter une musique !", + }); + } + if (!serverQueue) { + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + } + + let tmpGuildObject = { + id: message.guildId, + }; + + serverQueue.songs.shift(); + play(tmpGuildObject, serverQueue.songs[0], queue); +}; + +const stop = (message, serverQueue, queue) => { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour arreter le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + try { + serverQueue.connection.destroy(); + } catch (e) { + console.log("Connection already destroyed"); + console.log(e); + } + queue.delete(message.guildId); + + return message.channel + .send({ + content: `❌ ${message.author} a déconnecté le bot !`, + }) + .catch(console.error); +}; + +const pause = (message, serverQueue) => { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + if (serverQueue.playing) { + serverQueue.playing = false; + serverQueue.player.pause(); + return message.channel + .send({ + content: `⏸ ${message.author} a mis en pause la musique !`, + }) + .catch(console.error); + } +}; + +const resume = (message, serverQueue) => { + if (!message.member.voice.channel) + return message.channel.send({ + content: + "Vous avez besoin d'etre dans un salon vocal pour controler le bot !", + }); + + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + if (!serverQueue.playing) { + serverQueue.playing = true; + serverQueue.player.unpause(); + return message.channel + .send({ + content: `▶ ${message.author} a repris la musique !`, + }) + .catch(console.error); + } +}; + +const queue = (message, queue) => { + const serverQueue = queue.get(message.guild.id); + if (!serverQueue) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + let songsList = serverQueue.songs; + + if (!serverQueue || songsList.length === 0) + return message.channel.send({ + content: "Aucune musique n'est jouée actuellement !", + }); + + return message.channel.send({ + embeds: [embed_constructor.queue(songsList)], + }); +}; + +exports.play = play; +exports.skip = skip; +exports.stop = stop; +exports.pause = pause; +exports.resume = resume; +exports.queue = queue; diff --git a/components/bases.js b/components/bases.js new file mode 100644 index 0000000..79223c2 --- /dev/null +++ b/components/bases.js @@ -0,0 +1,12 @@ +const embed_constructor = require("./embed_constructor"); + +exports.dependencies_reports = () => { + let { generateDependencyReport } = require("@discordjs/voice"); + console.log(generateDependencyReport()); +}; + +exports.errors = (errorMsg, message) => { + return message.channel.send({ + embeds: [embed_constructor.error(errorMsg)], + }); +}; diff --git a/components/embed_constructor.js b/components/embed_constructor.js new file mode 100644 index 0000000..7565ba3 --- /dev/null +++ b/components/embed_constructor.js @@ -0,0 +1,176 @@ +const { MessageEmbed } = require("discord.js"); + +exports.new = (song, message, PREFIX) => { + return new MessageEmbed() + .setTitle(song.title) + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setThumbnail(song.thumbnail) + .setTimestamp() + .setURL(song.url) + .addFields( + { + name: message.author.username + " a demandé cette musique !", + value: song.title, + }, + { + name: "De :", + value: song.videoAuthor, + inline: true, + }, + { + name: "Trouvé avec :", + value: PREFIX + "p " + song.url, + inline: true, + }, + { + name: "Durée :", + value: song.videoLength, + } + ); +}; + +exports.list = (message, playlistData, PREFIX) => { + let size = playlistData.videos.length; + if (size > 30) size = 30; + + let msg = new MessageEmbed() + .setTitle(message.author.username + " a ajouté une playlist !") + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setTimestamp() + .setURL(playlistData.url) + .addFields( + { + name: "Trouvé avec :", + value: PREFIX + "p " + playlistData.url, + }, + { + name: "Nom de la playlist :", + value: playlistData.title, + inline: true, + }, + { + name: "Playlist crée par :", + value: playlistData.channel.name, + inline: true, + }, + { + name: "Mis en file d'attente :", + value: + (playlistData.videos.length > 30 ? 30 : playlistData.videos.length) + + " musiques", + } + ); + + if (playlistData.thumbnail !== undefined) + msg.setThumbnail(playlistData.thumbnail.url); + + return msg; +}; + +exports.added = (song, message, PREFIX) => { + return new MessageEmbed() + .setTitle( + message.author.username + " a ajouté une musique sur la file d'attente !" + ) + .setAuthor({ + name: message.author.username, + iconURL: message.author.avatarURL(), + }) + .setColor("#C4302B") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setThumbnail(song.thumbnail) + .setTimestamp() + .setURL(song.url) + .addFields( + { + name: song.title, + value: "\u200B", + }, + { + name: "De :", + value: song.videoAuthor, + inline: true, + }, + { + name: "Trouvé avec :", + value: PREFIX + "p " + song.url, + inline: true, + }, + { + name: "Durée :", + value: song.videoLength, + } + ); +}; + +exports.queue = (songsList) => { + let tabEmbeds = []; + songsList.forEach((song, index) => { + if (index > 10) { + return; + } else if (index === 10) { + tabEmbeds.push({ + name: "...", + value: "\u200B", + }); + } else { + tabEmbeds.push({ + name: index + 1 + ". " + song.title, + value: song.videoAuthor + ", " + song.videoLength + " minutes.", + }); + } + }); + + return new MessageEmbed() + .setTitle( + "Vous avez " + songsList.length + " musiques en liste d'attente !" + ) + .setAuthor({ + name: "Stroycord", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setColor("#37123C") + .setFooter({ + text: "StroyCord/D-Key Bot", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setTimestamp() + .addFields(tabEmbeds); +}; + +exports.error = (errorMsg) => { + return new MessageEmbed() + .setTitle("⚠️ UNE ERREUR S'EST PRODUITE !") + .setDescription(errorMsg) + .setAuthor({ + name: "Stroycord", + iconURL: + "https://destroykeaum.alwaysdata.net/assets/other/stroybot_logo.png", + }) + .setColor("#181818") + .setTimestamp(); +}; diff --git a/components/queue_constructor.js b/components/queue_constructor.js new file mode 100644 index 0000000..908456d --- /dev/null +++ b/components/queue_constructor.js @@ -0,0 +1,92 @@ +const playdl = require("play-dl"); +const { createAudioPlayer, joinVoiceChannel } = require("@discordjs/voice"); + +const bases = require("./bases"); +const embed_constructor = require("./embed_constructor"); +const song_constructor = require("./song_constructor"); +const actions = require("./action_function"); + +const queue_create = async ( + message, + video, + voiceChannel, + index, + embed, + type, + queue, + PREFIX +) => { + const serverQueue = queue.get(message.guild.id); + var songInfo = {}; + + try { + var songInfo = await playdl.video_info(video.url); + + let minutes = Math.floor(songInfo.video_details.durationInSec / 60); + let seconds = songInfo.video_details.durationInSec - minutes * 60; + + const song = await song_constructor.song( + songInfo, + message, + minutes, + seconds + ); + + if (index == 0 && !serverQueue) { + const queueContruct = { + textChannel: message.channel, + voiceChannel: voiceChannel, + connection: null, + player: null, + songs: [], + volume: 5, + playing: true, + }; + + queue.set(message.guild.id, queueContruct); + + queueContruct.songs.push(song); + + try { + var connection = await joinVoiceChannel({ + channelId: voiceChannel.id, + guildId: voiceChannel.guild.id, + adapterCreator: voiceChannel.guild.voiceAdapterCreator, + }); + queueContruct.connection = connection; + + var player = createAudioPlayer(); + queueContruct.player = player; + + actions.play(message.guild, queueContruct.songs[0], queue); + + if (type == "playlist") { + return message.channel.send({ + embeds: [embed_constructor.list(embed[0], embed[1], PREFIX)], + }); + } else { + return message.channel.send({ + embeds: [embed_constructor.new(song, embed[0], embed[1])], + }); + } + } catch (error) { + queue.delete(message.guild.id); + require("./bases").errors(error, message); + return "ERR"; + } + } else { + serverQueue.songs.push(song); + if (serverQueue && index === 0) + return message.channel.send({ + embeds: [embed_constructor.added(song, embed[0], embed[1])], + }); + } + } catch (err) { + console.log(err); + bases.errors(err.toString(), message); + return "ERR"; + return; + } +}; + +exports.queue_create = queue_create; diff --git a/components/song_constructor.js b/components/song_constructor.js new file mode 100644 index 0000000..e820965 --- /dev/null +++ b/components/song_constructor.js @@ -0,0 +1,14 @@ +exports.song = async (songInfo, message, minutes, seconds) => { + return { + title: songInfo.video_details.title, + url: songInfo.video_details.url, + thumbnail: + songInfo.video_details.thumbnails[ + songInfo.video_details.thumbnails.length - 1 + ].url, + requestAuthor: message.author, + querySearch: "p", + videoAuthor: songInfo.video_details.channel.name, + videoLength: minutes + ":" + seconds, + }; +}; diff --git a/package-lock.json b/package-lock.json index ffbc024..462fc49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,25 @@ { "name": "stroycord", - "version": "0.8.0.beta", + "version": "0.9.0-beta.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "stroycord", - "version": "0.8.0.beta", + "version": "0.9.0-beta.5", "license": "MIT", "dependencies": { - "@discordjs/opus": "^0.5.3", - "@discordjs/voice": "^0.7.5", + "@discordjs/opus": "^0.7.0", + "@discordjs/voice": "^0.8.0", "discord.js": "^13.6.0", "dotenv": "^12.0.3", "ffmpeg": "^0.0.4", - "ffmpeg-static": "^4.4.1", - "googleapis": "^92.0.0", - "libsodium-wrappers": "^0.7.9", - "play-dl": "^1.7.8" + "ffmpeg-static": "^5.0.0", + "libsodium-wrappers": "^0.7.10", + "play-dl": "^1.9.4" }, "engines": { - "node": "16.13.2" + "node": ">=16.14.*" } }, "node_modules/@derhuerst/http-basic": { @@ -82,56 +81,111 @@ } }, "node_modules/@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.7.0.tgz", + "integrity": "sha512-3Xxa3dh7taSDwBAR5fLALZ/KTxvbMmHCMxYLYve6NlPO7Ms1CLmKqp/R4ZoVzkRGQVUVWEhaB1s0v9jfa2tfDg==", "hasInstallScript": true, "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" + "@discordjs/node-pre-gyp": "^0.4.2", + "node-addon-api": "^4.2.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@discordjs/voice": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.7.5.tgz", - "integrity": "sha512-lUk+CmIXNKslT6DkC9IF9rpsqhzlTiedauUCPBzepjd4XWxwBZiyVIzR6QpbAirxkAwCoAbbje+3Ho71PGLEAw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.8.0.tgz", + "integrity": "sha512-o0JfVLMs3eLjUzPf6oxMydEeum40I7xzfUc66SLN+RrKpSAsTbngf5qnCF53nm+KDNSvrwg1AZqNm4LEAdxJIA==", "dependencies": { "@types/ws": "^8.2.0", - "discord-api-types": "^0.24.0", + "discord-api-types": "^0.26.1", "prism-media": "^1.3.2", "tiny-typed-emitter": "^2.1.0", "tslib": "^2.3.1", - "ws": "^8.2.3" + "ws": "^8.4.2" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=16.9.0" } }, - "node_modules/@discordjs/voice/node_modules/discord-api-types": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", - "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==", + "node_modules/@discordjs/voice/node_modules/@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" + } + }, + "node_modules/@discordjs/voice/node_modules/ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@discordjs/voice/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true, + "peer": true + }, + "node_modules/@discordjs/voice/node_modules/prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "peerDependencies": { + "@discordjs/opus": "^0.5.0", + "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } } }, "node_modules/@sapphire/async-queue": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", - "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", + "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sindresorhus/is": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", - "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -140,14 +194,14 @@ } }, "node_modules/@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "node_modules/@types/node-fetch": { - "version": "2.5.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", - "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -167,9 +221,9 @@ } }, "node_modules/@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dependencies": { "@types/node": "*" } @@ -179,17 +233,6 @@ "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/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -226,12 +269,17 @@ "node": ">=10" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, "node_modules/asynckit": { @@ -244,33 +292,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "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/bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", - "engines": { - "node": "*" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -280,28 +301,11 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -353,33 +357,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -391,9 +368,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -459,21 +436,13 @@ } }, "node_modules/dotenv": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-12.0.3.tgz", - "integrity": "sha512-RlOysyzyGiABgDFgITo5fRnMV1QStdoVvkXhnxQc5Or/CiQo52s2Bh6DVMvzZsmFQ9IrNxYHOC/gdpNwHsitnQ==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-12.0.4.tgz", + "integrity": "sha512-oWdqbSywffzH1l4WXKPHWA0TWYpqp7IyLfqjipT4upoIFS0HPMqtNotykQpD4iIg0BqtNmdgPCh2WMvMt7yTiw==", "engines": { "node": ">=12" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -487,24 +456,6 @@ "node": ">=6" } }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, "node_modules/ffmpeg": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz", @@ -514,9 +465,9 @@ } }, "node_modules/ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.0.tgz", + "integrity": "sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA==", "hasInstallScript": true, "dependencies": { "@derhuerst/http-basic": "^8.2.0", @@ -525,7 +476,7 @@ "progress": "^2.0.3" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/form-data": { @@ -557,11 +508,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -581,46 +527,6 @@ "node": ">=10" } }, - "node_modules/gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dependencies": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -640,102 +546,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/google-auth-library": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.11.0.tgz", - "integrity": "sha512-3S5jn2quRumvh9F/Ubf7GFrIq71HZ5a6vqosgdIu105kkk0WtSqc2jGCRqtWWOLRS8SX3AHACMOEDxhyWAQIcg==", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-p12-pem": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", - "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", - "dependencies": { - "node-forge": "^1.0.0" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/googleapis": { - "version": "92.0.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-92.0.0.tgz", - "integrity": "sha512-5HgJg7XvqEEJ+GO+2gvnzd5cAcDuSS/VB6nW7thoyj2GMq9nH4VvJwncSevinjLCnv06a+VSxrXNiL5vePHojA==", - "dependencies": { - "google-auth-library": "^7.0.2", - "googleapis-common": "^5.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/googleapis-common": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.0.5.tgz", - "integrity": "sha512-o2dgoW4x4fLIAN+IVAOccz3mEH8Lj1LP9c9BSSvkNJEn+U7UZh0WSr4fdH08x5VH7+sstIpd1lOYFZD0g7j4pw==", - "dependencies": { - "extend": "^3.0.2", - "gaxios": "^4.0.0", - "google-auth-library": "^7.0.2", - "qs": "^6.7.0", - "url-template": "^2.0.8", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "dependencies": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -788,58 +598,20 @@ "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, "node_modules/libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" }, "node_modules/libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", "dependencies": { "libsodium": "^0.7.0" } @@ -878,28 +650,28 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -947,27 +719,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + "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/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", - "engines": { - "node": ">= 6.13.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/nopt": { @@ -1003,14 +775,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1033,46 +797,21 @@ } }, "node_modules/play-audio": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.4.9.tgz", - "integrity": "sha512-An88OAvbCcFZH00n9eq6+t2LmJUPJgBCz8ycKXdvUWQz3GcZ3U4o1ZsSHfVFIuoiKuovX+ue5gKNcfSs4ophew==" + "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.7.8", - "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.7.8.tgz", - "integrity": "sha512-yxK+qmZ09HATi/T2bBHQX2n2nJ9UI7g9btIi+NKjABZw1ISpgK4AIHJ3y5B+HfG77g4SUbbBZ6fK9fiGnDxuUA==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.4.tgz", + "integrity": "sha512-/NiD3rpZw/5zbtUhF87AQEmHYLBD5QhtCD/9c3b47xvZMxCO3eHLEN5G1h/b/lC1lCp+xj5BpdYefOrIbDhBUQ==", "dependencies": { - "play-audio": "^0.4.3" + "play-audio": "^0.5.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1086,31 +825,18 @@ "node": ">=0.4.0" } }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "node_modules/rimraf": { @@ -1128,28 +854,14 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1165,30 +877,17 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string-width": { @@ -1242,9 +941,9 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "node_modules/ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" }, "node_modules/tslib": { "version": "2.3.1", @@ -1256,24 +955,11 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1307,9 +993,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { "node": ">=10.0.0" }, @@ -1332,9 +1018,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/zod": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz", - "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==", + "version": "3.14.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.4.tgz", + "integrity": "sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -1386,53 +1072,85 @@ } }, "@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.7.0.tgz", + "integrity": "sha512-3Xxa3dh7taSDwBAR5fLALZ/KTxvbMmHCMxYLYve6NlPO7Ms1CLmKqp/R4ZoVzkRGQVUVWEhaB1s0v9jfa2tfDg==", "requires": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" + "@discordjs/node-pre-gyp": "^0.4.2", + "node-addon-api": "^4.2.0" } }, "@discordjs/voice": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.7.5.tgz", - "integrity": "sha512-lUk+CmIXNKslT6DkC9IF9rpsqhzlTiedauUCPBzepjd4XWxwBZiyVIzR6QpbAirxkAwCoAbbje+3Ho71PGLEAw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.8.0.tgz", + "integrity": "sha512-o0JfVLMs3eLjUzPf6oxMydEeum40I7xzfUc66SLN+RrKpSAsTbngf5qnCF53nm+KDNSvrwg1AZqNm4LEAdxJIA==", "requires": { "@types/ws": "^8.2.0", - "discord-api-types": "^0.24.0", + "discord-api-types": "^0.26.1", "prism-media": "^1.3.2", "tiny-typed-emitter": "^2.1.0", "tslib": "^2.3.1", - "ws": "^8.2.3" + "ws": "^8.4.2" }, "dependencies": { - "discord-api-types": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", - "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==" + "@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "optional": true, + "peer": true, + "requires": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + } + }, + "ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "optional": true, + "peer": true, + "requires": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true, + "peer": true + }, + "prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "requires": {} } } }, "@sapphire/async-queue": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", - "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", + "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==" }, "@sindresorhus/is": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", - "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@types/node": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", - "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==" }, "@types/node-fetch": { - "version": "2.5.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", - "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -1451,9 +1169,9 @@ } }, "@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "requires": { "@types/node": "*" } @@ -1463,14 +1181,6 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "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==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -1496,13 +1206,20 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1513,16 +1230,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bignumber.js": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", - "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1532,25 +1239,11 @@ "concat-map": "0.0.1" } }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1588,35 +1281,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "console-control-strings": { @@ -1630,9 +1294,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -1674,17 +1338,9 @@ } }, "dotenv": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-12.0.3.tgz", - "integrity": "sha512-RlOysyzyGiABgDFgITo5fRnMV1QStdoVvkXhnxQc5Or/CiQo52s2Bh6DVMvzZsmFQ9IrNxYHOC/gdpNwHsitnQ==" - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-12.0.4.tgz", + "integrity": "sha512-oWdqbSywffzH1l4WXKPHWA0TWYpqp7IyLfqjipT4upoIFS0HPMqtNotykQpD4iIg0BqtNmdgPCh2WMvMt7yTiw==" }, "emoji-regex": { "version": "8.0.0", @@ -1696,21 +1352,6 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, - "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==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, "ffmpeg": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz", @@ -1720,9 +1361,9 @@ } }, "ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.0.tgz", + "integrity": "sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA==", "requires": { "@derhuerst/http-basic": "^8.2.0", "env-paths": "^2.2.0", @@ -1753,11 +1394,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -1774,37 +1410,6 @@ "wide-align": "^1.1.2" } }, - "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - } - }, - "gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "requires": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - } - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -1818,75 +1423,6 @@ "path-is-absolute": "^1.0.0" } }, - "google-auth-library": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.11.0.tgz", - "integrity": "sha512-3S5jn2quRumvh9F/Ubf7GFrIq71HZ5a6vqosgdIu105kkk0WtSqc2jGCRqtWWOLRS8SX3AHACMOEDxhyWAQIcg==", - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - }, - "google-p12-pem": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", - "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", - "requires": { - "node-forge": "^1.0.0" - } - }, - "googleapis": { - "version": "92.0.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-92.0.0.tgz", - "integrity": "sha512-5HgJg7XvqEEJ+GO+2gvnzd5cAcDuSS/VB6nW7thoyj2GMq9nH4VvJwncSevinjLCnv06a+VSxrXNiL5vePHojA==", - "requires": { - "google-auth-library": "^7.0.2", - "googleapis-common": "^5.0.2" - } - }, - "googleapis-common": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-5.0.5.tgz", - "integrity": "sha512-o2dgoW4x4fLIAN+IVAOccz3mEH8Lj1LP9c9BSSvkNJEn+U7UZh0WSr4fdH08x5VH7+sstIpd1lOYFZD0g7j4pw==", - "requires": { - "extend": "^3.0.2", - "gaxios": "^4.0.0", - "google-auth-library": "^7.0.2", - "qs": "^6.7.0", - "url-template": "^2.0.8", - "uuid": "^8.0.0" - } - }, - "gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "requires": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1935,52 +1471,20 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, "libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" }, "libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", "requires": { "libsodium": "^0.7.0" } @@ -2009,22 +1513,22 @@ } }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -2057,23 +1561,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } }, - "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" - }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -2098,11 +1597,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2122,24 +1616,18 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "play-audio": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.4.9.tgz", - "integrity": "sha512-An88OAvbCcFZH00n9eq6+t2LmJUPJgBCz8ycKXdvUWQz3GcZ3U4o1ZsSHfVFIuoiKuovX+ue5gKNcfSs4ophew==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz", + "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==" }, "play-dl": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.7.8.tgz", - "integrity": "sha512-yxK+qmZ09HATi/T2bBHQX2n2nJ9UI7g9btIi+NKjABZw1ISpgK4AIHJ3y5B+HfG77g4SUbbBZ6fK9fiGnDxuUA==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.4.tgz", + "integrity": "sha512-/NiD3rpZw/5zbtUhF87AQEmHYLBD5QhtCD/9c3b47xvZMxCO3eHLEN5G1h/b/lC1lCp+xj5BpdYefOrIbDhBUQ==", "requires": { - "play-audio": "^0.4.3" + "play-audio": "^0.5.2" } }, - "prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "requires": {} - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2150,22 +1638,18 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "requires": { - "side-channel": "^1.0.4" - } - }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -2177,14 +1661,14 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -2194,27 +1678,17 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "string-width": { @@ -2259,9 +1733,9 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" }, "tslib": { "version": "2.3.1", @@ -2273,21 +1747,11 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2321,9 +1785,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} }, "yallist": { @@ -2332,9 +1796,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "zod": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz", - "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==" + "version": "3.14.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.4.tgz", + "integrity": "sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw==" } } } diff --git a/package.json b/package.json index 952595f..c1245be 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "stroycord", "description": "La fameuse phrase \"je reviens\" de DevilKing a chaque depart de ce dernier de discord INCLUS MAINTENANT UN BOT MUSICAL", - "version": "0.8.4", + "version": "0.9.0-beta.5", "engines": { - "node": "16.13.2" + "node": ">=16.14.*" }, "scripts": { "start": "node app.js", @@ -20,14 +20,13 @@ }, "homepage": "https://github.com/DestroyCom/JE-REVIENS-OF-DEVILKING#readme", "dependencies": { - "@discordjs/opus": "^0.5.3", - "@discordjs/voice": "^0.7.5", + "@discordjs/opus": "^0.7.0", + "@discordjs/voice": "^0.8.0", "discord.js": "^13.6.0", "dotenv": "^12.0.3", "ffmpeg": "^0.0.4", - "ffmpeg-static": "^4.4.1", - "googleapis": "^92.0.0", - "libsodium-wrappers": "^0.7.9", - "play-dl": "^1.7.8" + "ffmpeg-static": "^5.0.0", + "libsodium-wrappers": "^0.7.10", + "play-dl": "^1.9.4" } }