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
相关产品推荐
相关产品推荐

