Advertisement
Guest User

Discord music bot

a guest
Aug 1st, 2019
15,991
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const discord = require('discord.js');
  2. const Client = new discord.Client();
  3. const ytdl = require('ytdl-core');
  4. const YouTube = require('simple-youtube-api');
  5. const fetch = require('snekfetch');
  6. const youtube = new YouTube(process.env.YOUTUBE_API_KEY);
  7. const Util = require("discord.js");
  8. const queue = new Map();
  9.  
  10. Client.on('message', async msg => { // eslint-disable-line
  11.   let message = msg;
  12.     if (message.author.bot) return;
  13.     if (message.channel.type === "dm") return;
  14.     let prefix = ">"
  15.     if (!msg.content.startsWith(prefix)) return undefined;
  16.  
  17.     const args = msg.content.split(' ');
  18.     const searchString = args.slice(1).join(' ');
  19.     const url = args[1] ? args[1].replace(/<(.+)>/g, '$1') : '';
  20.     const serverQueue = queue.get(msg.guild.id);
  21.  
  22.     let command = msg.content.toLowerCase().split(' ')[0];
  23.     command = command.slice(prefix.length)
  24.    
  25.     if (command === 'play') {
  26.       if (!args[1]) {
  27.             return msg.channel.send(":x: What should I play m8?")
  28.           }
  29.         const voiceChannel = msg.member.voiceChannel;
  30.         if (!voiceChannel) return msg.channel.send(':x: Join a voice channel to play music!');
  31.         const permissions = voiceChannel.permissionsFor(msg.client.user);
  32.         if (!permissions.has('CONNECT')) {
  33.             return msg.channel.send(':x: I dont have connect permission.');
  34.         }
  35.         if (!permissions.has('SPEAK')) {
  36.             return msg.channel.send(':x: I dont have speak permission.');
  37.         }
  38.  
  39.         if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) {
  40.             const playlist = await youtube.getPlaylist(url);
  41.             const videos = await playlist.getVideos();
  42.             for (const video of Object.values(videos)) {
  43.                 const video2 = await youtube.getVideoByID(video.id); // eslint-disable-line no-await-in-loop
  44.                 await handleVideo(video2, msg, voiceChannel, true); // eslint-disable-line no-await-in-loop
  45.             }
  46.          
  47.            msg.channel.send("🔍 Searching `"+searchString+"`").then(msg => {
  48.                       msg.delete(1000)
  49.                   })
  50.             let embed = new Discord.RichEmbed()
  51.             .setAuthor("Music", client.user.displayAvatarURL)
  52.             .setColor("GREEN")
  53.             .addField("Playlist Queued", `**[${playlist.title}](${playlist.url})**`)
  54.             .setFooter(msg.author.tag, msg.author.displayAvatarURL)
  55.             .setTimestamp()
  56.             return msg.channel.send(embed);
  57.         } else {
  58.             try {
  59.                 var video = await youtube.getVideo(url);
  60.             } catch (error) {
  61.                 try {
  62.                   msg.channel.send("🔍 Searching `"+searchString+"`").then(msg => {
  63.                       msg.delete(2000)
  64.                   })
  65.                     var videos = await youtube.searchVideos(searchString);
  66.                     let index = 0;
  67.                
  68.                     const videoIndex = 1;
  69.                     var video = await youtube.getVideoByID(videos[videoIndex - 1].id);
  70.                 } catch (err) {
  71.                     console.error(err);
  72.                     return msg.channel.send(':x: No result found.');
  73.                 }
  74.             }
  75.             return handleVideo(video, msg, voiceChannel);
  76.         }
  77.     } else if (command === 'youtube') {
  78.           if (!args[0]) return msg.channel.send(":x: Please provide search query m8.")
  79.         const voiceChannel = msg.member.voiceChannel;
  80.         if (!voiceChannel) return msg.channel.send(':x: Join a voice channel to play music!');
  81.         const permissions = voiceChannel.permissionsFor(msg.client.user);
  82.         if (!permissions.has('CONNECT')) {
  83.             return msg.channel.send(':x: I dont have connect permission.');
  84.         }
  85.         if (!permissions.has('SPEAK')) {
  86.             return msg.channel.send(':x: I dont have speak permission.');
  87.         }
  88.  
  89.         if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) {
  90.             const playlist = await youtube.getPlaylist(url);
  91.             const videos = await playlist.getVideos();
  92.             for (const video of Object.values(videos)) {
  93.                 const video2 = await youtube.getVideoByID(video.id); // eslint-disable-line no-await-in-loop
  94.                 await handleVideo(video2, msg, voiceChannel, true); // eslint-disable-line no-await-in-loop
  95.             }
  96.             msg.channel.send("🔍 Searching `"+searchString+"`").then(msg => {
  97.                       msg.delete(1000)
  98.                   })
  99.             let embed1 = new Discord.RichEmbed()
  100.             .setAuthor("Music", client.user.displayAvatarURL)
  101.             .setColor("GREEN")
  102.             .addField("Playlist Queued", `[${playlist.title}](${playlist.url})`)
  103.             .setFooter(msg.author.tag, msg.author.displayAvatarURL)
  104.             .setTimestamp()
  105.             return msg.channel.send(embed1);
  106.         } else {
  107.             try {
  108.                 var video = await youtube.getVideo(url);
  109.             } catch (error) {
  110.                 try {
  111.                     var videos = await youtube.searchVideos(searchString, 5);
  112.                     let index = 0;
  113.                   msg.channel.send("🔍 Searching `"+searchString+"`").then(msg => {
  114.                       msg.delete(1000)
  115.                   })
  116.                   let sEmbed = new Discord.RichEmbed()
  117.                    .setAuthor("YouTube Search", msg.author.avatarURL)
  118.                    .setColor("RANDOM")
  119.                    .setDescription(`${videos.map(video2 => `**${++index}. [${video2.title}](${video2.url})**`).join('\n')}`)
  120.                    .setFooter(`Provide a number of a song.`, client.user.avatarURL)
  121.                    .setTimestamp()
  122.                   msg.channel.send(sEmbed).then(msg => {
  123.                       msg.delete(10000)});
  124.                     // eslint-disable-next-line max-depth
  125.                     try {
  126.                         var response = await msg.channel.awaitMessages(msg2 => msg2.content > 0 && msg2.content < 11, {
  127.               maxMatches: 1,
  128.                             time: 10000,
  129.                             errors: ['time']
  130.                         });
  131.                     } catch (err) {
  132.                         console.error(err);
  133.                         return msg.channel.send(':x: Invalid Value/Time\'s up, Cancelling video selection.');
  134.                     }
  135.                     const videoIndex = parseInt(response.first().content);
  136.                     var video = await youtube.getVideoByID(videos[videoIndex - 1].id);
  137.                 } catch (err) {
  138.                     console.error(err);
  139.                     return msg.channel.send(':x: No result found.');
  140.                 }
  141.             }
  142.             return handleVideo(video, msg, voiceChannel);
  143.         }
  144.     }else if (command === 'skip') {
  145.         if (!msg.member.voiceChannel) return msg.channel.send(':x: You are not in a voice channel!');
  146.         if (!serverQueue) return msg.channel.send(':x: There is no song to skip.');
  147.         serverQueue.connection.dispatcher.end(':white_check_mark: Song Skipped!');
  148.         msg.channel.send(":white_check_mark: Song Skipped!")
  149.         return undefined;
  150.     } else if (command === 'stop') {
  151.         if (!msg.member.voiceChannel) return msg.channel.send(':x: You are not in a voice channel!');
  152.         if (!serverQueue) return msg.channel.send(':x: No song currently playing.');
  153.         serverQueue.songs = [];
  154.         serverQueue.voiceChannel.leave();
  155.         msg.channel.send(":white_check_mark: Disconnected!")
  156.         return undefined;
  157.     } else if (command === 'join') {
  158.         if (!msg.member.voiceChannel) return msg.channel.send(':x: You are not in a voice channel!');
  159.         msg.member.voiceChannel.join();
  160.         msg.channel.send(":white_check_mark: Connected!")
  161.         return undefined;
  162.     } else if (command === 'vol') {
  163.         if (!msg.member.voiceChannel) return msg.channel.send(':x: You are not in a voice channel!');
  164.         if (!serverQueue) return msg.channel.send(':x: There is nothing playing.');
  165.         if (!args[1]) {
  166.           let vEmbed = new Discord.RichEmbed()
  167.           .setAuthor("Current Volume", msg.guild.iconURL)
  168.           .setColor("ORANGE")
  169.           .setDescription(`**${(serverQueue.volume*20)}/100**`)
  170.           .setFooter(client.user.tag, client.user.displayAvatarURL)
  171.         return msg.channel.send(vEmbed)}
  172.         if (!isNaN(args[0])) {
  173.         serverQueue.volume = args[1]/20;
  174.         serverQueue.connection.dispatcher.setVolumeLogarithmic(args[1] / 100);
  175.        let Embed = new Discord.RichEmbed()
  176.           .setAuthor("Music Volume", msg.guild.iconURL)
  177.           .setColor("ORANGE")
  178.           .setDescription(`Volume Changed To **${args[1]}/100**.`)
  179.           .setFooter(client.user.tag, client.user.displayAvatarURL)
  180.         return msg.channel.send(Embed);
  181.     } return msg.channel.send(":x: Provide a valid number between 1-100.");
  182.     } else if (command === 'np') {
  183.         if (!serverQueue) return msg.channel.send(':x: There is nothing playing.');
  184.       console.log(serverQueue.songs[0])
  185.       const nsong = {
  186.         id: serverQueue.songs[0].id,
  187.         title: Util.escapeMarkdown(serverQueue.songs[0].title),
  188.         url: `https://www.youtube.com/watch?v=${serverQueue.songs[0].id}`,
  189.         channel: serverQueue.songs[0].channel.id,
  190.         ct: serverQueue.songs[0].channel.title,
  191.         tp: serverQueue.songs[0].publishedAt,
  192.         duration: serverQueue.songs[0].duration,
  193.         thumbnail: `https://i.ytimg.com/vi/${serverQueue.songs[0].id}/maxresdefault.jpg`
  194.     };
  195.       let hours = `${moment(nsong.duration.hours).format("HH")}`
  196.     let minutes = `${moment(nsong.duration.minutes).format("mm")}`
  197.     let seconds = `${moment(nsong.duration.seconds).format("ss")}`
  198.        let Embed = new Discord.RichEmbed()
  199.           .setAuthor("Current Song", msg.guild.iconURL)
  200.           .setColor("ORANGE")
  201.           .addField("Channel", `**[${serverQueue.songs[0].ct}](https://youtube.com/channel/${serverQueue.songs[0].channel})**`, true)
  202.           .addField("Duration", `\`${nsong.duration.hours}:${nsong.duration.minutes}:${nsong.duration.seconds}\``, true)
  203.           .addField("Published At", `${moment(serverQueue.songs[0].tp).format("dddd, MMMM do YYYY")}`, true)
  204. //          .addField("Next Song:", `**[${serverQueue.songs[1].title}](${serverQueue.songs[1].url})**`, true)
  205.           .setThumbnail(serverQueue.songs[0].thumbnail)
  206.           .setDescription(`🎶 **[${serverQueue.songs[0].title}](${serverQueue.songs[0].url})**`)
  207.           .setFooter(client.user.tag, client.user.avatarURL)
  208.         return msg.channel.send(Embed);
  209.     } else if (command === 'queue') {
  210.       let index = "0"
  211.         if (!serverQueue) return msg.channel.send(':x: There is nothing playing.');
  212.         else {
  213.                let Embed = new Discord.RichEmbed()
  214.                    .setAuthor("MUSIC QUEUE", msg.author.avatarURL)
  215.                    .setColor("RANDOM")
  216.                  //  .setThumbnail(serverQueue.songs[0].get().Thumbnail)
  217.                    .addField("Current Song:", `**- [${serverQueue.songs[0].title}](${serverQueue.songs[0].url})**`)
  218.                    .addField("Next Song:", `**- [${serverQueue.songs[1].title}](${serverQueue.songs[1].url})**`)
  219.                    .setDescription("**Queue:**\n"+serverQueue.songs.map(song => `**${++index})** **[${song.title}](${song.url})**`).join('\n'))
  220.                    .setFooter(`${client.user.username}`, client.user.avatarURL)
  221.                    .setTimestamp()
  222.                   msg.channel.send(Embed);
  223.    
  224.     }
  225.     } else if (command === 'pause') {
  226.         if (serverQueue && serverQueue.playing) {
  227.             serverQueue.playing = false;
  228.             serverQueue.connection.dispatcher.pause();
  229.             return msg.channel.send('⏸ Audio Paused!');
  230.         }
  231.         return msg.channel.send(':x: I am not playing anything?');
  232.     } else if (command === 'resume') {
  233.         if (serverQueue && !serverQueue.playing) {
  234.             serverQueue.playing = true;
  235.             serverQueue.connection.dispatcher.resume();
  236.             return msg.channel.send('▶ Audio Resumed!');
  237.         }
  238.         return msg.channel.send(':x: Please pause a song to resume.');
  239.     }
  240.  
  241.     return undefined;
  242. });
  243.  
  244. async function handleVideo(video, msg, voiceChannel, playlist = false) {
  245.     const serverQueue = queue.get(msg.guild.id);
  246.     console.log(video);
  247.     const song = {
  248.         id: video.id,
  249.         title: Util.escapeMarkdown(video.title),
  250.         url: `https://www.youtube.com/watch?v=${video.id}`,
  251.         channel: video.channel.id,
  252.         ct: video.channel.title,
  253.         tp: video.publishedAt,
  254.         duration: video.duration,
  255.         thumbnail: `https://i.ytimg.com/vi/${video.id}/maxresdefault.jpg`
  256.     };
  257.     if (!serverQueue) {
  258.         const queueConstruct = {
  259.             textChannel: msg.channel,
  260.             voiceChannel: voiceChannel,
  261.             connection: null,
  262.             songs: [],
  263.             volume: 3,
  264.             playing: true
  265.         };
  266.         queue.set(msg.guild.id, queueConstruct);
  267.  
  268.         queueConstruct.songs.push(song);
  269.  
  270.         try {
  271.             var connection = await voiceChannel.join();
  272.             queueConstruct.connection = connection;
  273.             play(msg.guild, queueConstruct.songs[0]);
  274.         } catch (error) {
  275.             console.error(`I could not join the voice channel: ${error}`);
  276.             queue.delete(msg.guild.id);
  277.             return msg.channel.send(`:x: I got some problem.: **${error}**.`);
  278.         }
  279.     } else {
  280.         serverQueue.songs.push(song);
  281.         console.log(serverQueue.songs);
  282.         if (playlist) return undefined;
  283.         else {
  284.           let hours = `${moment(song.duration.hours).format("HH")}`
  285.           let minutes = `${moment(song.duration.minutes).format("mm")}`
  286.           let seconds = `${moment(song.duration.seconds).format("ss")}`
  287.          
  288.           let embed1 = new Discord.RichEmbed()
  289.             .setAuthor("Music", client.user.displayAvatarURL)
  290.             .setColor("GREEN")
  291.             .setThumbnail(`https://i.ytimg.com/vi/${song.id}/maxresdefault.jpg`)
  292.             .addField("Music Queued", `**[${song.title}](${song.url})**`, true)
  293.             .addField("Uploaded by", `**[${song.ct}](https://youtube.com/channel/${song.channel})**`, true)
  294.             .addField("Duration", `\`${song.duration.hours}:${song.duration.minutes}:${song.duration.seconds}\``, true)
  295.             .addField("Published At", `${moment(song.tp).format("dddd, MMMM do YYYY")}`, true)
  296.             .setFooter(msg.author.tag, msg.author.displayAvatarURL)
  297.             .setTimestamp()
  298.             return msg.channel.send(embed1);
  299.          
  300.         }
  301.     }
  302.     return undefined;
  303. }
  304.  
  305. function play(guild, song) {
  306.     const serverQueue = queue.get(guild.id);
  307.  
  308.     if (!song) {
  309.         //serverQueue.voiceChannel.leave();
  310.         queue.delete(guild.id);
  311.         return;
  312.     }
  313.     console.log(serverQueue.songs);
  314.  
  315.     const dispatcher = serverQueue.connection.playStream(ytdl(song.url))
  316.         .on('end', reason => {
  317.             if (reason === 'Stream is not generating quickly enough.') {
  318.              
  319.               console.log('Song ended.')
  320.              // serverQueue.textChannel.channel.send('Song Ended!');
  321.            
  322.             } else console.log(reason);
  323.             serverQueue.songs.shift();
  324.             play(guild, serverQueue.songs[0]);
  325.         })
  326.         .on('error', error => console.error(error));
  327.     dispatcher.setVolumeLogarithmic(serverQueue.volume / 3);
  328.     let hours = `${moment(song.duration.hours).format("HH")}`
  329.     let minutes = `${moment(song.duration.minutes).format("mm")}`
  330.     let seconds = `${moment(song.duration.seconds).format("ss")}`
  331.     let embed1 = new Discord.RichEmbed()
  332.             .setAuthor("Music", serverQueue.iconURL)
  333.             .setColor("GREEN")
  334.             .setThumbnail(`https://i.ytimg.com/vi/${song.id}/maxresdefault.jpg`)
  335.             .addField("Started Playing", `🎶 **[${song.title}](${song.url})**`, true)
  336.             .addField("Uploaded By", `**[${song.ct}](https://youtube.com/channel/${song.channel})**`, true)
  337.             .addField("Duration", `\`${song.duration.hours}:${song.duration.minutes}:${song.duration.seconds}\``, true)
  338.             .addField("Published At", `${moment(song.tp).format("dddd, MMMM do YYYY")}`, true)
  339.             .setFooter(client.user.tag, client.user.displayAvatarURL)
  340.             .setTimestamp()
  341.             return serverQueue.textChannel.send(embed1);
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement