Soy un aficionado y tengo esta configuración de bot de música, pero no estoy seguro de cómo implementar una función de cola que agregue videos en una matriz para que se reproduzcan después de que termine una canción. ¿Tengo que reformatear el código para que haya una función de cola antes de todo o hay una solución simple?
A continuación se muestra mi código,
module.exports = { name: 'play', description: 'Joins and plays video from youtube', async execute(message, args) { const voiceChannel = message.member.voice.channel; if(!voiceChannel) return message.channel.send('Join a channel to play a song'); const permissions = voiceChannel.permissionsFor(message.client.user); if(!permissions.has('CONNECT')) return message.channel.send('You dont have permission to use this function'); if(!permissions.has('SPEAK')) return message.channel.send('You dont have permission to use this function'); if(!args.length) return message.channel.send('You need to send a second argument'); //Set up play function for link const validURL = (str) =>{ var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/; if(!regex.test(str)){ return false; } else { return true; } } if(validURL(args[0])){ const connection = await voiceChannel.join(); const stream = ytdl(args[0], {filter: 'audioonly'}); connection.play(stream, {seek: 0, volume: 1}) .on('finish', () =>{ voiceChannel.leave(); message.channel.send('Leaving Channel!'); }); await message.reply('Now Playing Link') return } //Set up play function for youtube search w/ keywords const connection = await voiceChannel.join(); const videoFinder = async (query) => { const videoResult = await ytSearch(query); return (videoResult.videos.length > 1)? videoResult.videos[0] : null; } const video = await videoFinder(args.join(' ')); if(video){ const stream = ytdl(video.url, {filter: 'audioonly'}); connection.play(stream, {seek: 0, volume: 1}) .on('finish', () =>{ voiceChannel.leave(); }); await message.reply(`Now Playing ***${video.title}*** ${video.duration}*** ${video.thumbnail}`) } else { message.channel.send('No video results found.'); } } }module.exports = { name: 'play', description: 'Joins and plays video from youtube', queues: {}, voiceConnections: {}, execute() { if (!this.voiceConnections[guildId]) { // setup voiceConnections[guildId] this.voiceConnections[guildId].on('finish', () => { this.voiceConnections[guildId].play(this.queues[guildId].pop()) } } if (track already playing in voice connection) { this.queues[guildId].push(newTrackDetails); } else { // play the track } } }Algo de pseudocódigo. Idea: cada gremio tiene su propia cola y conexión de canal de voz. El formato del objeto de la cola se parece a {'guildId1': [... la cola sigue los detalles aquí]}