Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.94 KB | None | 0 0
  1. const { Client, RichEmbed } = require("discord.js");
  2. const yt_api_key = "AIzaSyDV2JNcnCiCEW99ON7vvwBN5JkDWaIXkXc"
  3. const client = new Client({ disableEveryone: true})
  4. const ytdl = require("ytdl-core");
  5. const devs = ["171259176029257728", "343383616895713290"] ///حط الايدي حقك وحط خويك هنا
  6. const convert = require("hh-mm-ss")
  7. const fetchVideoInfo = require("youtube-info");
  8. const bot = require('./package.json');
  9. const simpleytapi = require('simple-youtube-api')
  10. const youtube = new simpleytapi(yt_api_key);
  11. const prefix = "m-";
  12. client.login(process.env.SECERT_KEY);
  13. var guilds = {};
  14.  
  15. /////////////////////////////////////////////////////////////////
  16. client.on('ready', () => client.user.setActivity(`m-play , m-search.`, {type: "LISTENING"}))
  17. /////////////////////////////////////////////////////////////////////////////////
  18. /////////////////////////////////////////////////////////////////////////////////
  19.  
  20. client.on('message', async function(message) {
  21. if(message.author.bot) return;
  22. if(!message.channel.guild) return;
  23. //////////////////////////////////
  24. if(message.content === `<@${client.user.id}>`) return message.channel.send(`Hey I'am **${client.user.username}**. A nice music bot developed by <@${client.users.get(devs[0]).id}>\nGet In touch with me \`\`m-contact\`\``);
  25. const novc = "**:x: You are not in a voice channel.**"
  26. const yt = "✅"
  27. const correct = "✅"
  28. const nope = "❌"
  29. let args = message.content.split(' ').slice(1).join(" ");
  30.  
  31. if (message.content.startsWith(`${prefix}eval`)) {
  32. const eargs = message.content.split(" ").slice(1);
  33. if(!devs.includes(message.author.id)) return;
  34. const clean = text => {
  35. if (typeof(text) === "string")
  36. return text.replace(/`/g, "`" + String.fromCharCode(8203)).replace(/@/g, "@" + String.fromCharCode(8203));
  37. else
  38. return text;
  39. }
  40. try {
  41. const code = eargs.join(" ");
  42. let evaled = eval(code);
  43.  
  44. if (typeof evaled !== "string")
  45. evaled = require("util").inspect(evaled);
  46. message.channel.send(clean(evaled), {code:"xl"});
  47. } catch (err) {
  48. message.channel.send(`\`ERROR\` \`\`\`xl\n${clean(err)}\n\`\`\``);
  49. }
  50. } else if(message.content.toLowerCase().startsWith(`${prefix}help`)) {
  51. const { music, info } = require('./help');
  52. if(!args) return message.channel.send({embed: {
  53. author: {
  54. name: `${client.user.username} Help`,
  55. icon_url: client.user.avatarURL
  56. },
  57. description: `🏳 Want more help? \`\`${prefix}help <command>\`\` | Total Commands: **${music.map(m => m.name).length + info.map(m => m.name).length}**`,
  58. fields: [
  59. {
  60. name: '❯ Music Commands',
  61. value: `${music.map(m =>`\`\`${m.name}\`\``).join(" ")}`
  62. },
  63. {
  64. name: "❯ Info Commands",
  65. value: `${info.map(m =>`\`\`${m.name}\`\``).join(" ")}`
  66. }
  67. ],
  68. color: 0xF19894,
  69. footer: {
  70. text: `${client.user.username} ${bot.version} Beta`
  71. }
  72. }})
  73. const foundCommand = music.find(m => m.name === args.toLowerCase()) || info.find(m => m.name === args.toLowerCase())
  74. if(foundCommand) {
  75. return message.channel.send("", {embed: {
  76. author: {
  77. name: `${foundCommand.name[0].toUpperCase() + foundCommand.name.slice(1)} Help`,
  78. icon_url: "https://images-ext-2.discordapp.net/external/ixx9VwaXIvBi71wGahYe_NzG51gFQonnXVBl2eEbQmk/https/cdn.pixabay.com/photo/2012/04/14/16/26/question-34499_960_720.png?width=473&height=473"
  79. },
  80. fields: [
  81. {
  82. name: '❯ Description',
  83. value: foundCommand.desc
  84. },
  85. {
  86. name: '❯ Usage',
  87. value: `\`\`${prefix + foundCommand.usage}\`\``,
  88. inline: true
  89. },
  90. {
  91. name: `❯ Aliases`,
  92. value: foundCommand.aliases.map(m => m).join(" ") || "N/A",
  93. inline: true
  94. }
  95. ],
  96. color: 0xF19894,
  97. }})
  98. } else return message.channel.send({embed: {
  99. description:`**No command found with this name \`${args}\`**`,
  100. color: 0xff0000,
  101. }});
  102. }
  103.  
  104. if(message.content.startsWith(`${prefix}info`)) {
  105. function convertMS(ms) {
  106. var d, h, m, s;
  107. s = Math.floor(ms / 1000);
  108. m = Math.floor(s / 60);
  109. s = s % 60;
  110. h = Math.floor(m / 60);
  111. m = m % 60;
  112. d = Math.floor(h / 24);
  113. h = h % 24;
  114. return {
  115. d: d,
  116. h: h,
  117. m: m,
  118. s: s
  119. };
  120. };
  121. let u = convertMS(client.uptime);
  122. let uptime = u.d + " days , " + u.h + " hrs , " + u.m + " mins , " + u.s + " secs"
  123. message.channel.send(new RichEmbed()
  124. .setAuthor(client.user.username,client.user.avatarURL)
  125. .setURL("https://abayro.xyz")
  126. .addField("Version", bot.version, true)
  127. .addField("Library", "[discordjs](https://www.npmjs.com/search?q=discord.js)", true)
  128. .addField("Creator", "Abady", true)
  129. .addField("Users", `${client.users.size}`, true)
  130. .addField('RAM Usage',`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)} MB`,true)
  131. .addField("Website", "http://abayro.xyz", true)
  132. .setFooter(`Uptime ${uptime} | ${client.user.username} doesn't use Lavalink!`)
  133. .setColor("RANDOM")
  134. )
  135. }
  136. else if (message.content.startsWith(`${prefix}invite`)) {
  137. client.generateInvite(["SEND_MESSAGES", 'CONNECT', 'SPEAK', 'VIEW_CHANNEL', 'ADMINISTRATOR']).then(link => {
  138. message.channel.send("", {embed: {description: `Abayro says that would be awesome <3 **[Click here to invite me!](${link})**`, color: 0x00ff00}})
  139. })
  140. } else if(message.content.startsWith(`${prefix}contact`)) {
  141. if(!args) return message.channel.send(`Get in touch with me, leave a message. (Real Inqiures Only) \`\`m-contact (Your message)\`\``)
  142. if(args.length < 2) return message.channel.send(`Your message haven't delivered. make sure your message is more than one word.`)
  143. client.users.get(devs[0]).send(`${args}\n\n Server: ${message.guild.name} - User: ${message.author.tag}`).then(()=> {
  144. message.channel.send(`**Thank you!** Your message have been delivered. I'll try to reply as soon as possible.`, {files: ['https://pbs.twimg.com/media/DeikbSqV0AAUSUU.jpg']})
  145. })
  146. } else if (message.content.toLowerCase().startsWith(`${prefix}lyric`)) {
  147. const lyricistapi = require('lyricist');
  148. const lyric = new lyricistapi("3u50HX1N0KeDBMCN_y3W126tTcJizSOz-yJtJE7TOmQepOGkAPuzQhuZiRLG9BDn");
  149. try {
  150. if(!args) {
  151. args = guilds[message.guild.id].queueNames[0].replace(/\[[^\]]*\]/g, "").replace(/ *\([^)]*\) */g, "").replace(/[^\w\s]/gi, "");
  152. }
  153. } catch (error) {
  154. return message.channel.send(`:x: Missing args.`)
  155. }
  156. const song = await lyric.search(args)
  157. if(song[0]) {
  158. const msg22 = await message.channel.send(`:bookmark_tabs: Fetching **${song[0].full_title}** Lyrics.`);
  159. const songlyrics = await lyric.song(song[0].id, {fetchLyrics: true, textFormat: "dom"})
  160. let fixedsonglyrics;
  161. if(songlyrics.lyrics.length > 2047) fixedsonglyrics = songlyrics.lyrics.slice(0, 2000 - songlyrics.url.length) + `......\n\n[**Continue Here**](${songlyrics.url})`
  162. else fixedsonglyrics = songlyrics.lyrics
  163. msg22.edit("", {embed: {
  164. description: `\n${fixedsonglyrics}`,
  165. color: 0x7ec0ee,
  166. title: songlyrics.full_title,
  167. url: songlyrics.url,
  168. thumbnail: {
  169. url: songlyrics.header_image_url,
  170. },
  171. }})
  172. } else return message.channel.send(`:x: No results for **\`\`${args}\`\`**`)
  173. }
  174.  
  175. function clear() {
  176. guilds[message.guild.id].queue = [];
  177. guilds[message.guild.id].queueNames = [];
  178. guilds[message.guild.id].isPlaying = false;
  179. guilds[message.guild.id].dispatcher = null
  180. guilds[message.guild.id].voiceChannel = null;
  181. guilds[message.guild.id].skipReq = 0;
  182. guilds[message.guild.id].skipReq = [];
  183. guilds[message.guild.id].loop = false;
  184. guilds[message.guild.id].volume = 1;
  185. }
  186.  
  187. const mess = message.content.toLowerCase();
  188.  
  189. if (!guilds[message.guild.id]) {
  190. guilds[message.guild.id] = {
  191. queue: [],
  192. queueNames: [],
  193. isPlaying: false,
  194. dispatcher: null,
  195. voiceChannel: null,
  196. volume: 1,
  197. skipReq: 0,
  198. skippers: [],
  199. loop: false
  200. };
  201. }
  202.  
  203.  
  204. if (mess.startsWith(prefix + "play") || mess.startsWith(prefix+"شغل")) {
  205. if (message.member.voiceChannel || guilds[message.guild.id].voiceChannel != null) {
  206. const voiceChannel = message.member.voiceChannel
  207. const permissions = voiceChannel.permissionsFor(message.client.user)
  208. if (!permissions.has('CONNECT')) return message.channel.send({embed: {description: "🛑 I don't have permission to CONNECT! Give me some."}});
  209. if (!permissions.has('SPEAK')) return message.channel.send({embed: {description: "🛑 I don't have permission to SPEAK! Give me some."}});
  210. if (args.length == 0 || !args) return message.channel.send(`:musical_note: m-play **<Youtube URL / Search>**`)
  211. if (guilds[message.guild.id].queue.length > 0 || guilds[message.guild.id].isPlaying) {
  212. if(guilds[message.guild.id].queue.length > 100) return message.channel.send(``, {embed: {
  213. description: `🔒 Sorry, max queue length is 100, do **${prefix}clear** to clear entire queue or **${prefix}clear <number>** to clear 1 item`
  214. }})
  215. if(args.match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi) && !isYoutube(args)) {
  216. return message.channel.send(`:x: For some reasons you canno't play any other YT stream if it's not number #1 in queue. Do **\`\`clear\`\`** and try again.`)
  217. }
  218. if (args.match(/[?&]list=([^#\&\?]+)/)) {
  219. const playlist = await youtube.getPlaylist(args);
  220. if(!playlist) return message.channel.send(`:x: I couldn't get this playlist!`)
  221. const videos = await playlist.getVideos();
  222. const queuesync = 100 - guilds[message.guild.id].queue.length
  223. if(queuesync < 0 || queuesync == 0) return message.channel.send(`:x: Cannot add this playlist, **\`\`MAX_QUEUE = 100\`\`** clear the current queue and try again!`)
  224. videos.filter(m => m.thumbnails !== undefined).slice(0, queuesync).forEach(video => {
  225. guilds[message.guild.id].isPlaying = true;
  226. guilds[message.guild.id].queueNames.push(video.title)
  227. guilds[message.guild.id].queue.push(video.id)
  228. })
  229. return message.channel.send(`[:musical_score: __${playlist.title}__] **${queuesync}** items Added to the **Queue**!`) ;
  230. }
  231. message.channel.send(`**${yt} Searching :mag_right: \`\`${args}\`\`**`).then(()=> {
  232. getID(args, function(id) {
  233. if(!id) return message.channel.send(`:x: I couldn't find anything with this title **${args}**.`);
  234. fetchVideoInfo(id, function(err, videoInfo) {
  235. if (err) throw new Error(err);
  236. if(videoInfo.duration > 1800) return message.channel.send(`**${message.author.username}, :x: Cannot play a video that's longer than 30 minutes**`).then(message.react(nope));
  237. else message.react(correct)
  238. add_to_queue(id, message);
  239. message.channel.send(new RichEmbed()
  240. .setAuthor("Added to queue", message.author.avatarURL)
  241. .setTitle(videoInfo.title)
  242. .setURL(videoInfo.url)
  243. .addField("Channel", videoInfo.owner, true)
  244. .addField("Duration", convert.fromS(videoInfo.duration, 'mm:ss') , true)
  245. .addField("Published at", videoInfo.datePublished, true)
  246. .addField("Postion in queue", guilds[message.guild.id].queueNames.length, true)
  247. .setColor("RED")
  248. .setThumbnail(videoInfo.thumbnailUrl)
  249. )
  250. guilds[message.guild.id].queueNames.push(videoInfo.title);
  251. });
  252. })
  253. })
  254. } else {
  255. if (args.match(/[?&]list=([^#\&\?]+)/)) {
  256. const playlist = await youtube.getPlaylist(args);
  257. if(!playlist) return message.channel.send(`:x: I couldn't get this playlist!`)
  258. const videos = await playlist.getVideos(100)
  259. playMusic(videos[0].id, message)
  260. guilds[message.guild.id].queueNames.push(videos[0].title)
  261. guilds[message.guild.id].queue.push(videos[0].id)
  262. videos.filter(m => m.thumbnails !== undefined).slice(1, 100).forEach(video => {
  263. guilds[message.guild.id].isPlaying = true;
  264. guilds[message.guild.id].queueNames.push(video.title)
  265. guilds[message.guild.id].queue.push(video.id)
  266. })
  267. return message.channel.send(`[:musical_score: __${playlist.title}__] **${videos.filter(m => m.thumbnails !== undefined).slice(0, 100).length}** items Added to the **Queue**!\nPlaying :notes: **\`\`${videos[0].title}\`\`** ― Now!`) ;
  268. } else {
  269. if(args.match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi) && !isYoutube(args)) {
  270. if(guilds[message.guild.id].queue[0]) return message.channel.send(`:x: For some reasons you canno't play any other YT stream if it's not number #1 in queue. Do **\`\`clear\`\`** and try again.`)
  271. playMusic(args, message).catch(err => message.channel.send(`<:megErrOr:475075170231517184> That's not something to play!`))
  272. guilds
  273. guilds[message.guild.id].isPlaying = true;
  274. return message.channel.send(`:arrow_forward: Now playing from **${args}**`);
  275. } else {
  276. message.channel.send(`${yt} **Searching :mag_right: \`\`${args}\`\` **`).then(() => {
  277. getID(args, function(id) {
  278. if(!id) return message.channel.send(`:x: I couldn't find anything with this title **${args}**.`);
  279. fetchVideoInfo(id, function(err, videoInfo) {
  280. if (err) throw new Error(err);
  281. if(videoInfo.duration > 1800) return message.channel.send(`**${message.author.username}, :x: Cannot play a video that's longer than 30 minutes**`).then(message.react(nope))
  282. else message.react(correct)
  283. playMusic(id, message);
  284. guilds[message.guild.id].isPlaying = true;
  285. guilds[message.guild.id].queue.push(id);
  286. guilds[message.guild.id].queueNames.push(videoInfo.title);
  287. message.channel.send(`Playing :notes: **\`\`${videoInfo.title}\`\`** ― Now!`);
  288. })
  289. })})}}
  290. }
  291. } else {
  292. message.channel.send(novc);
  293. }
  294.  
  295. } else if (mess.startsWith(prefix + "skip") || mess.startsWith(prefix+"عدي")) {
  296. if(!message.member.voiceChannel) return message.channel.send(novc)
  297. if(message.member.hasPermission('MANAGE_CHANNELS')) {
  298. if (guilds[message.guild.id].queueNames[0]) {
  299. message.channel.send(`**:fast_forward: Skipped** ${guilds[message.guild.id].queueNames[0]}`);
  300. return skip_song(message);
  301. } else return message.channel.send(`**:x: Nothing playing in this server**`);
  302. }
  303. else
  304. if (guilds[message.guild.id].skippers.indexOf(message.author.id) === -1) {
  305. guilds[message.guild.id].skippers.push(message.author.id);
  306. guilds[message.guild.id].skipReq++;
  307. if (guilds[message.guild.id].skipReq >= Math.ceil((guilds[message.guild.id].voiceChannel.members.size - 1) / 2)) {
  308. if (guilds[message.guild.id].queueNames[0]) {
  309. message.channel.send(`**:fast_forward: Skipped** ${guilds[message.guild.id].queueNames[0]}`);
  310. skip_song(message);
  311. } else return message.channel.send(`**:x: Nothing playing in this server**`);
  312. } else {
  313. message.channel.send(`:point_up::skin-tone-1: **${message.author.username}** has voted to skip current song! **${Math.floor(Math.ceil((guilds[message.guild.id].voiceChannel.members.size - 1) / 2) - guilds[message.guild.id].skipReq)}** more votes to skip!`);
  314. }
  315. } else {
  316. message.channel.send("<:megX:476797393283710991> you already voted to skip!");
  317. }
  318.  
  319. } else if (mess.startsWith(prefix + "queue") || mess.startsWith(prefix+"قائمة")) {
  320. if(guilds[message.guild.id].queueNames.length < 1) return message.channel.send(`**:x: Nothing playing in this server**`);
  321. const numbaone = await youtube.getVideoByID(guilds[message.guild.id].queue[0])
  322. if(!guilds[message.guild.id].queueNames[1]) return message.channel.send('', {embed: {
  323. description: `__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})** \`\`${convert.fromS(numbaone.durationSeconds)}\`\` `,
  324. author: {
  325. name: `${message.guild.name}'s Queue.`,
  326. icon_url: message.guild.iconURL
  327. },
  328. color: 3447003
  329. }});
  330. else {
  331. let x;
  332. if(args > 1) {
  333. x = Math.floor(args)*10+1
  334. } else {
  335. x = Math.floor(11)
  336. }
  337. let i;
  338. if(args > 1) {
  339. i = x-11
  340. } else {
  341. i = 0
  342. }
  343. //? Following is depracted, I'am going to use a queueTimes in guilds.
  344. // var queueTimes = [];
  345. // for (var s = 0; s < x; s++) {
  346. // const videos = await youtube.getVideoByID(guilds[message.guild.id].queue[s])
  347. // let time = videos.durationSeconds
  348. // if(!videos.durationSeconds) time = 0
  349. // queueTimes.push(Math.floor(time))
  350. // }
  351. //?
  352. let queuelist = guilds[message.guild.id].queueNames.slice(x-10,x).map(song => `**\`\`${++i}.\`\`** [${song}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[i]})`).join('\n\n')
  353. if(!queuelist) return message.channel.send(`<:megX:476797393283710991> | Page doesn't exist!`)
  354. const embed = new RichEmbed()
  355. embed.setDescription(`__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})**\n\n:arrow_down: __Up Next__ :arrow_down:\n\n${queuelist}\n\n**Total items in queue:** ${guilds[message.guild.id].queueNames.length}`)
  356. embed.setThumbnail("https://upload.wikimedia.org/wikipedia/commons/7/73/YouTube_Music.png")
  357. embed.setAuthor(`${message.guild.name}'s Queue (${Math.floor(x/10)} / ${Math.floor((guilds[message.guild.id].queue.slice(1).length+10) /10)})`)
  358. embed.setColor(3447003);
  359. message.channel.send(embed).then(async msg => {
  360. if(Math.floor((guilds[message.guild.id].queue.slice(1).length+10) /10) > 1) {
  361. await msg.react("⏪")
  362. await msg.react("◀")
  363. await msg.react("🔵")
  364. await msg.react("▶")
  365. await msg.react("⏩")
  366. const pages = Math.floor((guilds[message.guild.id].queue.slice(1).length+10) /10)
  367. let page = Math.floor(x/10)
  368. const back = msg.createReactionCollector((reaction, user) => reaction.emoji.name === "◀" && user.id === message.author.id, {time: 60000})
  369. const doubleback = msg.createReactionCollector((reaction, user) => reaction.emoji.name === "⏪" && user.id === message.author.id, {time: 60000})
  370. const doubleforwad = msg.createReactionCollector((reaction, user) => reaction.emoji.name === "⏩" && user.id === message.author.id, {time: 60000})
  371. const forwad = msg.createReactionCollector((reaction, user) => reaction.emoji.name === "▶" && user.id === message.author.id, {time: 60000})
  372. back.on('collect', async r => {
  373. if(page === 1) return;
  374. await r.remove(message.author);
  375. await page--
  376. x = Math.floor(page)*10+1
  377. i = x-11
  378. queuelist = guilds[message.guild.id].queueNames.slice(x-10,x).map(song => `**\`\`${++i}.\`\`** [${song}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[i]})`).join('\n\n')
  379. embed.setDescription(`__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})**\n\n:arrow_down: __Up Next__ :arrow_down:\n\n${queuelist}\n\n**Total items in queue:** ${guilds[message.guild.id].queueNames.length}`)
  380. embed.setAuthor(`${message.guild.name}'s Queue (${page} / ${pages})`)
  381. msg.edit(embed)
  382. })
  383. forwad.on('collect', async r => {
  384. if(page === pages) return;
  385. await r.remove(message.author);
  386. await page++
  387. x = Math.floor(page)*10+1
  388. i = x-11
  389. queuelist = guilds[message.guild.id].queueNames.slice(x-10,x).map(song => `**\`\`${++i}.\`\`** [${song}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[i]})`).join('\n\n')
  390. embed.setDescription(`__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})**\n\n:arrow_down: __Up Next__ :arrow_down:\n\n${queuelist}\n\n**Total items in queue:** ${guilds[message.guild.id].queueNames.length}`)
  391. embed.setAuthor(`${message.guild.name}'s Queue (${page} / ${pages})`)
  392. msg.edit(embed)
  393. })
  394. doubleback.on('collect', async r => {
  395. if(page === 1) return;
  396. await r.remove(message.author);
  397. page = 1
  398. x = Math.floor(page)*10+1
  399. i = x-11
  400. queuelist = guilds[message.guild.id].queueNames.slice(x-10,x).map(song => `**\`\`${++i}.\`\`** [${song}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[i]})`).join('\n\n')
  401. embed.setDescription(`__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})**\n\n:arrow_down: __Up Next__ :arrow_down:\n\n${queuelist}\n\n**Total items in queue:** ${guilds[message.guild.id].queueNames.length}`)
  402. embed.setAuthor(`${message.guild.name}'s Queue (${page} / ${pages})`)
  403. msg.edit(embed)
  404. })
  405. doubleforwad.on('collect', async r => {
  406. if(page === pages) return;
  407. await r.remove(message.author);
  408. page = pages
  409. x = Math.floor(page)*10+1
  410. i = x-11
  411. queuelist = guilds[message.guild.id].queueNames.slice(x-10,x).map(song => `**\`\`${++i}.\`\`** [${song}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[i]})`).join('\n\n')
  412. embed.setDescription(`__Now Playing:__\n**[${guilds[message.guild.id].queueNames[0]}](https://www.youtube.com/watch?v=${guilds[message.guild.id].queue[0]})**\n\n:arrow_down: __Up Next__ :arrow_down:\n\n${queuelist}\n\n**Total items in queue:** ${guilds[message.guild.id].queueNames.length}`)
  413. embed.setAuthor(`${message.guild.name}'s Queue (${page} / ${pages})`)
  414. msg.edit(embed)
  415. })
  416. } else return;
  417. })
  418. }
  419. }
  420.  
  421. if(mess.startsWith(prefix+"np")) {
  422. const short = require('short-number');
  423. if(!guilds[message.guild.id].queue[0] || !guilds[message.guild.id].isPlaying) return message.channel.send(`**:x: Nothing playing in this server**`)
  424. await message.channel.startTyping()
  425. const embed = new RichEmbed()
  426. await fetchVideoInfo(guilds[message.guild.id].queue[0], function(err, videoInfo) {
  427. if (err) {
  428. embed.setAuthor("Now Playing", client.user.avatarURL)
  429. embed.setTitle(guilds[message.guild.id].queueNames[0])
  430. embed.setURL(guilds[message.guild.id].queue[0])
  431. throw new Error(err);
  432. } else {
  433. embed.setAuthor(`Now Playing`, client.user.avatarURL)
  434. embed.setTitle(videoInfo.title)
  435. embed.setURL(videoInfo.url)
  436. embed.addField("Channel", `[**${videoInfo.owner}**](https://youtube.com/channel/${videoInfo.channelId})`, true)
  437. embed.addField("Duration", `${convert.fromS(videoInfo.duration, 'mm:ss')} — [**Download MP3**](https://www.flvto.biz/sa/downloads/mp3/yt_${videoInfo.videoId})`, true)
  438. embed.addField("Views", short(videoInfo.views), true)
  439. embed.addField("Likes/Dislikes", `👍 **${short(videoInfo.likeCount)}** / 👎 **${short(videoInfo.dislikeCount)}**`, true)
  440. embed.setColor("RED")
  441. embed.setImage(videoInfo.thumbnailUrl)
  442. }
  443. message.channel.stopTyping(true);
  444. message.channel.send(embed)
  445. })
  446. }
  447.  
  448. if(mess.startsWith(prefix+"stop") || mess.startsWith(prefix+"اطلع")) {
  449. if (!message.member.voiceChannel) return message.channel.send(novc);
  450. if(guilds[message.guild.id].isPlaying) guilds[message.guild.id].dispatcher.end();
  451. if (guilds[message.guild.id].voiceChannel)
  452. {
  453. await clear()
  454. message.guild.voiceConnection.disconnect();
  455. message.channel.send(`**:mailbox_with_no_mail: Successfully disconnected!**`)
  456. }
  457. }
  458.  
  459. if(mess.startsWith(prefix+"stfu") || message.content.startsWith(`<@${client.user.id}> stfu`)) {
  460. if (!message.member.voiceChannel) return message.channel.send(novc);
  461. if(guilds[message.guild.id].isPlaying) guilds[message.guild.id].dispatcher.end();
  462. if (guilds[message.guild.id].voiceChannel)
  463. {
  464. await clear()
  465. message.guild.voiceConnection.disconnect();
  466. message.channel.send(`:cry: k sempai!`)
  467. }
  468. }
  469.  
  470. if(message.content.startsWith(prefix+"search")) {
  471. let index = 0
  472. if(!args) return message.channel.send(`:x: You didn't enter a query!`)
  473. const videos = await youtube.searchVideos(args, 5)
  474. message.channel.send(`**${yt} Search Results for \`\`${args}\`\`**`,{embed: {
  475. description: `**__Song Selection__** Type the number of the song or do **cancel** to cancel!\n\n${videos.map(song =>`**${++index}. [${song.title}](${song.url})**`).join('\n')}`,
  476. footer: {
  477. text: `Requested by ${message.author.username} (${message.author.id})`,
  478. icon_url: message.author.avatarURL
  479. }
  480. }})
  481. try {
  482. var response = await message.channel.awaitMessages(msg2 => msg2.content > 0 && msg2.content < 11 || msg2.content === 'cancel' || msg2.content.startsWith("m-search") && msg2.author.id === message.author.id, {
  483. maxMatches: 1,
  484. time: 30000,
  485. errors: ['time'],
  486. });
  487. } catch (error) {
  488. return message.channel.send(`**:x: Timeout**`)
  489. }
  490. if(guilds[message.guild.id].queue.length > 100) return message.channel.send(``, {embed: {
  491. description: `🔒 Sorry, max queue length is 100, do **${prefix}clear** to clear entire queue or **${prefix}clear <number>** to clear 1 item`
  492. }})
  493. if(!message.member.voiceChannel) return;
  494. if(response.first().content === 'cancel') return message.channel.send(`Alright, I've **cancelled** this opreation.`)
  495. if(response.first().content === 'm-search') return;
  496. const videoIndex = parseInt(response.first().content)
  497. const voiceChannel = message.member.voiceChannel
  498. const permissions = voiceChannel.permissionsFor(message.client.user)
  499. if (!permissions.has('CONNECT')) return message.channel.send({embed: {description: "🛑 I don't have permission to CONNECT! Give me some."}});
  500. if (!permissions.has('SPEAK')) return message.channel.send({embed: {description: "🛑 I don't have permission to SPEAK! Give me some."}});
  501. const id = videos[videoIndex - 1].id;
  502. message.delete();
  503. if(!guilds[message.guild.id].queue[0] || !guilds[message.guild.id].isPlaying) {
  504. fetchVideoInfo(id, function(err, videoInfo) {
  505. if (err) throw new Error(err);
  506. if(videoInfo.duration > 1800) return message.channel.send(`**${message.author.username}, :x: Cannot play a video that's longer than 30 minutes**`).then(message.react(nope));
  507. if(!message.member.voiceChannel) return message.channel.send(novc);
  508. else message.react(correct)
  509. playMusic(id, message);
  510. guilds[message.guild.id].isPlaying = true;
  511. guilds[message.guild.id].queue.push(id);
  512. guilds[message.guild.id].queueNames.push(videos[videoIndex - 1].title);
  513. message.channel.send(`Playing :notes: **\`\`${videos[videoIndex - 1].title}\`\`** ― Now!`);
  514. });
  515. } else {
  516. fetchVideoInfo(`${id}`, function(err, videoInfo) {
  517. if (err) throw new Error(err);
  518. if(videoInfo.duration > 1800) return message.channel.send(`**${message.author.username}, :x: Cannot play a video that's longer than 30 minutes**`).then(message.react(nope));
  519. else message.react(correct)
  520. add_to_queue(id, message);
  521. message.channel.send(new RichEmbed()
  522. .setAuthor("Added to queue", message.author.avatarURL)
  523. .setTitle(videoInfo.title)
  524. .setURL(videoInfo.url)
  525. .addField("Channel", videoInfo.owner, true)
  526. .addField("Duration", convert.fromS(videoInfo.duration, 'mm:ss') , true)
  527. .addField("Published at", videoInfo.datePublished, true)
  528. .addField("Postion in queue", guilds[message.guild.id].queueNames.length, true)
  529. .setColor("RED")
  530. .setThumbnail(videoInfo.thumbnailUrl)
  531. )
  532. guilds[message.guild.id].queueNames.push(videoInfo.title);
  533. });
  534. }
  535. }
  536.  
  537.  
  538. else if (mess.startsWith(prefix + 'vol') || mess.startsWith(prefix + "volume")|| mess.startsWith(prefix+"صوت")) {
  539. if (!message.member.voiceChannel) return message.channel.send(novc);
  540. if (!guilds[message.guild.id].isPlaying) return message.channel.send("**:x: Nothing playing in this server**")
  541. if(!args) return message.channel.send(`**:loud_sound: Current Volume:** ${guilds[message.guild.id].dispatcher.volume*100}`)
  542. if(isNaN(args)) return message.channel.send(`**:x: Volume must be a number -_-**`)
  543. if (args > 200) return message.channel.send('**:headphones: For some health reasons the max vol you can use is ``200``, kthx**');
  544. if (args < 1) return message.channel.send("**:headphones: you can set volume from ``1`` to ``200``**");
  545. guilds[message.guild.id].dispatcher.setVolume((0.01 * parseInt(args)))
  546. guilds[message.guild.id].volume = 0.01 * parseInt(args)
  547. message.channel.send(`**:loud_sound: Volume:** ${guilds[message.guild.id].dispatcher.volume*100}`);
  548. }
  549.  
  550.  
  551. else if (mess.startsWith(prefix + 'pause') || mess.startsWith(prefix+"وقف")) {
  552. if (!message.member.voiceChannel) return message.channel.send(novc);
  553. if(guilds[message.guild.id].isPlaying !== true || !guilds[message.guild.id].queue[0]) return message.channel.send(`**:x: Nothing playing in this server**`)
  554. if (guilds[message.guild.id].dispatcher.paused === true) return message.channel.send("*:hash: Already paused*")
  555. message.channel.send(':pause_button: **Paused**').then(() => {
  556. guilds[message.guild.id].dispatcher.pause(false);
  557. });
  558. }
  559.  
  560. else if (mess.startsWith(prefix + 'resume') || mess.startsWith(prefix+"كمل")) {
  561. if (!message.member.voiceChannel) return message.channel.send(novc);
  562. if (guilds[message.guild.id].dispatcher.paused === false) return message.channel.send("*:hash: Nothing to resume.*")
  563. message.channel.send(':play_pause: **Resuming**').then(() => {
  564. guilds[message.guild.id].dispatcher.resume();
  565. });
  566. }
  567.  
  568.  
  569. //? ONE ITEM WORKS, BUT QUEUE NO... ==> QUEUE LOOP SYSTEM IN 2.0
  570.  
  571. else if (mess.startsWith(prefix + 'loop') || mess.startsWith(prefix+"عيد")) {
  572. if (!message.member.voiceChannel) return message.channel.send(novc);
  573. if (!guilds[message.guild.id].isPlaying) return message.channel.send("**:x: Nothing playing in this server**")
  574. if(guilds[message.guild.id].loop === true) {
  575. message.channel.send(`:arrow_right_hook: **Looping Disabled**`)
  576. guilds[message.guild.id].loop = false;
  577. return;
  578. } else if(guilds[message.guild.id].loop === false) {
  579. guilds[message.guild.id].loop = true;
  580. message.channel.send(':repeat_one: **Looping Enabled!**')
  581. return;
  582. }
  583.  
  584. }
  585. /* else if(mess.startsWith(`${prefix}shuffle`)) {
  586. // if(!guilds[message.guild.id].queue[2]) return message.channel.send(`:x: It seems you can't do that right now.`)
  587. // shuffle(guilds[message.guild.id].queue.slice(1) , guilds[message.guild.id].queueNames.slice(1))
  588. // message.channel.send(`:twisted_rightwards_arrows: Queue shuffled.`)
  589. }*/
  590. else if (mess.startsWith(prefix + 'join') || mess.startsWith(prefix+"ادخل")) {
  591. if (!message.member.voiceChannel) return message.channel.send(novc);
  592. if(!guilds[message.guild.id].isPlaying && guilds[message.guild.id].queueNames.length <= 0) {
  593. message.member.voiceChannel.join().then(message.react(correct));
  594. message.channel.send(`**:page_facing_up: Queue moved to \`\`${message.member.voiceChannel.name}\`\`**`)
  595. } else {
  596. message.channel.send(`<:megX:476797393283710991> **Music is being played in another voice channel!**`)
  597. }
  598. }
  599.  
  600. else if (mess.startsWith(prefix + 'clear') || mess.startsWith(prefix+"نظف")) {
  601. if (!message.member.voiceChannel) return message.channel.send(novc);
  602. if(!guilds[message.guild.id].queueNames[0] || !guilds[message.guild.id].isPlaying) return message.channel.send(`**:x: Nothing playing in this server**`)
  603. if(guilds[message.guild.id].queueNames.length > 1) {
  604. if(!args || isNaN(args) && args != 0) {
  605. guilds[message.guild.id].queueNames.splice(1, guilds[message.guild.id].queueNames.length)
  606. guilds[message.guild.id].queue.splice(1, guilds[message.guild.id].queue.length)
  607. message.channel.send(`:asterisk: Cleared the queue of **${message.guild.name}**`)
  608. } else if(args > 0) {
  609. const removedsong = guilds[message.guild.id].queueNames[parseInt(args)]
  610. if(!removedsong) return message.channel.send(`:x: **No such item, or item doesn't exist!**`)
  611. guilds[message.guild.id].queueNames.splice(parseInt(args), 1)
  612. guilds[message.guild.id].queue.splice(parseInt(args), 1)
  613. return message.channel.send(`:wastebasket: Removed **${removedsong}** from the queue.`);}
  614. } else if(guilds[message.guild.id].queueNames.length <= 1 ) {
  615. message.channel.send(`<:megX:476797393283710991> There's only 1 item in the queue. use \`\`${prefix}skip\`\` instead! `)
  616. }
  617. }
  618. });
  619.  
  620.  
  621.  
  622. //
  623. async function skip_song(message) {
  624. await guilds[message.guild.id].dispatcher.end();
  625. }
  626.  
  627. async function playMusic(id, message) {
  628. guilds[message.guild.id].voiceChannel = message.member.voiceChannel;
  629. guilds[message.guild.id].voiceChannel.join().then(function(connection) {
  630. if(!isYoutube(id) && id.match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi)) {
  631. stream = id
  632. } else {
  633. stream = ytdl("https://www.youtube.com/watch?v=" + id, {
  634. filter: 'audioonly',
  635. quality: 'highestaudio',
  636. audioEncoding: "opus"
  637. })};
  638. guilds[message.guild.id].skipReq = 0;
  639. guilds[message.guild.id].skippers = [];
  640. guilds[message.guild.id].dispatcher = connection.playStream(stream, {bitrate: "auto", volume: guilds[message.guild.id].volume})
  641. guilds[message.guild.id].dispatcher.on('end', async function() {
  642. guilds[message.guild.id].skipReq = 0;
  643. guilds[message.guild.id].skippers = [];
  644. if(guilds[message.guild.id].loop === true) return playMusic(guilds[message.guild.id].queue[0], message)
  645. else
  646. await guilds[message.guild.id].queue.shift();
  647. await guilds[message.guild.id].queueNames.shift();
  648. if (guilds[message.guild.id].queue.length === 0) {
  649. guilds[message.guild.id].queue = [];
  650. guilds[message.guild.id].queueNames = [];
  651. guilds[message.guild.id].isPlaying = false;
  652. setTimeout(function() {
  653. if(guilds[message.guild.id].voiceChannel !== null) return message.channel.send(`**:stop_button: Queue concluded.** Please rate the audio quality https://www.strawpoll.me/16407689`)
  654. }, 1000)
  655. } else {
  656. setTimeout(async function() {
  657. if(!guilds[message.guild.id].queueNames || guilds[message.guild.id].queueNames[0] == undefined) return;
  658. await playMusic(guilds[message.guild.id].queue[0], message);
  659. message.channel.send(`Playing :notes: **\`\`${guilds[message.guild.id].queueNames[0]}\`\`** ― Now!`)
  660. }, 500);
  661. }
  662. });
  663. guilds[message.guild.id].dispatcher.on('error', function(error) {
  664. return message.channel.send(`<:megErrOr:475075170231517184> An error occurd! \`\`\`${error}\`\`\``)
  665. });
  666. });
  667. }
  668.  
  669.  
  670.  
  671. async function getID(str, cb) {
  672. if (isYoutube(str)) {
  673. const video = await youtube.getVideo(str)
  674. cb(video.raw.id);
  675. } else {
  676. const video = await youtube.searchVideos(str, 1)
  677. if(!video) return cb(null);
  678. cb(video.map(m => m.id).toString());
  679. }
  680. }
  681.  
  682. function add_to_queue(strID, message) {
  683. if (isYoutube(strID)) {
  684. guilds[message.guild.id].queue.push(getYouTubeID(strID));
  685. } else {
  686. guilds[message.guild.id].queue.push(strID);
  687. }
  688. }
  689.  
  690. //! DEPRCATED V
  691. // function search_video(query, callback) {
  692. // request("https://www.googleapis.com/youtube/v3/search?part=id&type=video&q=" + encodeURIComponent(query) + "&key=" + yt_api_key, function(error, response, body) {
  693. // var json = JSON.parse(body);
  694. // if (!json.items[0]) callback("3_-a9nVZYjk");
  695. // else {
  696. // callback(json.items[0].id.videoId);
  697. // }
  698. // });
  699. // }
  700. function isYoutube(str) {
  701. return str.toLowerCase().indexOf("youtube.com") > -1 || str.toLowerCase().indexOf("youtu.be") > -1;
  702. }
  703.  
  704. // function shuffle(a, b) {
  705. // for (var i = a.length - 1; i > 0; i--) {
  706. // const j = Math.floor(Math.random() * (i + 1));
  707. // [a[i], a[j]] = [a[j], a[i]];
  708. // [b[i], b[j]] = [b[j], b[i]];
  709. // }
  710. // return a, b;
  711. // }
  712. ////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement