const ytdl = require("ytdl-core-discord"); const { canModifyQueue, STAY_TIME } = require("../util/LanBot"); const { MessageEmbed, MessageAttachment } = require("discord.js"); const musicGif = new MessageAttachment('./assets/img/Music.gif'); const dancingGif = new MessageAttachment('./assets/img/dancing.gif'); module.exports = { async play(song, message) { let config; try { config = require("../config"); } catch (error) { config = null; } const PRUNING = config ? config.PRUNING : process.env.PRUNING; const queue = message.client.queue.get(message.guild.id); if (!song) { setTimeout(function () { if (queue.connection.dispatcher && message.guild.me.voice.channel) return; queue.channel.leave(); queue.textChannel.send("Fin de la liste de lecture ! Je vous abandonne !"); }, STAY_TIME * 1000); queue.textChannel.send("❌ La file d'attente est terminée.").catch(console.error); return message.client.queue.delete(message.guild.id); } let stream = null; let streamType = song.url.includes("youtube.com") ? "opus" : "ogg/opus"; try { if (song.url.includes("youtube.com")) {stream = await ytdl(song.url, { filter: format => ['251'], highWaterMark: 1 << 25 }), { type: 'opus' }; } } catch (error) { if (queue) { queue.songs.shift(); module.exports.play(queue.songs[0], message); } console.error(error); return message.channel.send( "Erreur: {error}", { error: error.message ? error.message : error } ); } queue.connection.on("disconnect", () => message.client.queue.delete(message.guild.id)); const dispatcher = queue.connection .play(stream, { type: streamType }) .on("finish", () => { if (collector && !collector.ended) collector.stop(); if (queue.loop) { // if loop is on, push the song back at the end of the queue // so it can repeat endlessly let lastSong = queue.songs.shift(); queue.songs.push(lastSong); module.exports.play(queue.songs[0], message); } else { // Recursively play the next song 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); var date = new Date(0); date.setSeconds(song.duration); // specify value for SECONDS here var timeString = date.toISOString().substr(11, 8); try { //let DJYT = require ("discordjs-ytdl"); let noiceEmbed = new MessageEmbed() .setTitle('Début de la lecture') .attachFiles(dancingGif) .setThumbnail('attachment://dancing.gif') .addField('Nom', song.title, true) .addField('Demandé par', message.author, true) .addField('Nombre de vues', song.views, true) .addField('Durée', timeString, true) .setImage(song.thumbnail) //.setImage("https://media.discordapp.net/attachments/789196713540976670/812047848047771658/lanziumbanniere.gif"); var playingMessage = await queue.textChannel.send(noiceEmbed); //console.log(DJYT.thumbnail); //`🎶 A commencé à jouer: **${song.title}** ${song.url}` await playingMessage.react("⏭"); await playingMessage.react("⏯"); await playingMessage.react("🔇"); await playingMessage.react("🔉"); await playingMessage.react("🔊"); await playingMessage.react("🔁"); await playingMessage.react("🔀"); await playingMessage.react("⏹"); } catch (error) { console.error(error); } 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", (reaction, user) => { if (!queue) return; const member = message.guild.member(user); switch (reaction.emoji.name) { case "⏭": queue.playing = true; reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); queue.connection.dispatcher.end(); queue.textChannel.send(`${user} ⏩ a skip la musique.`).catch(console.error).then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); collector.stop(); break; case "⏯": reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); if (queue.playing) { queue.playing = !queue.playing; queue.connection.dispatcher.pause(true); queue.textChannel.send(`${user} ⏸ a mis en pause la musique.`).catch(console.error).then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); } else { queue.playing = !queue.playing; queue.connection.dispatcher.resume(); queue.textChannel.send(`${user} ▶ a relancé la musique!`).catch(console.error).then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); } break; case "🔇": reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); if (queue.volume <= 0) { queue.volume = 100; queue.connection.dispatcher.setVolumeLogarithmic(100 / 100); queue.textChannel.send(`${user} 🔊 a unmute la musique!`).catch(console.error).then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); } else { queue.volume = 0; queue.connection.dispatcher.setVolumeLogarithmic(0); queue.textChannel.send(`${user} 🔇 a mute la musique!`).catch(console.error).then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); } break; case "🔉": reaction.users.remove(user).catch(console.error); if (queue.volume == 0) return; if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); if (queue.volume - 10 <= 0) queue.volume = 0; else queue.volume = queue.volume - 10; queue.connection.dispatcher.setVolumeLogarithmic(queue.volume / 100); queue.textChannel .send(`${user} 🔉 a diminué le volume, le volume est maintenant à ${queue.volume}%`) .catch(console.error) .then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); break; case "🔊": reaction.users.remove(user).catch(console.error); if (queue.volume == 100) return; if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); if (queue.volume + 10 >= 100) queue.volume = 100; else queue.volume = queue.volume + 10; queue.connection.dispatcher.setVolumeLogarithmic(queue.volume / 100); queue.textChannel .send(`${user} 🔉 a augmenté le volume, le volume est maintenant à ${queue.volume}%`) .catch(console.error) .then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); break; case "🔁": reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); queue.loop = !queue.loop; queue.textChannel .send( (`Le loop est maintenant ${queue.loop ? `**Actif**` : `**Inactif**`}`) ) .catch(console.error) .then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); break; case "🔀": reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); let songs = queue.songs; for (let i = songs.length - 1; i > 1; i--) { let j = 1 + Math.floor(Math.random() * i); [songs[i], songs[j]] = [songs[j], songs[i]]; } queue.songs = songs; queue.textChannel .send( (`Lecture aléatoire de la liste de lecture 🔀`) ) .catch(console.error) .then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); break; case "⏹": reaction.users.remove(user).catch(console.error); if (!canModifyQueue(member)) return message.channel.send("Vous devez d'abord rejoindre un salon vocal !"); queue.songs = []; queue.textChannel.send(`${user} ⏹ a arrêté la musique!`) .catch(console.error) .then(msg => { msg.delete({ timeout: 5000 /*time unitl delete in milliseconds*/}); }); try { queue.connection.dispatcher.end(); } catch (error) { console.error(error); queue.connection.disconnect(); } collector.stop(); break; default: reaction.users.remove(user).catch(console.error); break; } }); collector.on("end", () => { playingMessage.reactions.removeAll().catch(console.error); if (PRUNING && playingMessage && !playingMessage.deleted) { playingMessage.delete({ timeout: 3000 }).catch(console.error); } }); } };