UNPKG

naar-music-bot

Version:

Simple JavaScript Music Discord Bot Powerd By: NAAR Studio.

379 lines (357 loc) 20.2 kB
// disable or enable the command var useing = true; // true or false const ytdl = require("discord-ytdl-core"); const { MessageEmbed, splitMessage, escapeMarkdown } = require("discord.js"); const createBar = require("string-progressbar"); const lyricsFinder = require("lyrics-finder"); module.exports = { async play(song, message, client, filters) { if (useing == true) { const queue = message.client.queue.get(message.guild.id); if (!song) { queue.channel.leave(); message.client.queue.delete(message.guild.id); } if (song.url == undefined || null) return message.channel.send('Error: البوت مفشوخ') let stream = null; let streamType = song.url.includes("youtube.com") ? "opus" : "ogg/opus"; let isnotayoutube = false; let seekTime = 0; let oldSeekTime = queue.realseek; let encoderArgstoset; if (filters === "remove") { queue.filters = ['-af', 'dynaudnorm=f=200']; encoderArgstoset = queue.filters; try { seekTime = (queue.connection.dispatcher.streamTime - queue.connection.dispatcher.pausedTime) / 1000 + oldSeekTime; } catch { seekTime = 0; } queue.realseek = seekTime; } else if (filters) { try { seekTime = (queue.connection.dispatcher.streamTime - queue.connection.dispatcher.pausedTime) / 1000 + oldSeekTime; } catch { seekTime = 0; } queue.realseek = seekTime; queue.filters.push(filters) encoderArgstoset = ['-af', queue.filters] } try { if (song.url.includes("youtube.com")) { stream = ytdl(song.url, { filter: "audioonly", opusEncoded: true, encoderArgs: encoderArgstoset, bitrate: 320, seek: seekTime, quality: "highestaudio", liveBuffer: 40000, highWaterMark: 1 << 25, }); } else if (song.url.includes(".mp3") || song.url.includes("baseradiode")) { stream = song.url; isnotayoutube = true; } } catch (error) { if (queue) { queue.songs.shift(); module.exports.play(queue.songs[0], message); } console.error(error); return message.channel.send(`Error: البوت مفشوخ`); } queue.connection.on("disconnect", () => message.client.queue.delete(message.guild.id)); if (isnotayoutube) { console.log("TEST") const dispatcher = queue.connection .play(stream) .on("finish", () => { if (collector && !collector.ended) collector.stop(); if (queue.loop) { let lastSong = queue.songs.shift(); queue.songs.push(lastSong); module.exports.play(queue.songs[0], message); } else { queue.songs.shift(); module.exports.play(queue.songs[0], message); } }) .on("error", (err) => { console.error(err); queue.songs.shift(); module.exports.play(queue.songs[0], message); }); dispatcher.setVolumeLogarithmic(queue.volume / 100); } else { const dispatcher = queue.connection .play(stream, { type: streamType }) .on("finish", () => { if (collector && !collector.ended) collector.stop(); if (queue.loop) { let lastSong = queue.songs.shift(); queue.songs.push(lastSong); module.exports.play(queue.songs[0], message); } else { queue.songs.shift(); module.exports.play(queue.songs[0], message); } }) .on("error", (err) => { console.error(err); queue.songs.shift(); module.exports.play(queue.songs[0], message); }); dispatcher.setVolumeLogarithmic(queue.volume / 100); } let thumb; if (song.thumbnail === undefined) thumb = "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fimages.designtrends.com%2Fwp-content%2Fuploads%2F2016%2F04%2F06131325%2FSnoopy-Playing-Music-Image.jpg&f=1&nofb=1"; else thumb = song.thumbnail.url; const serverQueue = message.client.queue.get(message.guild.id); if (serverQueue) { let estimatedtime = Number(0); for (let i = 0; i < serverQueue.songs.length; i++) { let minutes = serverQueue.songs[i].duration.split(":")[0]; let seconds = serverQueue.songs[i].duration.split(":")[1]; estimatedtime += (Number(minutes) * 60 + Number(seconds)); } if (estimatedtime > 60) { estimatedtime = Math.round(estimatedtime / 60 * 100) / 100; estimatedtime = estimatedtime + " Minutes" } else if (estimatedtime > 60) { estimatedtime = Math.round(estimatedtime / 60 * 100) / 100; estimatedtime = estimatedtime + " Hours" } else { estimatedtime = estimatedtime + " Seconds" } try { if (song.title == undefined || null) song.title == "NIRO"; if (estimatedtime == undefined || null) estimatedtime == "NIRO"; if (serverQueue.songs.length == undefined || null) serverQueue.songs.length == 0; if (song.duration == undefined || null) song.duration == 0; if (song.views == undefined || null) song.views == 0; if (song.ago == undefined || null) song.ago == 0; const newsong = new MessageEmbed() .setTitle("✅ " + song.title) .setURL(song.url) .setColor("#c219d8") .setThumbnail(thumb) .setFooter(`Requested by: ${message.author.tag}`, message.member.user.displayAvatarURL({ dynamic: true })) .addField("Estimated time until playing:", `\`${estimatedtime}\``, true) .addField("Position in queue", `**\`${serverQueue.songs.length - 1}\`**`, true) .addField(`duration`, `**\`${song.duration}\`**`, true) .addField(`Views`, `**\`${song.views}\`**`, true) var playingMessage = await queue.textChannel.send(newsong); await playingMessage.react("⏭"); await playingMessage.react("⏯"); await playingMessage.react("🔄"); await playingMessage.react("⏹"); await playingMessage.react("❓"); await playingMessage.react("🎵"); await playingMessage.react("📑"); } catch (error) { throw new TypeError(err) } const filter = (reaction, user) => user.id !== message.client.user.id; var collector = playingMessage.createReactionCollector(filter, { time: song.duration > 0 ? song.duration * 1000 : 600000 }); collector.on("collect", async(reaction, user) => { if (!queue) return; const member = message.guild.member(user); if (song.title == undefined || null) song.title == "NIRO"; if (estimatedtime == undefined || null) estimatedtime == "NIRO"; if (serverQueue.songs.length == undefined || null) serverQueue.songs.length == 0; if (song.duration == undefined || null) song.duration == 0; if (song.views == undefined || null) song.views == 0; if (song.ago == undefined || null) song.ago == 0; switch (reaction.emoji.name) { case "🎵": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); const description = queue.songs.map((song, index) => `${index + 1}. ${escapeMarkdown(song.title)}`); let queueEmbed = new MessageEmbed() .setTitle("Music Queue") .setDescription(description) .setColor("BLUE"); const splitDescription = splitMessage(description, { maxLength: 2048, char: "\n", prepend: "", append: "" }); splitDescription.forEach(async(m) => { queueEmbed.setDescription(m); message.react("✅") message.channel.send(queueEmbed).then(m => { m.delete({ timeout: 1500 }) }) }); break; case "❓": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); const song = queue.songs[0]; let minutes = song.duration.split(":")[0]; let seconds = song.duration.split(":")[1]; let ms = (Number(minutes) * 60 + Number(seconds)); let thumb; if (song.thumbnail === undefined) thumb = "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fimages.designtrends.com%2Fwp-content%2Fuploads%2F2016%2F04%2F06131325%2FSnoopy-Playing-Music-Image.jpg&f=1&nofb=1"; else thumb = song.thumbnail.url; const seek = (queue.connection.dispatcher.streamTime - queue.connection.dispatcher.pausedTime) / 1000; const left = ms - seek; if (song.title == undefined || null) song.title == "NIRO"; if (estimatedtime == undefined || null) estimatedtime == "NIRO"; if (serverQueue.songs.length == undefined || null) serverQueue.songs.length == Number("NIRO"); if (song.duration == undefined || null) song.duration == Number("NIRO"); if (song.views == undefined || null) song.views == Number("NIRO"); if (song.ago == undefined || null) song.ago == Number("NIRO"); let nowPlaying = new MessageEmbed() .setTitle("Now playing") .setDescription(`[**${song.title}**](${song.url})`) .setThumbnail(song.thumbnail.url) .setColor("BLUE") .setFooter("Time Remaining: " + new Date(left * 1000).toISOString().substr(11, 8)); if (ms >= 10000) { nowPlaying.addField("\u200b", "🔴 LIVE", false); return message.channel.send(nowPlaying) } if (ms > 0 && ms < 10000) { nowPlaying.addField("\u200b", "**[" + createBar((ms == 0 ? seek : ms), seek, 25, "▬", "⚪️")[0] + "]**\n**" + new Date(seek * 1000).toISOString().substr(11, 8) + " / " + (ms == 0 ? " ◉ LIVE" : new Date(ms * 1000).toISOString().substr(11, 8)) + "**", false); return message.channel.send(nowPlaying) } break; case "⏭": queue.playing = true; reaction.users.remove(user).catch(err => { throw new TypeError(err) }); queue.connection.dispatcher.end(); const skipembed = new MessageEmbed().setColor("BLUE").setAuthor(`${user.username} skipped the song.`) queue.textChannel.send(skipembed).then(m => { m.delete({ timeout: 1500 }) }).catch(err => { throw new TypeError(err) }); collector.stop(); break; case "📑": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); let lyrics = null; let temEmbed = new MessageEmbed() .setAuthor("Searching...").setFooter("Lyrics") .setColor("BLUE") let result = await message.channel.send(temEmbed) try { lyrics = await lyricsFinder(queue.songs[0].title, ""); if (!lyrics) lyrics = `No lyrics found for ${queue.songs[0].title}.`; } catch (error) { lyrics = `No lyrics found for ${queue.songs[0].title}.`; } let lyricsEmbed = new MessageEmbed() .setTitle("📑 Lyrics") .setDescription(lyrics) .setColor("BLUE") if (lyricsEmbed.description.length >= 2048) lyricsEmbed.description = `${lyricsEmbed.description.substr(0, 2045)}...`; message.react("✅"); return result.edit(lyricsEmbed).catch(err => { throw new TypeError(err) }); break; case "⏯": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); if (queue.playing) { queue.playing = !queue.playing; queue.connection.dispatcher.pause(true); const pausemebed = new MessageEmbed().setColor("BLUE") .setAuthor(`${user.username} paused the music.`) queue.textChannel.send(pausemebed).then(m => { m.delete({ timeout: 1500 }) }).catch(err => { throw new TypeError(err) }); } else { queue.playing = !queue.playing; queue.connection.dispatcher.resume(); const playembed = new MessageEmbed().setColor("BLUE") .setAuthor(`${user.username} resumed the music!`) queue.textChannel.send(playembed).then(m => { m.delete({ timeout: 1500 }) }).catch(err => { throw new TypeError(err) }); } break; case "🔄": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); queue.loop = !queue.loop; const loopembed = new MessageEmbed().setColor("BLUE") .setAuthor(`Loop is now ${queue.loop ? " enabled" : " disabled"}`) queue.textChannel.send(loopembed).then(m => { m.delete({ timeout: 1500 }) }).catch(err => { throw new TypeError(err) }); break; case "⏹": reaction.users.remove(user).catch(err => { throw new TypeError(err) }); queue.songs = []; const stopembed = new MessageEmbed().setColor("BLUE").setAuthor(`${user.username} stopped the music!`) queue.textChannel.send(stopembed).then(m => { m.delete({ timeout: 1500 }) }).catch(err => { throw new TypeError(err) }); try { queue.connection.dispatcher.end(); } catch (error) { queue.connection.disconnect(); throw new TypeError(err) } collector.stop(); break; default: reaction.users.remove(user).catch(err => { throw new TypeError(err) }); break; } }); collector.on("end", () => { playingMessage.reactions.removeAll().catch(err => { throw new TypeError(err) }); if (1 && playingMessage && !playingMessage.deleted) { playingMessage.delete({ timeout: 3000 }).catch(err => { throw new TypeError(err) }); } }); } } else { message.channel.send( new MessageEmbed() .setTitle(`${module.exports.name} Has Been Disabled From The Music System`) ) } function delay(delayInms) { return new Promise(resolve => { setTimeout(() => { resolve(2); }, delayInms); }); } } }