用于浏览嵌入消息页面的 Discord.js v14 按钮不起作用

问题描述 投票:0回答:1

我正在尝试弄清楚如何使按钮在嵌入消息中工作以使用文件中的地址浏览页面。我能够发布带有地址的嵌入消息并登陆第一页,但之后我无法浏览页面,因为按钮根本不起作用,首先我只是尝试了一些简单的东西(到至少向前移动一页,因为我现在有 300 页),但即使这样我也无法完成工作。

代码:

        let page = 1; // start on the first page

        const totalPages = chunks.length;

        const row = new ActionRowBuilder()
        .addComponents(
                new ButtonBuilder()
                    .setCustomId('backwards')
                    .setEmoji('◀️')
                    .setStyle(ButtonStyle.Secondary),
                new ButtonBuilder()
                    .setCustomId('forward')
                    .setEmoji('▶️')
                    .setStyle(ButtonStyle.Success)
        );
        
        const embedMessage = async (page) => {
          const walletsEmbed = new EmbedBuilder()
            .setColor('#8AC7DB')
            .setAuthor({
              name: bot.username,
              iconURL: bot.displayAvatarURL({ dynamic: true })
            })
            .setTimestamp()
            .setTitle(`👛 Wallet LIST - Page ${page}/${totalPages}`)
            .setDescription(`${chunks[page - 1].join('\n')}`);
            const reply = await interaction.reply({ embeds: [walletsEmbed], components: [row], ephemeral: true  });
            return reply;
        }
    
        const filter = i => (i.customId === 'forward' || i.customId === 'backwards') && i.user.id === interaction.user.id;

        const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });

        let message = await embedMessage(page);

        collector.on('collect', async i => {
            if (i.customId === 'forward') {
                console.log('Button was clicked!')
                await i.deferUpdate();
                page = (page % totalPages) + 1; // wrap around if exceeding last page
                await message.editReply({ embeds: [await embedMessage(page)], components: [row] });
            }
        }); 
      },
    };

通常会发生的错误(有时当我尝试某些操作时按钮什么都不做)

错误

    if (this.deferred || this.replied) throw new DiscordjsError(ErrorCodes.InteractionAlreadyReplied);

                                             ^

Error [InteractionAlreadyReplied]: The reply to this interaction has already been sent or deferred.

还有一个问题是,是否有可能让它在 slashcommand 交互中像那样工作?据我所知,我无法通过按下按钮来编辑嵌入消息。

javascript node.js button discord.js embed
1个回答
1
投票

我找到了解决问题的方法。正如 Elitezen 在评论中提到的,嵌入消息功能每次都调用回复,这就是问题所在。

修复了下面带有后退按钮的代码。

代码:

        let page = 1; // start on the first page
        const totalPages = chunks.length;

        const row = new ActionRowBuilder()
        .addComponents(
                new ButtonBuilder()
                    .setCustomId('backwards')
                    .setEmoji('◀️')
                    .setStyle(ButtonStyle.Secondary),
                new ButtonBuilder()
                    .setCustomId('forward')
                    .setEmoji('▶️')
                    .setStyle(ButtonStyle.Success)
        );
        
        const embedMessage = async (page) => {
          const walletsEmbed = new EmbedBuilder()
            .setColor('#8AC7DB')
            .setAuthor({
              name: bot.username,
              iconURL: bot.displayAvatarURL({ dynamic: true })
            })
            .setTimestamp()
            .setTitle(`👛 Wallet LIST - Page ${page}/${totalPages}`)
            .setDescription(`${chunks[page - 1].join('\n')}`);
            return walletsEmbed;
        }
        row.components[0].setDisabled(true);
        if (page === totalPages) {
            row.components[1].setDisabled(true);
        }
        await interaction.reply({ embeds: [await embedMessage(page)], components: [row], ephemeral: true  });

        const filter = i => (i.customId === 'forward' || i.customId === 'backwards') && i.user.id === interaction.user.id;

        const collector = interaction.channel.createMessageComponentCollector({ filter, time: 30000 });

        collector.on('collect', async i => {
            try {
            if (i.customId === 'forward') {
                // page = (page % totalPages) + 1; // wrap around if exceeding last page
                page++; // should move 1 page
                console.log('Next pressed! Moving to page:', page)
                if (page === 1) {
                    row.components[0].setDisabled(true);
                    row.components[1].setDisabled(false);
                } else if (page === totalPages) {
                    row.components[0].setDisabled(false);
                    row.components[1].setDisabled(true);
                } else {
                    row.components[0].setDisabled(false);
                    row.components[1].setDisabled(false);
                }
                await i.deferUpdate();
                await interaction.editReply({ embeds: [await embedMessage(page)], components: [row] });
         }  if (i.customId === 'backwards') {
                page--;
                console.log('Back prassed! Moving to page:', page)
                if (page === 1) {
                    row.components[0].setDisabled(true);
                    row.components[1].setDisabled(false);
                } else if (page === totalPages) {
                    row.components[0].setDisabled(false);
                    row.components[1].setDisabled(true);
                } else {
                    row.components[0].setDisabled(false);
                    row.components[1].setDisabled(false);
                }
                await i.deferUpdate();
                await interaction.editReply({ embeds: [await embedMessage(page)], components: [row] });
            }
            } catch (error) {
            console.error(error);
          }
        }); 
      },
    };

希望这对任何人都有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.