You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord Bot实现:点击后更新已存在按钮的状态与标签

问题描述

我搭建了一个简单的Discord Bot,它会在新建的工单(Ticket)中自动发送带有按钮的Embed;当用户点击按钮后,Bot需发送确认消息,同时将该按钮设置为禁用状态并修改标签。其他相关教程均是通过前置交互发送Embed,可直接利用其属性实现,但我的场景不同,请问该如何实现?

问题排查与修正

你的代码逻辑方向正确,但interactionCreate事件中的判断条件存在逻辑错误,导致按钮交互无法正确触发后续更新操作,同时可优化部分细节:

  • 修正交互判断逻辑
    原代码中的判断条件if (!interaction.isButton() && !interaction.customId === 'tanks_button') return;逻辑错误,会导致非目标按钮的交互也进入处理流程。正确写法应为:
if (!interaction.isButton() || interaction.customId !== 'tanks_button') return;

该条件可确保只有customId为tanks_button的按钮交互才会被处理。

  • 优化确认消息(可选)
    如果希望确认消息仅让点击按钮的用户看到,可在interaction.reply中添加ephemeral: true参数,避免频道内其他用户看到重复信息。

  • 无需修改CustomId(可选)
    你将按钮的customId改为tanks_button_pressed其实没必要,因为按钮已被禁用,不会再触发交互,保持原customId也不影响功能,当然修改也没问题。

修正后的完整代码
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');

client.on('messageCreate', (message) => { // 工单创建时发送带按钮的Embed
    if (message.author.id === '149565760950239232' && message.channel.name.includes('ticket')) {     
        const tanksEmbed = new EmbedBuilder()
            .setColor(0xb054c8)
            .setTitle('获取 Tank Souls 的第一步:')
            .setDescription('点击下方按钮提交你的订单。')
            .setFooter({ text: '如有问题请联系 Aldoraz#0001' });
       
        const tanksButton = new ActionRowBuilder()
            .addComponents(
                new ButtonBuilder()
                    .setCustomId('tanks_button')
                    .setLabel('提交 Tank 订单')
                    .setStyle(ButtonStyle.Success)
                    .setEmoji('🪙')
                    .setDisabled(false),
            );

        message.channel.send({
            embeds: [tanksEmbed],
            components: [tanksButton]
        });
    }
});

client.on('interactionCreate', async (interaction) => { // 按钮点击后发送确认消息并更新按钮
    // 修正后的判断逻辑
    if (!interaction.isButton() || interaction.customId !== 'tanks_button') return;
    
    console.log('按钮被点击!');
    
    // 发送仅用户可见的确认消息(可选)
    await interaction.reply({ content: '订单已提交!', ephemeral: true });

    // 创建更新后的按钮组件
    const updatedButtonRow = new ActionRowBuilder()
        .addComponents(
            new ButtonBuilder()
                .setCustomId('tanks_button') // 可保留原CustomId,也可修改
                .setLabel('订单已提交!')
                .setStyle(ButtonStyle.Success)
                .setEmoji('🪙')
                .setDisabled(true),
        );
    
    // 编辑原消息的组件,实现按钮禁用和标签修改
    await interaction.message.edit({ components: [updatedButtonRow] });
});
关键原理说明

不管Embed是通过messageCreate事件发送,还是通过交互响应发送,只要在按钮交互触发时,通过interaction.message获取到对应的消息对象,就可以调用edit()方法修改该消息的组件。这是因为Discord的消息对象(包括通过普通消息发送的带组件消息)都支持编辑操作,和发送方式无关。

内容的提问来源于stack exchange,提问作者Aldoraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:45:41