UNPKG

discaudio

Version:

An easy to use music package for discord bots

649 lines (643 loc) 25.5 kB
const Discord = require("discord.js"); const disbut = require("discord-buttons"); const disbutpages = require("discord-embeds-pages-buttons"); const fetch = require("node-fetch"); const ytdl = require("ytdl-core"); const prettyMs = require("pretty-ms") require("ffmpeg-static"); require("opusscript"); const queue = new Map(); var youtubeURL = "https://youtube-scrape-1.professorfish.repl.co/api/search?q="; exports.music = async function musicStuffInnit(message, client, prefix, options){ var args = message.content.toLowerCase().split(/ +/); var args0 = args.slice(1).join("%20") var member = message.member; var voiceChannel = message.member.voice.channel; if(!options){ options = {}; } if(!options.colour){ options.colour = "GREEN" } if(!options.defaultVolume){ options.defaultVolume = 100; } if(!options.timeout || isNaN(options.timeout)){ options.timeout = 18000; } if(!options.timeTillLeave || isNaN(options.timeTillLeave)){ options.timeTillLeave = 60000; } if(["play", "p"].find(k=> prefix + k == args[0])){ if(!voiceChannel){ try{ if(!options.noVcMessage){ await message.channel.send("You are not in a VC!") } else{ await message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } else{ if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } else{ if(!args[1] && queue.get(message.guild.id) && queue.get(message.guild.id).isPlaying){ try{ if(!options.noURLMessage){ return message.channel.send("No URL provided! Please provide a URL!") } else{ return message.channel.send(options.noURLMessage) } } catch(err){ console.log(err) } } else if(args[1]){ const urlValid = ytdl.validateURL(args[1]); if(urlValid){ var urlToPlay = args[1]; } else{ var urlToPlay = await fetch(youtubeURL + args0).then(res=> res.json()).then(json=>{ var c, count = 0; if(!json.results[0]){ try{ if(!options.noSongFoundMessage){ return message.channel.send("Cannot find this song!") } else{ return message.channel.send(options.noSongFoundMessage) } } catch(err){ console.log(err) } } while(!json.results[count].video){ if(json.results[count].video){ return json.results[count].video.url } else{ count++ } } return json.results[count].video.url; }) } if(!queue.get(message.guild.id)){ var json = { "songUrls": [], "songNames": [], "isPlaying": true, "dispatcher": null, "volume": options.defaultVolume, "textChannel": message.channel, "connection": null } let con = await member.voice.channel.join(); json.connection = con; queue.set(message.guild.id, json); } let songInfoEnabler = await ytdl.getInfo(urlToPlay); var songInfo = { songName: `${songInfoEnabler.videoDetails.title}`, songUrl: `${songInfoEnabler.videoDetails.video_url}` } var thing2 = songInfoEnabler.videoDetails.lengthSeconds var thing = prettyMs(thing2 * 1000, {"colonNotation": true}) const embed = new Discord.MessageEmbed() .setColor(options.colour) .setAuthor("Added the following song to the queue:") .setTitle(`${songInfoEnabler.videoDetails.title}`) .setURL(songInfoEnabler.videoDetails.video_url) .addField(`Views`, songInfoEnabler.videoDetails.viewCount, true) .addField(`Author`, `[${songInfoEnabler.videoDetails.author.name}](${songInfoEnabler.videoDetails.author.channel_url})`, true) .addField(`Length`, `${thing}`, true) .setThumbnail(songInfoEnabler.videoDetails.thumbnails[0].url) .setFooter(`👍: ${songInfoEnabler.videoDetails.likes} 👎: ${songInfoEnabler.videoDetails.dislikes}`) message.channel.send(embed) if(queue.get(message.guild.id).songUrls[0]){ let queueChangeEnabler = queue.get(message.guild.id); queueChangeEnabler.songUrls.push(songInfo.songUrl); queueChangeEnabler.songNames.push(songInfo.songName); queue.set(message.guild.id, queueChangeEnabler); } else{ let queueChangeEnabler = queue.get(message.guild.id) queueChangeEnabler.songUrls.push(songInfo.songUrl); queueChangeEnabler.songNames.push(songInfo.songName); queue.set(message.guild.id, queueChangeEnabler) queueChangeEnabler = queue.get(message.guild.id); queueChangeEnabler.shouldIplay2 = 0; queue.set(message.guild.id, queueChangeEnabler) playTheSong(message, options); } } else if(!args[1] && queue.get(message.guild.id) && queue.get(message.guild.id).isPlaying){ resumeSong(message); let json = queue.get(message.guild.id) json.isPlaying = true; queue.set(message.guild.id, json) } } } } else if(["remove"].find(k=> prefix + k == args[0])){ if(!message.member.voice.channel){ try{ if(!options.noVcMessage){ return message.channel.send("You are not in a VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("There is no song playing!") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } if(queue.get(message.guild.id).songUrls.length === 1){ try{ if(!options.noSongsToRemoveMessage){ return message.channel.send("Only the current song in the queue.") } else{ return message.channel.send(options.noSongsToRemoveMessage) } } catch(err){ console.log(err) } } if(!args[1]){ try{ if(!options.noIndexOfSongToRemoveMessage){ return message.channel.send("Please provide an index of the song to remove!") } else{ return message.channel.send(options.noIndexOfSongToRemoveMessage) } } catch(err){ console.log(err) } } if(isNaN(args[1]) || !queue.get(message.guild.id).songNames[args[1] - 1]){ try{ if(!options.invalidIndexToRemoveMessage){ return message.channel.send("Invalid index to remove.") } else{ return message.channel.send(options.invalidIndexToRemoveMessage) } } catch(err){ console.log(err) } } if(args[1] === "1"){ try{ if(!options.triedToRemoveTheCurrentSongMessage){ return message.channel.send("Cannot remove the currently playing song.") } else{ return message.channel.send(options.triedToRemoveTheCurrentSongMessage) } } catch(err){ console.log(err) } } var q = queue.get(message.guild.id) var c = q.songUrls.splice(args[1] - 1, 1) var c2 = q.songNames.splice(args[1] - 1, 1) queue.set(message.guild.id, q) try{ if(!options.removedSongMessage){ message.channel.send(`Removed song **${c2}**`) } else{ message.channel.send(options.removedSongMessage(c, c2)); } } catch(err){ console.log(err) } } else if(["nowplaying", "np"].find(k=> prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("There is no song playing.") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } var songInfoEnabler = await ytdl.getInfo(queue.get(message.guild.id).songUrls[0]); var time = prettyMs(queue.get(message.guild.id).dispatcher.streamTime, {"colonNotation": true}) var thing2 = songInfoEnabler.videoDetails.lengthSeconds var thing = prettyMs(thing2 * 1000, {"colonNotation": true}) try{ if(!options.nowPlayingMessage){ const embed = new Discord.MessageEmbed() .setColor(options.colour) .setAuthor("Now Playing:") .setTitle(`${songInfoEnabler.videoDetails.title}`) .setURL(songInfoEnabler.videoDetails.video_url) .addField(`Views`, songInfoEnabler.videoDetails.viewCount, true) .addField(`Author`, `[${songInfoEnabler.videoDetails.author.name}](${songInfoEnabler.videoDetails.author.channel_url})`, true) .setFooter(`👍: ${songInfoEnabler.videoDetails.likes} 👎: ${songInfoEnabler.videoDetails.dislikes}`) .setThumbnail(songInfoEnabler.videoDetails.thumbnails[0].url) .addField(`Progress`, `${time}/${thing}`, true) message.channel.send(embed) } else{ message.channel.send(options.nowPlayingMessage(songInfoEnabler.videoDetails)) } } catch(err){ console.log(err) } } else if(["stop"].find(k=> prefix + k == args[0])){ if(!message.member.voice.channel){ try{ if(!options.noVcMessage){ return message.channel.send("You are not in a VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("There is no song playing!") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } stopPlaying(message, options); } else if(["queue", "q"].find(k=> prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noQueueMessage){ return message.channel.send("There is no queue.") } else{ return message.channel.send(options.noQueueMessage) } } catch(err){ console.log(err) } } var pages = []; var amountOfPages = Math.ceil(queue.get(message.guild.id).songNames.length / 10); for(var i = 0;i<amountOfPages;i++){ const embed = new Discord.MessageEmbed() .setColor(options.colour) var thingsForThis = { "songNames": queue.get(message.guild.id).songNames.slice(i*10, i*10 + 11), "songUrls": queue.get(message.guild.id).songUrls.slice(i*10, i*10 + 11) } for(var ii = 0; ii < thingsForThis.songNames.length;ii++){ embed.setTitle(i + 1) embed.addField(`${i * 10 + ii + 1}`, `**[${thingsForThis.songNames[ii]}](${thingsForThis.songUrls[ii]})**`) } pages.push(embed) } disbutpages.pages(client, message, pages, options.timeout, disbut, options.colour.toLowerCase(), "➡", "⬅", "❌"); } else if(["skip", "s"].find(k=> prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("No songs playing.") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } if(!message.member.voice.channel){ try{ if(!options.noVcMessage){ return message.channel.send("You are not in a VC!") } else{ return message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } shiftSong(message, options); playTheSong(message, options); } else if(["volume", "v"].find(k=> prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("No songs playing!.") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } if(!message.member.voice.channel)return message.channel.send("You need to be in a voice channel to use music commands!") if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } changeVolume(message, prefix, options); } else if(["pause"].find(k => prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("No songs playing!") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } if(!message.member.voice.channel)return message.channel.send("You need to be in a voice channel to use music commands!") if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } let json = queue.get(message.guild.id) json.isPlaying = false; queue.set(message.guild.id, json) pauseSong(message, prefix); } else if(["resume"].find(k=> prefix + k == args[0])){ if(!queue.get(message.guild.id)){ try{ if(!options.noSongPlayingMessage){ return message.channel.send("No songs playing!") } else{ return message.channel.send(options.noSongPlayingMessage) } } catch(err){ console.log(err) } } if(!message.member.voice.channel){ try{ if(!options.noVcMessage){ return message.channel.send("You aren't in a voice channel!") } else{ return message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } resumeSong(message); let json = queue.get(message.guild.id) json.isPlaying = true; queue.set(message.guild.id, json) } } async function playTheSong(message, options){ var connection = queue.get(message.guild.id).connection; var song = queue.get(message.guild.id).songUrls[0]; if(!song){ message.guild.me.voice.channel.leave() try{ if(options && !options.queueOverMessage){ queue.get(message.guild.id).textChannel.send("Leaving VC; no more songs!") queue.delete(message.guild.id); return; } else{ queue.get(message.guild.id).textChannel.send(options.queueOverMessage) } } catch(err){ queue.delete(message.guild.id) } return; } else{ var dispatcher = await connection.play(ytdl(song, {filter: "audioonly"})); queueChangeEnabler = queue.get(message.guild.id) queueChangeEnabler.shouldIplay2 = 0; queueChangeEnabler.shouldIplay1 = 0; queueChangeEnabler.dispatcher = dispatcher; queue.set(message.guild.id, queueChangeEnabler); queue.get(message.guild.id).dispatcher.setVolumeLogarithmic(queue.get(message.guild.id).volume / 100) dispatcher.on("finish", () =>{ shiftSong(message, options); playTheSong(message, options); }) } } async function shiftSong(message, options){ let queueChangeEnabler = queue.get(message.guild.id); queueChangeEnabler.shouldIplay1 = 1 queueChangeEnabler.shouldIplay2 = 1 queueChangeEnabler.songUrls.shift(); queueChangeEnabler.songNames.shift(); if(!queueChangeEnabler.songUrls[0]){ return } var songInfoEnabler = await ytdl.getInfo(queue.get(message.guild.id).songUrls[0]); var thing2 = songInfoEnabler.videoDetails.lengthSeconds var thing = prettyMs(thing2 * 1000, {"colonNotation": true}) const embed = new Discord.MessageEmbed() .setColor(options.colour) .setAuthor("Now Playing:") .setTitle(`${songInfoEnabler.videoDetails.title}`) .setURL(songInfoEnabler.videoDetails.video_url) .addField(`Views`, songInfoEnabler.videoDetails.viewCount, true) .addField(`Author`, `[${songInfoEnabler.videoDetails.author.name}](${songInfoEnabler.videoDetails.author.channel_url})`, true) .addField(`Length`, `${thing}`, true) .setThumbnail(songInfoEnabler.videoDetails.thumbnails[0].url) .setFooter(`👍: ${songInfoEnabler.videoDetails.likes} 👎: ${songInfoEnabler.videoDetails.dislikes}`) try{ if(options && !options.nowPlayingMessage){ queue.get(message.guild.id).textChannel.send(embed) } else{ options.nowPlayingMessage(songInfoEnabler.videoDetails) } } catch(err){ console.log(err); } queue.set(message.guild.id, queueChangeEnabler) } async function changeVolume(message, prefix, options){ if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } const args = message.content.slice(prefix.length).trim().split(/ +/) if(!args[1]){ try{ if(options && !options.noVolumeToChangeToMessage){ queue.get(message.guild.id).textChannel.send("Please include a volume to change to!") return; } else{ queue.get(message.guild.id).textChannel.send(options.noVolumeToChangeToMessage) return; } } catch(err){ console.log(err); } } queueChangeEnabler = queue.get(message.guild.id); queueChangeEnabler.volume = args[1]; queue.set(message.guild.id, queueChangeEnabler); queue.get(message.guild.id).dispatcher.setVolumeLogarithmic(queue.get(message.guild.id).volume / 100) try{ if(options && !options.changeVolume){ queue.get(message.guild.id).textChannel.send(`Volume set to **${args[1]}**`) } else{ message.channel.send(options.changeVolume(args[1])); } } catch(err){ console.log(err) } } async function pauseSong(message, prefix, options){ if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.differentVCMessage) } } catch(err){ console.log(err) } } queue.get(message.guild.id).dispatcher.pause(); try{ if(options && !options.pausedMessage){ queue.get(message.guild.id).textChannel.send(`Music paused.`) } else{ queue.get(message.guild.id).textChannel.send(options.pausedMessage) } } catch(err){ console.log(err) } } async function resumeSong(message, options){ if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } try{ if(options && !options.resumedMessage){ queue.get(message.guild.id).textChannel.send(`Music resumed.`) } else{ queue.get(message.guild.id).textChannel.send(options.resumedMessage) } } catch(err){ console.log(err) } queue.get(message.guild.id).dispatcher.resume(); } async function stopPlaying(message, options){ if(message.member.voice.channel != message.guild.me.voice.channel && message.guild.me.voice.channel && message.member.voice.channel){ try{ if(!options.differentVCMessage){ return message.channel.send("You are in a different VC!") } else{ return message.channel.send(options.noVcMessage) } } catch(err){ console.log(err) } } try{ message.guild.me.voice.channel.leave() queue.delete(message.guild.id); try{ if(!options.stopMessage){ message.channel.send("Stopped the music, deleted the queue and left the voice channel.") } else{ message.channel.send(options.stopMessage) } } catch(err){ console.log(err) } } catch(err){ queue.delete(message.guild.id); } }