├── config.json ├── commands ├── ping.js ├── disconnect.js ├── join.js ├── stats.js ├── stop.js ├── help.js ├── shuffle.js ├── loop.js ├── resume.js ├── queue.js ├── pause.js ├── drop.js ├── nowplaying.js ├── jump.js ├── volume.js ├── skip.js └── play.js ├── package.json ├── README.md ├── server.js ├── system └── music.js └── shrinkwrap.yaml /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "PREFIX": "!", 3 | "TOKEN": "Do not add your token here please head to .env and add it there", 4 | "QUEUE_LIMIT": 0 , 5 | "COLOR": "RED", 6 | "inviteURL": "Support Server" 7 | } 8 | -------------------------------------------------------------------------------- /commands/ping.js: -------------------------------------------------------------------------------- 1 | //FIRST TEST HANDLER IS WORKING OR NOT 2 | const Discord = require("discord.js"); 3 | module.exports = { 4 | name: "ping", 5 | description: "Pinging the bot", 6 | execute(client, message, args) { 7 | let ping = new Discord.MessageEmbed() 8 | .setTitle(`Client Latency`) 9 | .setDescription(`${client.ws.ping}ms`); 10 | message.channel.send(ping); 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "music-bot-tutorial", 3 | "version": "v1.5.8", 4 | "description": "Music Bot Source For My Video On YouTube", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node ." 8 | }, 9 | "dependencies": { 10 | "express": "^4.17.1", 11 | "discord.js": "^12.5.3", 12 | "fs": "^0.0.2", 13 | "path": "^0.12.7", 14 | "ytdl-core": "^4.8.3", 15 | "@discordjs/opus": "^0.5.3", 16 | "moment": "^2.29.1", 17 | "ms": "^2.1.3", 18 | "node-opus": "^0.3.3", 19 | "ytsr": "^3.5.0", 20 | "chatbot-zero": "^1.0.2" 21 | }, 22 | "engines": { 23 | "node": "12.x" 24 | }, 25 | "repository": { 26 | "url": "https://glitch.com/edit/#!/music-bot-tutorial" 27 | }, 28 | "license": "CC", 29 | "keywords": [ 30 | "node", 31 | "glitch", 32 | "express" 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /commands/disconnect.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | 4 | const discord = require("discord.js"); 5 | 6 | module.exports = { 7 | name: "disconnect", 8 | description: "Disconnect the bot and take some rest.", 9 | aliases: ["dc"], 10 | async execute(client, message, args) { 11 | let embed = new MessageEmbed().setColor(COLOR); 12 | 13 | const { channel } = message.member.voice; 14 | 15 | if (!channel) { 16 | //IF AUTHOR IS NOT IN VOICE CHANNEL 17 | embed.setAuthor( 18 | "❌ | You need to be in a voice channel before executing this command" 19 | ); 20 | return message.channel.send(embed); 21 | } 22 | const serverQueue = message.client.queue.get(message.guild.id); 23 | await channel.leave(); 24 | embed.setAuthor("Successfully Disconnected"); 25 | return message.channel.send(embed); 26 | 27 | serverQueue.songs = []; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /commands/join.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | module.exports = { 4 | name: "join", 5 | description: "Join a specific voice channel you are in", 6 | aliases: ["join", "connect", "j"], 7 | async execute(client, message, args) { 8 | let channel = message.member.voice.channel; 9 | if (!channel) 10 | return message.channel.send( 11 | "I'm sorry but you need to be in a voice channel!", 12 | message.channel 13 | ); 14 | 15 | try { 16 | const connection = await channel.join(); 17 | } catch (error) { 18 | console.error(`I could not join the voice channel: ${error}`); 19 | } 20 | 21 | const embed = new MessageEmbed() 22 | .setAuthor("Joined Voice Channel") 23 | .setColor(COLOR) 24 | .setTitle(`Success`) 25 | .setDescription(`🎶 Joined The Voice Channel. ${channel}.`) 26 | .setTimestamp(); 27 | 28 | return message.channel.send(embed); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /commands/stats.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | 4 | module.exports = { 5 | name: "stats", 6 | description: "Get the detailed information of bot", 7 | aliases: ["botinfo"], 8 | execute(client, message, args) { 9 | let embed = new MessageEmbed() 10 | .setColor(COLOR) 11 | .setThumbnail(client.user.displayAvatarURL()) 12 | .setAuthor(`STATS AND INFORMATION`, client.user.displayAvatarURL()) 13 | .setDescription( 14 | `My name is **${client.user.username}** and My work is to play Music` 15 | ) 16 | .addField("SERVERS", client.guilds.cache.size, true) 17 | .addField("ID", client.user.id, true) 18 | .addField("PRESENCE", client.user.presence.activities[0].name, true) 19 | .addField("UPTIME", client.uptime, true) 20 | .addField("STATUS", client.user.presence.status, true) 21 | .addField("TOTAL MEMBERS", client.users.cache.size); 22 | console.log(client.user.presence); 23 | message.channel.send(embed); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /commands/stop.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | 4 | const discord = require("discord.js"); 5 | 6 | module.exports = { 7 | name: "stop", 8 | description: "Clear the queue on the bot [Bot Stays In VC!]", 9 | aliases: ["clear", "c", "clearqueue"], 10 | async execute(client, message, args) { 11 | let embed = new MessageEmbed().setColor(COLOR); 12 | 13 | const { channel } = message.member.voice; 14 | 15 | if (!channel) { 16 | //IF AUTHOR IS NOT IN VOICE CHANNEL 17 | embed.setAuthor( 18 | "❌ | You need to be in a voice channel before executing this command" 19 | ); 20 | return message.channel.send(embed); 21 | } 22 | 23 | const serverQueue = message.client.queue.get(message.guild.id); 24 | 25 | if (!serverQueue) { 26 | await channel.leave(); 27 | embed.setAuthor("Successfully Disconnected"); 28 | return message.channel.send(embed); 29 | } 30 | 31 | serverQueue.songs = []; 32 | serverQueue.connection.dispatcher.end(); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /commands/help.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { readdirSync } = require("fs"); 3 | const { COLOR } = require("../config.json"); 4 | module.exports = { 5 | name: "help", 6 | description: "Get all commands name and description", 7 | execute(client, message, args) { 8 | function cap(command) { 9 | return command.charAt(0).toUpperCase() + command.slice(1); 10 | } 11 | let embed = new MessageEmbed() 12 | .setAuthor("HELP SECTION", client.user.displayAvatarURL()) 13 | .setThumbnail(client.user.displayAvatarURL()) 14 | .setColor(COLOR) 15 | .setDescription( 16 | `**These are the commands for ${client.user.username} Bot**` 17 | ); 18 | let command = readdirSync("./commands"); 19 | 20 | let i; 21 | for (i = 0; i < command.length; i++) { 22 | console.log(command[i]); 23 | 24 | const cmd = client.commands.get(command[i].replace(".js", "")); 25 | const x = cap(`${cmd.name}`); 26 | embed.addField(`${x}`, `\`${cmd.description}\``, true); 27 | } 28 | 29 | message.channel.send(embed); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /commands/shuffle.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "shuffle", 7 | description: "Shuffle your queue and have fun!", 8 | aliases: ["sh"], 9 | async execute(client, message, args) { 10 | const serverQueue = message.client.queue.get(message.guild.id); 11 | if (!serverQueue) 12 | return message.channel.send("There are no songs that I could shuffle"); 13 | try { 14 | let songs = serverQueue.songs; 15 | for (let m = songs.length - 1; m > 1; m--) { 16 | let x = 1 + Math.floor(Math.random() * m); 17 | [songs[m], songs[x]] = [songs[x], songs[m]]; 18 | } 19 | serverQueue.songs = songs; 20 | await message.client.queue.set(message.guild.id, serverQueue); 21 | message.react("🔀"); 22 | } catch (error) { 23 | message.guild.member.voice.channel.leave(); 24 | message.client.queue.delete(message.guild.id); 25 | return message.channel.send( 26 | `:notes: The player has stopped and the queue has been cleared.: \`${error}\`` 27 | ); 28 | } 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /commands/loop.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | 4 | module.exports = { 5 | name: "loop", 6 | description: "Loop Your Queue and have fun", 7 | aliases: ["round"], 8 | execute(client, message, args) { 9 | let embed = new MessageEmbed().setColor(COLOR); 10 | 11 | const { channel } = message.member.voice; 12 | if (!channel) { 13 | //IF AUTHOR IS NOT IN VOICE CHANNEL 14 | embed.setAuthor( 15 | "❌ | Must be in a voice channel before executing this command" 16 | ); 17 | return message.channel.send(embed); 18 | } 19 | 20 | const serverQueue = message.client.queue.get(message.guild.id); 21 | 22 | if (!serverQueue) { 23 | embed.setAuthor("There is nothing playing that I could loop"); 24 | return message.channel.send(embed); 25 | } 26 | 27 | //OOOOF 28 | serverQueue.loop = !serverQueue.loop; 29 | 30 | embed.setDescription( 31 | `Loop is now **${serverQueue.loop ? "Enabled" : "Disabled"}**` 32 | ); 33 | embed.setThumbnail(client.user.displayAvatarURL()); 34 | message.channel.send(embed); 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /commands/resume.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "resume", 7 | description: "Resume the Cureent Playing Song", 8 | aliases: ["start"], 9 | execute(client, message, args) { 10 | let embed = new MessageEmbed().setColor(COLOR); 11 | 12 | const { channel } = message.member.voice; 13 | 14 | if (!channel) { 15 | //IF AUTHOR IS NOT IN VOICE CHANNEL 16 | embed.setAuthor( 17 | "❌ | You need to be in a voice channel before executing this command" 18 | ); 19 | return message.channel.send(embed); 20 | } 21 | 22 | const serverQueue = message.client.queue.get(message.guild.id); 23 | if (serverQueue && !serverQueue.playing) { 24 | serverQueue.playing = true; 25 | serverQueue.connection.dispatcher.resume(); 26 | embed.setAuthor("✅ | Resumed the Paused Song"); 27 | embed.setThumbnail(client.user.displayAvatarURL()); 28 | return message.channel.send(embed); 29 | } 30 | embed.setDescription("There is nothing paused that i can resume"); 31 | message.channel.send(embed); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /commands/queue.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "queue", 7 | description: "Get all the song name which are in queue", 8 | aliases: ["q",'list'], 9 | execute: (client, message, args) => { 10 | let embed = new MessageEmbed().setColor(COLOR); 11 | const { channel } = message.member.voice; 12 | 13 | if (!channel) { 14 | //IF AUTHOR IS NOT IN VOICE CHANNEL 15 | embed.setAuthor("❌ | You need to be in a Voice Channel Before executing this command"); 16 | return message.channel.send(embed); 17 | } 18 | 19 | const serverQueue = message.client.queue.get(message.guild.id); 20 | 21 | if (!serverQueue) { 22 | embed.setAuthor("There is nothing in the queue"); 23 | return message.channel.send(embed); 24 | } 25 | 26 | embed.setDescription( 27 | `${serverQueue.songs 28 | .map((song, index) => index + 1 + ". " + song.title) 29 | .join("\n\n")}`, 30 | { split: true } 31 | ); 32 | embed.setThumbnail(client.user.displayAvatarURL()) 33 | 34 | message.channel.send(embed); 35 | } 36 | }; 37 | 38 | -------------------------------------------------------------------------------- /commands/pause.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "pause", 7 | description: "Pause the cureent playing Song", 8 | aliases: ["chill"], 9 | execute(client, message, args) { 10 | const { channel } = message.member.voice; 11 | let embed = new MessageEmbed().setColor(COLOR); 12 | 13 | if (!channel) { 14 | //IF AUTHOR IS NOT IN VOICE CHANNEL 15 | embed.setAuthor( 16 | "❌ | Must be in a voice channel before executing this command" 17 | ); 18 | return message.channel.send(embed); 19 | } 20 | 21 | const serverQueue = message.client.queue.get(message.guild.id); 22 | 23 | if (!serverQueue) { 24 | embed.setAuthor("There is nothing playing that i could pause"); 25 | return message.channel.send(embed); 26 | } 27 | 28 | if (serverQueue && serverQueue.playing) { 29 | serverQueue.playing = false; 30 | serverQueue.connection.dispatcher.pause(true); 31 | 32 | embed.setDescription("✅ | Paused The Current Playing Song"); 33 | embed.setThumbnail(client.user.displayAvatarURL()); 34 | return message.channel.send(embed); 35 | } 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /commands/drop.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | module.exports = { 4 | name: "drop", 5 | description: "Drop The Song From Queue", 6 | aliases: ["d"], 7 | execute(client, message, args) { 8 | let embed = new MessageEmbed().setColor(COLOR); 9 | const { channel } = message.member.voice; 10 | if (!channel) { 11 | embed.setAuthor(":x: Must be in a voice channel before executing"); 12 | return message.channe.send(embed); 13 | } 14 | 15 | const serverQueue = client.queue.get(message.guild.id); 16 | 17 | if (!serverQueue) { 18 | embed.setAuthor("The Queue is empty"); 19 | return message.channel.send(embed); 20 | } 21 | 22 | if (isNaN(args[0])) { 23 | embed.setAuthor("Please Use Numerical Values Only"); 24 | return message.channel.send(embed); 25 | } 26 | 27 | if (parseInt(args[0]) > serverQueue.songs.length) { 28 | embed.setAuthor("Unable to find this song"); 29 | return message.channel.send(embed); 30 | } 31 | 32 | serverQueue.songs.splice(parseInt(args[0]) - 1, 1); 33 | embed.setDescription("✅ | Dropped the song from queue"); 34 | embed.setThumbnail(client.user.displayAvatarURL()); 35 | return message.channel.send(embed); 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /commands/nowplaying.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "nowplaying", 7 | description: "Get the name of current playing song", 8 | aliases: ["np"], 9 | execute(client, message, args) { 10 | let embed = new MessageEmbed().setColor(COLOR); 11 | 12 | const { channel } = message.member.voice; 13 | if (!channel) { 14 | //IF AUTHOR IS NOT IN VOICE CHANNEL 15 | embed.setAuthor( 16 | "❌ | Need to be in a voice channel before executing this command" 17 | ); 18 | return message.channel.send(embed); 19 | } 20 | 21 | const serverQueue = message.client.queue.get(message.guild.id); 22 | 23 | if (!serverQueue) { 24 | embed.setAuthor("Bot is not playing anything"); 25 | return message.channel.send(embed); 26 | } 27 | 28 | embed 29 | .setDescription(`📀 | **Now Playing** | ${serverQueue.songs[0].title}`) 30 | .setImage(serverQueue.songs[0].thumbnail); 31 | embed 32 | .setThumbnail(serverQueue.songs[0].avatar) 33 | .setFooter("Want a bot like this? Subscribe to ZeroSync on yt!") 34 | .addField(`Playing In`, `${channel}`, true) 35 | .addField(`Bound To`, `${serverQueue.channel}`, true) 36 | .setTimestamp(); 37 | message.channel.send(embed); 38 | } 39 | }; 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **This music bot was created by 0_0#6666** 2 | 3 | # Updated, Thursday, 3rd June 2021 4 | 5 | ### Library Version : v12.5.3 6 | 7 | ### Node Version : 12.x or higher 8 | 9 | #### Code Version : v1.7.0 10 | 11 | ### Update Log: 12 | 13 | ##### • Bot Stays In VC 24/7 Unless disconnect command is executed ( 24/7 Host required ) 14 | 15 | ##### • Added Thumbnail(s) as image on play and now playing command 16 | 17 | ##### • Updated Dependencies 18 | 19 | ##### • Squashed Bugs 20 | 21 | ##### • Worked On Common Errors 22 | 23 | ##### • Increased Highwatermark for better ytdl stream quality! 24 | 25 | _To set up your bot please head to config.json and paste in your bot token along with youtube API key!_ 26 | 27 | **This bot is fully customisable join [Support Server](https://discord.gg/ARu4hr6hJw) for support and other questions** 28 | 29 | **_READ_** 30 | 31 | **IN CONFIG.JS DO NOT CHANGE ANY VARIABLE THE COLOR VARIABLE IS FOR THE EMBED COLOR AND EVERYTHING ELSE IS SELF EPLAINATORY JUST CHANGE THE VALUES 32 | INSIDE "" TO MAKE YOUR BOT FUNCTION PROPERLY!** 33 | 34 | Youtube Channel: **https://www.youtube.com/c/ZeroSync** 35 | 36 | **NOTE 37 | `THIS BOT DIES IF YOU DON'T USE IT EVERY 5 MINUTES CAN BE EASILY RE-HOSTED BY REGENERATING THE TOKEN AND REPPLACING IT IF YOU WANT A SCRIPT THAT PREVENTS THIS JOIN THE SERVER ABOVE AND DM 0_0#6666 THIS MIGHT GET YOUR PROJECT SUSPENDED BUT YOU CAN ALWAYS MAKE A NEW ONE USING MY TUTORIAL :D`** 38 | -------------------------------------------------------------------------------- /commands/jump.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | const { COLOR } = require("../config.json"); 3 | 4 | module.exports = { 5 | name: "jump", 6 | description: "Jump to any song you like", 7 | aliases: ["skipto","playfrom","play"], 8 | execute(client, message, args) { 9 | let embed = new MessageEmbed().setColor(COLOR); 10 | 11 | const { channel } = message.member.voice; 12 | if (!channel) { 13 | //IF AUTHOR IS NOT IN VOICE CHANNEL 14 | embed.setAuthor("YOU NEED TO BE IN VOICE CHANNEL :/"); 15 | return message.channel.send(embed); 16 | } 17 | 18 | const serverQueue = message.client.queue.get(message.guild.id); 19 | 20 | if (!serverQueue) { 21 | embed.setAuthor("There is nothing playing that I could loop"); 22 | return message.channel.send(embed); 23 | } 24 | if (!args[0]) { 25 | embed.setAuthor(`Please Give The Song Number`); 26 | return message.channel.send(embed); 27 | } 28 | 29 | if (isNaN(args[0])) { 30 | embed.setAuthor("Please Use Numerical Values Only"); 31 | return message.channel.send(embed); 32 | } 33 | 34 | if (serverQueue.songs.length < parseInt(args[0])) { 35 | embed.setAuthor("Unable To Find This Song in Queue"); 36 | return message.channel.send(embed); 37 | } 38 | serverQueue.songs.splice(Math.floor(parseInt(args[0]) - 1), 1); 39 | serverQueue.connection.dispatcher.end(); 40 | 41 | embed.setDescription(`Jumped to song number - ${args[0]}`); 42 | message.channel.send(embed); 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /commands/volume.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | module.exports = { 5 | name: "volume", 6 | description: "Manage the volume of the song", 7 | aliases: ["vol", "v"], 8 | execute(client, message, args) { 9 | if (!message.member.hasPermission("ADMINISTRATOR")) { 10 | return message.channel.send( 11 | "You are not allowed to change the volume of the music" 12 | ); 13 | } 14 | 15 | let embed = new MessageEmbed().setColor(COLOR); 16 | 17 | const { channel } = message.member.voice; 18 | if (!channel) { 19 | //IF AUTHOR IS NOT IN VOICE CHANNEL 20 | embed.setAuthor("YOU NEED TO BE IN VOICE CHANNEL :/"); 21 | return message.channel.send(embed); 22 | } 23 | 24 | const serverQueue = message.client.queue.get(message.guild.id); 25 | 26 | if (!serverQueue) { 27 | embed.setAuthor("Bot is not playing anything"); 28 | return message.channel.send(embed); 29 | } 30 | 31 | if (!args[0]) { 32 | embed.setAuthor(`The Current Volume is ${serverQueue.volume}`); 33 | return message.channel.send(embed); 34 | } 35 | 36 | if (isNaN(args[0])) { 37 | embed.setAuthor("Please Use Numerical Values Only"); 38 | return message.channel.send(embed); 39 | } 40 | 41 | if (args[0] > 150) { 42 | embed.setAuthor("You will die if you reach the limit of 150 :)"); 43 | return message.channel.send(embed); 44 | } 45 | 46 | serverQueue.volume = args[0]; 47 | serverQueue.connection.dispatcher.setVolumeLogarithmic(args[0] / 100); 48 | embed.setDescription(`Changed the volume to **${args[0]}**`); 49 | embed.setThumbnail(client.user.displayAvatarURL()); 50 | message.channel.send(embed); 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const discord = require("discord.js"); 2 | const client = new discord.Client({ 3 | disableEveryone: true, 4 | disabledEvents: ["TYPING_START"] 5 | }); 6 | const { readdirSync } = require("fs"); 7 | const { join } = require("path"); 8 | const { PREFIX } = require("./config.json"); 9 | 10 | //CLIENT EVENTS 11 | client.on("ready", () => { 12 | console.log("Ready to boom your ears | Bot created by ZeroSync"); 13 | client.user.setActivity("Sourced By 0_0#6666"); 14 | }); 15 | 16 | client.on("warn", info => console.log(info)); 17 | 18 | client.on("error", console.error); 19 | 20 | //DEFINIING 21 | client.commands = new discord.Collection(); 22 | client.prefix = PREFIX; 23 | client.queue = new Map(); 24 | client.vote = new Map(); 25 | 26 | //LETS LOAD ALL FILES 27 | const cmdFiles = readdirSync(join(__dirname, "commands")).filter(file => 28 | file.endsWith(".js") 29 | ); 30 | for (const file of cmdFiles) { 31 | const command = require(join(__dirname, "commands", file)); 32 | client.commands.set(command.name, command); 33 | } //LOADING DONE 34 | 35 | //WHEN SOMEONE MESSAGE 36 | client.on("message", message => { 37 | if (message.author.bot) return; 38 | if (!message.guild) return; 39 | 40 | if (message.content.startsWith(PREFIX)) { 41 | //IF MESSSAGE STARTS WITH MINE BOT PREFIX 42 | const args = message.content 43 | .slice(PREFIX.length) 44 | .trim() 45 | .split(/ +/); //removing prefix from args 46 | const commandName = args.shift().toLowerCase(); 47 | const command = 48 | client.commands.get(commandName) || 49 | client.commands.find( 50 | cmd => cmd.aliases && cmd.aliases.includes(commandName) 51 | ); 52 | if (!command) return; 53 | try { 54 | //TRY TO GET COMMAND AND EXECUTE 55 | 56 | command.execute(client, message, args); 57 | } catch (err) { 58 | //IF IT CATCH ERROR 59 | console.log(err); 60 | message.reply("I am getting error on using this command"); 61 | } 62 | } 63 | }); 64 | 65 | //DONT DO ANYTHING WITH THIS TOKEN lol 66 | client.login(process.env.TOKEN); 67 | -------------------------------------------------------------------------------- /commands/skip.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | name: "skip", 7 | description: "Skip the song or shift yourself to next song", 8 | aliases: ["remove"], 9 | async execute(client, message, args) { 10 | let embed = new MessageEmbed().setColor(COLOR); 11 | 12 | const { channel } = message.member.voice; 13 | 14 | if (!channel) { 15 | embed.setAuthor("❌ | Must be in a Voice Channel"); 16 | return message.channel.send(embed); 17 | } 18 | const serverQueue = message.client.queue.get(message.guild.id); 19 | const vote = message.client.vote.get(message.guild.id); 20 | if (!serverQueue) { 21 | embed.setAuthor("❌ | There is nothing playing that I could skip"); 22 | return message.channel.send(embed); 23 | } 24 | 25 | const vcvote = Math.floor(message.guild.me.voice.channel.members.size / 2); 26 | const fx = Math.floor(message.guild.me.voice.channel.members.size / 2 - 1); 27 | if (!message.member.hasPermission("ADMINISTRATOR")) { 28 | if (vote.vote > fx) { 29 | serverQueue.connection.dispatcher.end(); 30 | embed.setDescription("Vote - Skip | Skipping The Song"); 31 | embed.setThumbnail(client.user.displayAvatarURL()); 32 | return message.channel.send(embed); 33 | } 34 | 35 | if (vote.voters.includes(message.author.id)) { 36 | return message.channel.send( 37 | "You have already voted for skipping this song" 38 | ); 39 | } 40 | 41 | if (vcvote === 2) { 42 | serverQueue.connection.dispatcher.end(); 43 | embed.setDescription("✅ | Skipping The Song"); 44 | embed.setThumbnail(client.user.displayAvatarURL()); 45 | return message.channel.send(embed); 46 | } 47 | 48 | vote.vote++; 49 | vote.voters.push(message.author.id); 50 | return message.channel.send( 51 | `You Voted for the Song to Skip, Now we need **${Math.floor( 52 | vcvote - vote.vote 53 | )}** votes to skip the song` 54 | ); 55 | } 56 | 57 | serverQueue.connection.dispatcher.end(); 58 | embed.setDescription("✅ | Skipping The Song"); 59 | embed.setThumbnail(client.user.displayAvatarURL()); 60 | message.channel.send(embed); 61 | } 62 | }; 63 | -------------------------------------------------------------------------------- /system/music.js: -------------------------------------------------------------------------------- 1 | const ytdl = require("ytdl-core"); 2 | const { MessageEmbed } = require("discord.js"); 3 | const { QUEUE_LIMIT, COLOR } = require("../config.json"); 4 | 5 | module.exports = { 6 | async play(song, message) { 7 | const queue = message.client.queue.get(message.guild.id); 8 | let embed = new MessageEmbed().setColor(COLOR); 9 | 10 | if (!song) { 11 | message.client.queue.delete(message.guild.id); 12 | embed.setAuthor("Dispatcher queue ended | Opus Returned a Queue End"); 13 | embed.setDescription( 14 | `Ended without playing a song? DM 0_0#6666 for assistance!\n\n **Don't worry I won't leave ${queue.channel} Waiting There For More Music To Be Played!**` 15 | ); 16 | return queue.textChannel.send(embed).catch(console.error); 17 | } 18 | 19 | try { 20 | var stream = await ytdl(song.url, { 21 | highWaterMark: 1 << 25 22 | }); 23 | } catch (error) { 24 | if (queue) { 25 | queue.songs.shift(); 26 | module.exports.play(queue.songs[0], message); 27 | } 28 | 29 | if (error.message.includes === "copyright") { 30 | return message.channel.send( 31 | "© | Contents of this video are copyright protected." 32 | ); 33 | } else { 34 | console.error(error); 35 | } 36 | } 37 | 38 | const dispatcher = queue.connection 39 | .play(stream) 40 | .on("finish", () => { 41 | if (queue.loop) { 42 | let lastsong = queue.songs.shift(); 43 | queue.songs.push(lastsong); 44 | module.exports.play(queue.songs[0], message); 45 | } else { 46 | queue.songs.shift(); 47 | module.exports.play(queue.songs[0], message); 48 | } 49 | }) 50 | .on("error", console.error); 51 | 52 | dispatcher.setVolumeLogarithmic(queue.volume / 100); //VOLUME 53 | embed 54 | .setAuthor( 55 | "💿 | Started Playing Your Song", 56 | message.client.user.displayAvatarURL() 57 | ) 58 | .setDescription(`**[${song.title}](${song.url})**`) 59 | .setImage(`${song.thumbnail}`) 60 | .setFooter( 61 | `Channel: ${song.author} | Duration : ${song.duration}m | Uploaded : ${song.date}` 62 | ) 63 | .addField(`Playing In`, `${queue.channel}`, true) 64 | .addField(`Bound To`, `${queue.textChannel}`, true) 65 | .setThumbnail(song.avatar); 66 | 67 | queue.textChannel 68 | .send(embed) 69 | .catch(err => 70 | message.channel.send("Unable to play song | Dm 0_0#6666 for assistance") 71 | ); 72 | } 73 | }; 74 | -------------------------------------------------------------------------------- /commands/play.js: -------------------------------------------------------------------------------- 1 | const { MessageEmbed } = require("discord.js"); 2 | 3 | const { QUEUE_LIMIT, COLOR } = require("../config.json"); 4 | const ytsr = require("ytsr"); 5 | const { play } = require("../system/music.js"); 6 | module.exports = { 7 | name: "play", 8 | description: "Play the song and feel the music", 9 | aliases: ["p"], 10 | async execute(client, message, args) { 11 | let embed = new MessageEmbed().setColor(COLOR); 12 | 13 | //FIRST OF ALL WE WILL ADD ERROR MESSAGE AND PERMISSION MESSSAGE 14 | if (!args.length) { 15 | //IF AUTHOR DIDENT GIVE URL OR NAME 16 | embed.setAuthor("Syntax Error"); 17 | embed.setDescription("Try using `play `"); 18 | return message.channel.send(embed); 19 | } 20 | 21 | const { channel } = message.member.voice; 22 | 23 | if (!channel) { 24 | embed.setAuthor("❌ | You Must Join A Voice Channel"); 25 | return message.channel.send(embed); 26 | } 27 | 28 | const targetsong = args.join(" "); 29 | const videoPattern = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/gi; 30 | const playlistPattern = /^.*(youtu.be\/|list=)([^#\&\?]*).*/gi; 31 | const urlcheck = videoPattern.test(args[0]); 32 | 33 | if (!videoPattern.test(args[0]) && playlistPattern.test(args[0])) { 34 | embed.setAuthor("I am Unable To Play Playlists for now"); 35 | return message.channel.send(embed); 36 | } 37 | 38 | const serverQueue = message.client.queue.get(message.guild.id); 39 | 40 | const queueConstruct = { 41 | textChannel: message.channel, 42 | channel, 43 | connection: null, 44 | songs: [], 45 | loop: false, 46 | volume: 100, 47 | playing: true 48 | }; 49 | 50 | const voteConstruct = { 51 | vote: 0, 52 | voters: [] 53 | }; 54 | 55 | let songData = null; 56 | let song = null; 57 | 58 | if (urlcheck) { 59 | try { 60 | const result = await ytsr(args[0], { page: 1 }); 61 | songData = result.items[0]; 62 | 63 | song = { 64 | title: songData.title, 65 | url: songData.url, 66 | duration: songData.duration, 67 | thumbnail: songData.bestThumbnail.url, 68 | avatar: songData.author.bestAvatar.url, 69 | description: songData.description, 70 | author: songData.author.name, 71 | date: songData.uploadedAt 72 | }; 73 | } catch (error) { 74 | if (message.include === "copyright") { 75 | return message 76 | .reply("THERE IS COPYRIGHTED CONTENT IN VIDEO -_-") 77 | .catch(console.error); 78 | } else { 79 | console.error(error); 80 | } 81 | } 82 | } else { 83 | try { 84 | const result = await ytsr(targetsong, { pages: 1 }); 85 | songData = result.items[0]; 86 | 87 | song = { 88 | title: songData.title, 89 | url: songData.url, 90 | duration: songData.duration, 91 | thumbnail: songData.bestThumbnail.url, 92 | avatar: songData.author.bestAvatar.url, 93 | description: songData.description, 94 | author: songData.author.name, 95 | date: songData.uploadedAt 96 | }; 97 | } catch (error) { 98 | console.log(error); 99 | return message.channel.send("Fatal Error | Dm 0_0#6666 For Assistance"); 100 | } 101 | } 102 | 103 | if (serverQueue) { 104 | if ( 105 | serverQueue.songs.length > Math.floor(QUEUE_LIMIT - 1) && 106 | QUEUE_LIMIT !== 0 107 | ) { 108 | return message.channel.send( 109 | `You can not add songs more than ${QUEUE_LIMIT} in queue` 110 | ); 111 | } 112 | 113 | serverQueue.songs.push(song); 114 | embed.setAuthor( 115 | "Added New Song To Queue", 116 | client.user.displayAvatarURL() 117 | ); 118 | embed.setDescription(`**[${song.title}](${song.url})**`); 119 | embed.setImage(song.thumbnail); 120 | embed.setFooter( 121 | `Channel: ${song.author} | Duration : ${song.duration}m | Uploaded : ${song.date}` 122 | ); 123 | embed.addField(`Playing In`, `${channel}`, true); 124 | embed.addField(`Bound To`, `${message.channel}`, true); 125 | embed.setThumbnail(song.avatar); 126 | return serverQueue.textChannel.send(embed).catch(console.error); 127 | } else { 128 | queueConstruct.songs.push(song); 129 | } 130 | 131 | if (!serverQueue) 132 | message.client.queue.set(message.guild.id, queueConstruct); 133 | message.client.vote.set(message.guild.id, voteConstruct); 134 | if (!serverQueue) { 135 | try { 136 | queueConstruct.connection = await channel.join(); 137 | play(queueConstruct.songs[0], message); 138 | } catch (error) { 139 | console.error(`Could not join voice channel: ${error}`); 140 | message.client.queue.delete(message.guild.id); 141 | await channel.leave(); 142 | return message.channel 143 | .send({ 144 | embed: { 145 | description: `😭 | Could not join the channel: ${error}`, 146 | color: "#ff2050" 147 | } 148 | }) 149 | .catch(console.error); 150 | } 151 | } 152 | } 153 | }; 154 | -------------------------------------------------------------------------------- /shrinkwrap.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | '@discordjs/opus': 0.5.3 3 | chatbot-zero: 1.1.0 4 | discord.js: 12.5.3 5 | express: 4.17.1 6 | fs: 0.0.2 7 | moment: 2.29.1 8 | ms: 2.1.3 9 | node-opus: 0.3.3 10 | path: 0.12.7 11 | ytdl-core: 4.8.3 12 | ytsr: 3.5.0 13 | packages: 14 | /@discordjs/collection/0.1.6: 15 | dev: false 16 | resolution: 17 | integrity: sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== 18 | /@discordjs/form-data/3.0.1: 19 | dependencies: 20 | asynckit: 0.4.0 21 | combined-stream: 1.0.8 22 | mime-types: 2.1.30 23 | dev: false 24 | engines: 25 | node: '>= 6' 26 | resolution: 27 | integrity: sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== 28 | /@discordjs/node-pre-gyp/0.4.0: 29 | dependencies: 30 | detect-libc: 1.0.3 31 | https-proxy-agent: 5.0.0 32 | make-dir: 3.1.0 33 | node-fetch: 2.6.1 34 | nopt: 5.0.0 35 | npmlog: 4.1.2 36 | rimraf: 3.0.2 37 | semver: 7.3.5 38 | tar: 6.1.0 39 | dev: false 40 | hasBin: true 41 | resolution: 42 | integrity: sha512-CXLpoM2hgS94i9+EAVowR92y8o3KdKc9fmoe8/FTp5XTzvoXzJln3+Ctl0oBpE6c9+11zd9oJnZPdkkOBkDPSA== 43 | /@discordjs/opus/0.5.3: 44 | dependencies: 45 | '@discordjs/node-pre-gyp': 0.4.0 46 | node-addon-api: 3.2.1 47 | dev: false 48 | engines: 49 | node: '>=12.0.0' 50 | requiresBuild: true 51 | resolution: 52 | integrity: sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw== 53 | /abbrev/1.1.1: 54 | dev: false 55 | resolution: 56 | integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 57 | /abort-controller/3.0.0: 58 | dependencies: 59 | event-target-shim: 5.0.1 60 | dev: false 61 | engines: 62 | node: '>=6.5' 63 | resolution: 64 | integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 65 | /accepts/1.3.7: 66 | dependencies: 67 | mime-types: 2.1.27 68 | negotiator: 0.6.2 69 | dev: false 70 | engines: 71 | node: '>= 0.6' 72 | resolution: 73 | integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 74 | /agent-base/6.0.2: 75 | dependencies: 76 | debug: 4.3.1 77 | dev: false 78 | engines: 79 | node: '>= 6.0.0' 80 | resolution: 81 | integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 82 | /ansi-regex/2.1.1: 83 | dev: false 84 | engines: 85 | node: '>=0.10.0' 86 | resolution: 87 | integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 88 | /ansi-regex/3.0.0: 89 | dev: false 90 | engines: 91 | node: '>=4' 92 | resolution: 93 | integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 94 | /aproba/1.2.0: 95 | dev: false 96 | resolution: 97 | integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 98 | /are-we-there-yet/1.1.5: 99 | dependencies: 100 | delegates: 1.0.0 101 | readable-stream: 2.3.7 102 | dev: false 103 | resolution: 104 | integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 105 | /array-flatten/1.1.1: 106 | dev: false 107 | resolution: 108 | integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 109 | /asynckit/0.4.0: 110 | dev: false 111 | resolution: 112 | integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= 113 | /axios/0.21.1: 114 | dependencies: 115 | follow-redirects: 1.14.1 116 | dev: false 117 | resolution: 118 | integrity: sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 119 | /balanced-match/1.0.2: 120 | dev: false 121 | resolution: 122 | integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 123 | /bindings/1.2.1: 124 | dev: false 125 | resolution: 126 | integrity: sha1-FK1hE4EtLTfXLme0ystLtyZQXxE= 127 | /bindings/1.5.0: 128 | dependencies: 129 | file-uri-to-path: 1.0.0 130 | dev: false 131 | optional: true 132 | resolution: 133 | integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 134 | /body-parser/1.19.0: 135 | dependencies: 136 | bytes: 3.1.0 137 | content-type: 1.0.4 138 | debug: 2.6.9 139 | depd: 1.1.2 140 | http-errors: 1.7.2 141 | iconv-lite: 0.4.24 142 | on-finished: 2.3.0 143 | qs: 6.7.0 144 | raw-body: 2.4.0 145 | type-is: 1.6.18 146 | dev: false 147 | engines: 148 | node: '>= 0.8' 149 | resolution: 150 | integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 151 | /brace-expansion/1.1.11: 152 | dependencies: 153 | balanced-match: 1.0.2 154 | concat-map: 0.0.1 155 | dev: false 156 | resolution: 157 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 158 | /bytes/3.1.0: 159 | dev: false 160 | engines: 161 | node: '>= 0.8' 162 | resolution: 163 | integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 164 | /charenc/0.0.2: 165 | dev: false 166 | resolution: 167 | integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= 168 | /chatbot-zero/1.1.0: 169 | dependencies: 170 | axios: 0.21.1 171 | md5: 2.3.0 172 | dev: false 173 | engines: 174 | node: '>=0.12' 175 | resolution: 176 | integrity: sha512-nt9TdrF2tH4bwTR9hIPBpQpVuoeUzmojKEBAqeWk6gGKylkIK/bbqYKKeTKGmrfvPRfSv3XwJOD6hP47JKyc+g== 177 | /chownr/2.0.0: 178 | dev: false 179 | engines: 180 | node: '>=10' 181 | resolution: 182 | integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 183 | /code-point-at/1.1.0: 184 | dev: false 185 | engines: 186 | node: '>=0.10.0' 187 | resolution: 188 | integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 189 | /combined-stream/1.0.8: 190 | dependencies: 191 | delayed-stream: 1.0.0 192 | dev: false 193 | engines: 194 | node: '>= 0.8' 195 | resolution: 196 | integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 197 | /commander/2.20.3: 198 | dev: false 199 | resolution: 200 | integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 201 | /concat-map/0.0.1: 202 | dev: false 203 | resolution: 204 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 205 | /console-control-strings/1.1.0: 206 | dev: false 207 | resolution: 208 | integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 209 | /content-disposition/0.5.3: 210 | dependencies: 211 | safe-buffer: 5.1.2 212 | dev: false 213 | engines: 214 | node: '>= 0.6' 215 | resolution: 216 | integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 217 | /content-type/1.0.4: 218 | dev: false 219 | engines: 220 | node: '>= 0.6' 221 | resolution: 222 | integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 223 | /cookie-signature/1.0.6: 224 | dev: false 225 | resolution: 226 | integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 227 | /cookie/0.4.0: 228 | dev: false 229 | engines: 230 | node: '>= 0.6' 231 | resolution: 232 | integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 233 | /core-util-is/1.0.2: 234 | dev: false 235 | resolution: 236 | integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 237 | /crypt/0.0.2: 238 | dev: false 239 | resolution: 240 | integrity: sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= 241 | /debug/2.6.9: 242 | dependencies: 243 | ms: 2.0.0 244 | dev: false 245 | resolution: 246 | integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 247 | /debug/4.3.1: 248 | dependencies: 249 | ms: 2.1.2 250 | dev: false 251 | engines: 252 | node: '>=6.0' 253 | resolution: 254 | integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 255 | /delayed-stream/1.0.0: 256 | dev: false 257 | engines: 258 | node: '>=0.4.0' 259 | resolution: 260 | integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 261 | /delegates/1.0.0: 262 | dev: false 263 | resolution: 264 | integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 265 | /depd/1.1.2: 266 | dev: false 267 | engines: 268 | node: '>= 0.6' 269 | resolution: 270 | integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 271 | /destroy/1.0.4: 272 | dev: false 273 | resolution: 274 | integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 275 | /detect-libc/1.0.3: 276 | dev: false 277 | engines: 278 | node: '>=0.10' 279 | hasBin: true 280 | resolution: 281 | integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 282 | /discord.js/12.5.3: 283 | dependencies: 284 | '@discordjs/collection': 0.1.6 285 | '@discordjs/form-data': 3.0.1 286 | abort-controller: 3.0.0 287 | node-fetch: 2.6.1 288 | prism-media: 1.2.9 289 | setimmediate: 1.0.5 290 | tweetnacl: 1.0.3 291 | ws: 7.4.5 292 | dev: false 293 | engines: 294 | node: '>=12.0.0' 295 | resolution: 296 | integrity: sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== 297 | /ee-first/1.1.1: 298 | dev: false 299 | resolution: 300 | integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 301 | /encodeurl/1.0.2: 302 | dev: false 303 | engines: 304 | node: '>= 0.8' 305 | resolution: 306 | integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 307 | /escape-html/1.0.3: 308 | dev: false 309 | resolution: 310 | integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 311 | /etag/1.8.1: 312 | dev: false 313 | engines: 314 | node: '>= 0.6' 315 | resolution: 316 | integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 317 | /event-target-shim/5.0.1: 318 | dev: false 319 | engines: 320 | node: '>=6' 321 | resolution: 322 | integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 323 | /express/4.17.1: 324 | dependencies: 325 | accepts: 1.3.7 326 | array-flatten: 1.1.1 327 | body-parser: 1.19.0 328 | content-disposition: 0.5.3 329 | content-type: 1.0.4 330 | cookie: 0.4.0 331 | cookie-signature: 1.0.6 332 | debug: 2.6.9 333 | depd: 1.1.2 334 | encodeurl: 1.0.2 335 | escape-html: 1.0.3 336 | etag: 1.8.1 337 | finalhandler: 1.1.2 338 | fresh: 0.5.2 339 | merge-descriptors: 1.0.1 340 | methods: 1.1.2 341 | on-finished: 2.3.0 342 | parseurl: 1.3.3 343 | path-to-regexp: 0.1.7 344 | proxy-addr: 2.0.6 345 | qs: 6.7.0 346 | range-parser: 1.2.1 347 | safe-buffer: 5.1.2 348 | send: 0.17.1 349 | serve-static: 1.14.1 350 | setprototypeof: 1.1.1 351 | statuses: 1.5.0 352 | type-is: 1.6.18 353 | utils-merge: 1.0.1 354 | vary: 1.1.2 355 | dev: false 356 | engines: 357 | node: '>= 0.10.0' 358 | resolution: 359 | integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 360 | /file-uri-to-path/1.0.0: 361 | dev: false 362 | optional: true 363 | resolution: 364 | integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 365 | /finalhandler/1.1.2: 366 | dependencies: 367 | debug: 2.6.9 368 | encodeurl: 1.0.2 369 | escape-html: 1.0.3 370 | on-finished: 2.3.0 371 | parseurl: 1.3.3 372 | statuses: 1.5.0 373 | unpipe: 1.0.0 374 | dev: false 375 | engines: 376 | node: '>= 0.8' 377 | resolution: 378 | integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 379 | /follow-redirects/1.14.1: 380 | dev: false 381 | engines: 382 | node: '>=4.0' 383 | resolution: 384 | integrity: sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== 385 | /forwarded/0.1.2: 386 | dev: false 387 | engines: 388 | node: '>= 0.6' 389 | resolution: 390 | integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 391 | /fresh/0.5.2: 392 | dev: false 393 | engines: 394 | node: '>= 0.6' 395 | resolution: 396 | integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 397 | /fs-minipass/2.1.0: 398 | dependencies: 399 | minipass: 3.1.3 400 | dev: false 401 | engines: 402 | node: '>= 8' 403 | resolution: 404 | integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 405 | /fs.realpath/1.0.0: 406 | dev: false 407 | resolution: 408 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 409 | /fs/0.0.2: 410 | dev: false 411 | resolution: 412 | integrity: sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg= 413 | /gauge/2.7.4: 414 | dependencies: 415 | aproba: 1.2.0 416 | console-control-strings: 1.1.0 417 | has-unicode: 2.0.1 418 | object-assign: 4.1.1 419 | signal-exit: 3.0.3 420 | string-width: 1.0.2 421 | strip-ansi: 3.0.1 422 | wide-align: 1.1.3 423 | dev: false 424 | resolution: 425 | integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 426 | /glob/7.1.7: 427 | dependencies: 428 | fs.realpath: 1.0.0 429 | inflight: 1.0.6 430 | inherits: 2.0.4 431 | minimatch: 3.0.4 432 | once: 1.4.0 433 | path-is-absolute: 1.0.1 434 | dev: false 435 | resolution: 436 | integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 437 | /has-unicode/2.0.1: 438 | dev: false 439 | resolution: 440 | integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 441 | /http-errors/1.7.2: 442 | dependencies: 443 | depd: 1.1.2 444 | inherits: 2.0.3 445 | setprototypeof: 1.1.1 446 | statuses: 1.5.0 447 | toidentifier: 1.0.0 448 | dev: false 449 | engines: 450 | node: '>= 0.6' 451 | resolution: 452 | integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 453 | /http-errors/1.7.3: 454 | dependencies: 455 | depd: 1.1.2 456 | inherits: 2.0.4 457 | setprototypeof: 1.1.1 458 | statuses: 1.5.0 459 | toidentifier: 1.0.0 460 | dev: false 461 | engines: 462 | node: '>= 0.6' 463 | resolution: 464 | integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 465 | /https-proxy-agent/5.0.0: 466 | dependencies: 467 | agent-base: 6.0.2 468 | debug: 4.3.1 469 | dev: false 470 | engines: 471 | node: '>= 6' 472 | resolution: 473 | integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 474 | /iconv-lite/0.4.24: 475 | dependencies: 476 | safer-buffer: 2.1.2 477 | dev: false 478 | engines: 479 | node: '>=0.10.0' 480 | resolution: 481 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 482 | /inflight/1.0.6: 483 | dependencies: 484 | once: 1.4.0 485 | wrappy: 1.0.2 486 | dev: false 487 | resolution: 488 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 489 | /inherits/2.0.3: 490 | dev: false 491 | resolution: 492 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 493 | /inherits/2.0.4: 494 | dev: false 495 | resolution: 496 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 497 | /ipaddr.js/1.9.1: 498 | dev: false 499 | engines: 500 | node: '>= 0.10' 501 | resolution: 502 | integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 503 | /is-buffer/1.1.6: 504 | dev: false 505 | resolution: 506 | integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 507 | /is-fullwidth-code-point/1.0.0: 508 | dependencies: 509 | number-is-nan: 1.0.1 510 | dev: false 511 | engines: 512 | node: '>=0.10.0' 513 | resolution: 514 | integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 515 | /is-fullwidth-code-point/2.0.0: 516 | dev: false 517 | engines: 518 | node: '>=4' 519 | resolution: 520 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 521 | /isarray/1.0.0: 522 | dev: false 523 | resolution: 524 | integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 525 | /lru-cache/6.0.0: 526 | dependencies: 527 | yallist: 4.0.0 528 | dev: false 529 | engines: 530 | node: '>=10' 531 | resolution: 532 | integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 533 | /m3u8stream/0.8.4: 534 | dependencies: 535 | miniget: 4.2.1 536 | sax: 1.2.4 537 | dev: false 538 | engines: 539 | node: '>=10' 540 | resolution: 541 | integrity: sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== 542 | /make-dir/3.1.0: 543 | dependencies: 544 | semver: 6.3.0 545 | dev: false 546 | engines: 547 | node: '>=8' 548 | resolution: 549 | integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 550 | /md5/2.3.0: 551 | dependencies: 552 | charenc: 0.0.2 553 | crypt: 0.0.2 554 | is-buffer: 1.1.6 555 | dev: false 556 | resolution: 557 | integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== 558 | /media-typer/0.3.0: 559 | dev: false 560 | engines: 561 | node: '>= 0.6' 562 | resolution: 563 | integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 564 | /merge-descriptors/1.0.1: 565 | dev: false 566 | resolution: 567 | integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 568 | /methods/1.1.2: 569 | dev: false 570 | engines: 571 | node: '>= 0.6' 572 | resolution: 573 | integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 574 | /mime-db/1.44.0: 575 | dev: false 576 | engines: 577 | node: '>= 0.6' 578 | resolution: 579 | integrity: sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 580 | /mime-db/1.47.0: 581 | dev: false 582 | engines: 583 | node: '>= 0.6' 584 | resolution: 585 | integrity: sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== 586 | /mime-types/2.1.27: 587 | dependencies: 588 | mime-db: 1.44.0 589 | dev: false 590 | engines: 591 | node: '>= 0.6' 592 | resolution: 593 | integrity: sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 594 | /mime-types/2.1.30: 595 | dependencies: 596 | mime-db: 1.47.0 597 | dev: false 598 | engines: 599 | node: '>= 0.6' 600 | resolution: 601 | integrity: sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== 602 | /mime/1.6.0: 603 | dev: false 604 | engines: 605 | node: '>=4' 606 | hasBin: true 607 | resolution: 608 | integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 609 | /miniget/4.2.1: 610 | dev: false 611 | engines: 612 | node: '>=10' 613 | resolution: 614 | integrity: sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ== 615 | /minimatch/3.0.4: 616 | dependencies: 617 | brace-expansion: 1.1.11 618 | dev: false 619 | resolution: 620 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 621 | /minipass/3.1.3: 622 | dependencies: 623 | yallist: 4.0.0 624 | dev: false 625 | engines: 626 | node: '>=8' 627 | resolution: 628 | integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== 629 | /minizlib/2.1.2: 630 | dependencies: 631 | minipass: 3.1.3 632 | yallist: 4.0.0 633 | dev: false 634 | engines: 635 | node: '>= 8' 636 | resolution: 637 | integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 638 | /mkdirp/1.0.4: 639 | dev: false 640 | engines: 641 | node: '>=10' 642 | hasBin: true 643 | resolution: 644 | integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 645 | /moment/2.29.1: 646 | dev: false 647 | resolution: 648 | integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== 649 | /ms/2.0.0: 650 | dev: false 651 | resolution: 652 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 653 | /ms/2.1.1: 654 | dev: false 655 | resolution: 656 | integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 657 | /ms/2.1.2: 658 | dev: false 659 | resolution: 660 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 661 | /ms/2.1.3: 662 | dev: false 663 | resolution: 664 | integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 665 | /nan/2.14.1: 666 | dev: false 667 | resolution: 668 | integrity: sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 669 | /negotiator/0.6.2: 670 | dev: false 671 | engines: 672 | node: '>= 0.6' 673 | resolution: 674 | integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 675 | /node-addon-api/3.2.1: 676 | dev: false 677 | resolution: 678 | integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== 679 | /node-fetch/2.6.1: 680 | dev: false 681 | engines: 682 | node: 4.x || >=6.0.0 683 | resolution: 684 | integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 685 | /node-opus/0.3.3: 686 | cpu: 687 | - x64 688 | - arm 689 | - arm64 690 | - ia32 691 | dependencies: 692 | bindings: 1.2.1 693 | commander: 2.20.3 694 | nan: 2.14.1 695 | deprecated: This project is unmaintained. See @discordjs/opus for an alternative. 696 | dev: false 697 | engines: 698 | node: '>=5.10.0' 699 | optionalDependencies: 700 | ogg-packet: 1.0.1 701 | os: 702 | - linux 703 | - darwin 704 | - win32 705 | - freebsd 706 | - android 707 | requiresBuild: true 708 | resolution: 709 | integrity: sha512-ZQniA8iJ6y/qOTmW6eyzM9m8odt4CIGV0NM9/U03/pYLhGyxy18QXO25WfrWd8XsUYx57tnxll2xxj54CN08uQ== 710 | /nopt/5.0.0: 711 | dependencies: 712 | abbrev: 1.1.1 713 | dev: false 714 | engines: 715 | node: '>=6' 716 | hasBin: true 717 | resolution: 718 | integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 719 | /npmlog/4.1.2: 720 | dependencies: 721 | are-we-there-yet: 1.1.5 722 | console-control-strings: 1.1.0 723 | gauge: 2.7.4 724 | set-blocking: 2.0.0 725 | dev: false 726 | resolution: 727 | integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 728 | /number-is-nan/1.0.1: 729 | dev: false 730 | engines: 731 | node: '>=0.10.0' 732 | resolution: 733 | integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 734 | /object-assign/4.1.1: 735 | dev: false 736 | engines: 737 | node: '>=0.10.0' 738 | resolution: 739 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 740 | /ogg-packet/1.0.1: 741 | dependencies: 742 | ref-struct: 1.1.0 743 | dev: false 744 | optional: true 745 | resolution: 746 | integrity: sha512-dW1ok3BMnMikyXGDIgVEckWnlViW8JLWQV4qj9aN/rNRVqHlDYSlcIEtSIMH7tpuUOiIxAhY3+OxNdIOm6s17A== 747 | /on-finished/2.3.0: 748 | dependencies: 749 | ee-first: 1.1.1 750 | dev: false 751 | engines: 752 | node: '>= 0.8' 753 | resolution: 754 | integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 755 | /once/1.4.0: 756 | dependencies: 757 | wrappy: 1.0.2 758 | dev: false 759 | resolution: 760 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 761 | /parseurl/1.3.3: 762 | dev: false 763 | engines: 764 | node: '>= 0.8' 765 | resolution: 766 | integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 767 | /path-is-absolute/1.0.1: 768 | dev: false 769 | engines: 770 | node: '>=0.10.0' 771 | resolution: 772 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 773 | /path-to-regexp/0.1.7: 774 | dev: false 775 | resolution: 776 | integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 777 | /path/0.12.7: 778 | dependencies: 779 | process: 0.11.10 780 | util: 0.10.4 781 | dev: false 782 | resolution: 783 | integrity: sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 784 | /prism-media/1.2.9: 785 | dev: false 786 | peerDependencies: 787 | '@discordjs/opus': ^0.5.0 788 | ffmpeg-static: ^4.2.7 || ^3.0.0 || ^2.4.0 789 | node-opus: ^0.3.3 790 | opusscript: ^0.0.8 791 | resolution: 792 | integrity: sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== 793 | /process-nextick-args/2.0.1: 794 | dev: false 795 | resolution: 796 | integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 797 | /process/0.11.10: 798 | dev: false 799 | engines: 800 | node: '>= 0.6.0' 801 | resolution: 802 | integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 803 | /proxy-addr/2.0.6: 804 | dependencies: 805 | forwarded: 0.1.2 806 | ipaddr.js: 1.9.1 807 | dev: false 808 | engines: 809 | node: '>= 0.10' 810 | resolution: 811 | integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 812 | /qs/6.7.0: 813 | dev: false 814 | engines: 815 | node: '>=0.6' 816 | resolution: 817 | integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 818 | /range-parser/1.2.1: 819 | dev: false 820 | engines: 821 | node: '>= 0.6' 822 | resolution: 823 | integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 824 | /raw-body/2.4.0: 825 | dependencies: 826 | bytes: 3.1.0 827 | http-errors: 1.7.2 828 | iconv-lite: 0.4.24 829 | unpipe: 1.0.0 830 | dev: false 831 | engines: 832 | node: '>= 0.8' 833 | resolution: 834 | integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 835 | /readable-stream/2.3.7: 836 | dependencies: 837 | core-util-is: 1.0.2 838 | inherits: 2.0.4 839 | isarray: 1.0.0 840 | process-nextick-args: 2.0.1 841 | safe-buffer: 5.1.2 842 | string_decoder: 1.1.1 843 | util-deprecate: 1.0.2 844 | dev: false 845 | resolution: 846 | integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 847 | /ref-struct/1.1.0: 848 | dependencies: 849 | debug: 2.6.9 850 | ref: 1.3.5 851 | dev: false 852 | optional: true 853 | resolution: 854 | integrity: sha1-XV7mWtQc78Olxf60BYcmHkee3BM= 855 | /ref/1.3.5: 856 | dependencies: 857 | bindings: 1.5.0 858 | debug: 2.6.9 859 | nan: 2.14.1 860 | dev: false 861 | optional: true 862 | requiresBuild: true 863 | resolution: 864 | integrity: sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA== 865 | /rimraf/3.0.2: 866 | dependencies: 867 | glob: 7.1.7 868 | dev: false 869 | hasBin: true 870 | resolution: 871 | integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 872 | /safe-buffer/5.1.2: 873 | dev: false 874 | resolution: 875 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 876 | /safer-buffer/2.1.2: 877 | dev: false 878 | resolution: 879 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 880 | /sax/1.2.4: 881 | dev: false 882 | resolution: 883 | integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 884 | /semver/6.3.0: 885 | dev: false 886 | hasBin: true 887 | resolution: 888 | integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 889 | /semver/7.3.5: 890 | dependencies: 891 | lru-cache: 6.0.0 892 | dev: false 893 | engines: 894 | node: '>=10' 895 | hasBin: true 896 | resolution: 897 | integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 898 | /send/0.17.1: 899 | dependencies: 900 | debug: 2.6.9 901 | depd: 1.1.2 902 | destroy: 1.0.4 903 | encodeurl: 1.0.2 904 | escape-html: 1.0.3 905 | etag: 1.8.1 906 | fresh: 0.5.2 907 | http-errors: 1.7.3 908 | mime: 1.6.0 909 | ms: 2.1.1 910 | on-finished: 2.3.0 911 | range-parser: 1.2.1 912 | statuses: 1.5.0 913 | dev: false 914 | engines: 915 | node: '>= 0.8.0' 916 | resolution: 917 | integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 918 | /serve-static/1.14.1: 919 | dependencies: 920 | encodeurl: 1.0.2 921 | escape-html: 1.0.3 922 | parseurl: 1.3.3 923 | send: 0.17.1 924 | dev: false 925 | engines: 926 | node: '>= 0.8.0' 927 | resolution: 928 | integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 929 | /set-blocking/2.0.0: 930 | dev: false 931 | resolution: 932 | integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 933 | /setimmediate/1.0.5: 934 | dev: false 935 | resolution: 936 | integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 937 | /setprototypeof/1.1.1: 938 | dev: false 939 | resolution: 940 | integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 941 | /signal-exit/3.0.3: 942 | dev: false 943 | resolution: 944 | integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 945 | /statuses/1.5.0: 946 | dev: false 947 | engines: 948 | node: '>= 0.6' 949 | resolution: 950 | integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 951 | /string-width/1.0.2: 952 | dependencies: 953 | code-point-at: 1.1.0 954 | is-fullwidth-code-point: 1.0.0 955 | strip-ansi: 3.0.1 956 | dev: false 957 | engines: 958 | node: '>=0.10.0' 959 | resolution: 960 | integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 961 | /string-width/2.1.1: 962 | dependencies: 963 | is-fullwidth-code-point: 2.0.0 964 | strip-ansi: 4.0.0 965 | dev: false 966 | engines: 967 | node: '>=4' 968 | resolution: 969 | integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 970 | /string_decoder/1.1.1: 971 | dependencies: 972 | safe-buffer: 5.1.2 973 | dev: false 974 | resolution: 975 | integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 976 | /strip-ansi/3.0.1: 977 | dependencies: 978 | ansi-regex: 2.1.1 979 | dev: false 980 | engines: 981 | node: '>=0.10.0' 982 | resolution: 983 | integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 984 | /strip-ansi/4.0.0: 985 | dependencies: 986 | ansi-regex: 3.0.0 987 | dev: false 988 | engines: 989 | node: '>=4' 990 | resolution: 991 | integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= 992 | /tar/6.1.0: 993 | dependencies: 994 | chownr: 2.0.0 995 | fs-minipass: 2.1.0 996 | minipass: 3.1.3 997 | minizlib: 2.1.2 998 | mkdirp: 1.0.4 999 | yallist: 4.0.0 1000 | dev: false 1001 | engines: 1002 | node: '>= 10' 1003 | resolution: 1004 | integrity: sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== 1005 | /toidentifier/1.0.0: 1006 | dev: false 1007 | engines: 1008 | node: '>=0.6' 1009 | resolution: 1010 | integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1011 | /tweetnacl/1.0.3: 1012 | dev: false 1013 | resolution: 1014 | integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 1015 | /type-is/1.6.18: 1016 | dependencies: 1017 | media-typer: 0.3.0 1018 | mime-types: 2.1.27 1019 | dev: false 1020 | engines: 1021 | node: '>= 0.6' 1022 | resolution: 1023 | integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1024 | /unpipe/1.0.0: 1025 | dev: false 1026 | engines: 1027 | node: '>= 0.8' 1028 | resolution: 1029 | integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1030 | /util-deprecate/1.0.2: 1031 | dev: false 1032 | resolution: 1033 | integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1034 | /util/0.10.4: 1035 | dependencies: 1036 | inherits: 2.0.3 1037 | dev: false 1038 | resolution: 1039 | integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 1040 | /utils-merge/1.0.1: 1041 | dev: false 1042 | engines: 1043 | node: '>= 0.4.0' 1044 | resolution: 1045 | integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1046 | /vary/1.1.2: 1047 | dev: false 1048 | engines: 1049 | node: '>= 0.8' 1050 | resolution: 1051 | integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1052 | /wide-align/1.1.3: 1053 | dependencies: 1054 | string-width: 2.1.1 1055 | dev: false 1056 | resolution: 1057 | integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1058 | /wrappy/1.0.2: 1059 | dev: false 1060 | resolution: 1061 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1062 | /ws/7.4.5: 1063 | dev: false 1064 | engines: 1065 | node: '>=8.3.0' 1066 | peerDependencies: 1067 | bufferutil: ^4.0.1 1068 | utf-8-validate: ^5.0.2 1069 | resolution: 1070 | integrity: sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== 1071 | /yallist/4.0.0: 1072 | dev: false 1073 | resolution: 1074 | integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1075 | /ytdl-core/4.8.3: 1076 | dependencies: 1077 | m3u8stream: 0.8.4 1078 | miniget: 4.2.1 1079 | sax: 1.2.4 1080 | dev: false 1081 | engines: 1082 | node: '>=10' 1083 | resolution: 1084 | integrity: sha512-cWCBeX4FCgjcKmuVK384MT582RIAakpUSeMF/NPVmhO8cWiG+LeQLnBordvLolb0iXYzfUvalgmycYAE5Sy6Xw== 1085 | /ytsr/3.5.0: 1086 | dependencies: 1087 | miniget: 4.2.1 1088 | dev: false 1089 | engines: 1090 | node: '>=8' 1091 | resolution: 1092 | integrity: sha512-e92xxZI8OxUCsbLtn0NfkuKuSDN4YZtG+ow64G3N4b+bkEWCjR0hEPye+iCBA07/02OXPmWHD88FPy1hq0izMQ== 1093 | registry: 'https://registry.npmjs.org/' 1094 | shrinkwrapMinorVersion: 9 1095 | shrinkwrapVersion: 3 1096 | specifiers: 1097 | '@discordjs/opus': ^0.5.3 1098 | chatbot-zero: ^1.0.2 1099 | discord.js: ^12.5.3 1100 | express: ^4.17.1 1101 | fs: ^0.0.2 1102 | moment: ^2.29.1 1103 | ms: ^2.1.3 1104 | node-opus: ^0.3.3 1105 | path: ^0.12.7 1106 | ytdl-core: ^4.8.3 1107 | ytsr: ^3.5.0 1108 | --------------------------------------------------------------------------------