0
votes

I wanted to make a pageable queue command so I can control the entire queue with reactions. However, I keep getting an error whenever I run the command. So I want the bot to delete the queue embed message whenever the message author reacts to the "⏹" reactions. Here is my code:

const { MessageEmbed } = require("discord.js");

module.exports = {
  name: "queue",
  aliases: ["q"],
  description: "Show the music queue and now playing.",
  async execute(message) {
       const serverQueue = message.client.queue.get(message.guild.id);
        if (!serverQueue) return message.channel.send('❌ **Nothing playing in this server**');
      try {
        let currentPage = 0;
        const embeds = generateQueueEmbed(message, serverQueue.songs);
        const queueEmbed = await message.channel.send(`**Current Page - ${currentPage + 1}/${embeds.length}**`, embeds[currentPage]);
        await queueEmbed.react('⬅️');
        await queueEmbed.react('⏹');
        await queueEmbed.react('➡️');

        const filter = (reaction, user) => ['⬅️', '⏹', '➡️'].includes(reaction.emoji.name) && (message.author.id === user.id);
        const collector = queueEmbed.createReactionCollector(filter);
        
        collector.on('collect', async (reaction, user) => {
          try {
            if (reaction.emoji.name === '➡️') {
                if (currentPage < embeds.length - 1) {
                    currentPage++;
                    queueEmbed.edit(`**Current Page - ${currentPage + 1}/${embeds.length}**`, embeds[currentPage]);
                } 
            } else if (reaction.emoji.name === '⬅️') {
                if (currentPage !== 0) {
                    --currentPage;
                    queueEmbed.edit(`**Current Page - ${currentPage + 1}/${embeds.length}**`, embeds[currentPage]);
                }
            } else {
                collector.stop();
                reaction.message.reactions.removeAll();
                queueEmbed.delete();
            }
            await reaction.users.remove(message.author.id);
          } catch {
            console.log();
            return message.channel.send("An error occured");
          }
        });
      } catch {
        console.log();
          return message.channel.send("An error occured");
      }
    }
};

function generateQueueEmbed(message, queue) {
    const embeds = [];
    let k = 10;
    for (let i = 0; i< queue.length; i += 10) {
        const current = queue.slice(i, k);
        let j = i;
        k += 10;
        const info = current.map(track => `${++j} - [${track.title}](${track.url})`).join('\n');
        const embed = new MessageEmbed()
            .setTitle('Song Queue\n')
            .setThumbnail(message.guild.iconURL())
            .setColor("#F8AA2A")
            .setDescription(`**Current Song - [${queue[0].title}](${queue[0].url})**\n\n${info}`)
            .setTimestamp();
        embeds.push(embed);
    }
    return embeds;
}

However, even after the bot deletes it on reacting to the stop reaction. I get a message from the bot saying An error occurred. I'm unable to understand why and I couldn't understand how to resolve it. Can you help me out? Thanks in Advance!

1

1 Answers

0
votes

The error is because you try to remove the reaction placed on the embed after deleting it. So you need to move the queueEmbed.delete() to be after reaction.users.remove(message.author.id). Or just exit after queueEmbed.delete().