discaudio
Version:
An easy to use music package for discord bots
649 lines (643 loc) • 25.5 kB
JavaScript
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);
}
}