命令内确认按钮与button handler冲突的解决方法咨询
解决Discord按钮收集器与全局按钮处理器冲突的问题
你的核心问题是全局按钮处理器会优先捕获所有按钮交互,当遇到未在client.buttons中注册的临时按钮(如channel_confirm、channel_cancelar)时,直接返回错误响应,导致消息组件收集器无法正常捕获交互事件。以下是三种可行的解决办法:
方案1:让全局处理器跳过临时收集器的按钮
修改全局按钮处理器代码,在检查按钮是否存在前,先过滤掉收集器使用的临时按钮ID,让这些交互能被收集器正常捕获:
if (interaction.isButton()) { const { buttons } = client; const { customId } = interaction; // 定义临时收集器使用的按钮ID列表 const tempButtonIds = ["channel_confirm", "channel_cancelar"]; // 如果是临时按钮,直接返回不处理,交给收集器 if (tempButtonIds.includes(customId)) return; const button = buttons.get(customId); if (!button) return interaction.reply({ content: `Esse botão ainda não possui nenhuma função.`, ephemeral: true, }); try { await button.execute(client, interaction); } catch (err) { console.error(err); } }
方案2:将临时按钮逻辑移到全局处理器中
如果不需要临时收集器,也可以把按钮的处理逻辑注册到全局按钮集合里,让处理器直接接管:
第一步:注册临时按钮
在你的按钮注册文件中添加以下代码:
// 注册确认按钮逻辑 client.buttons.set("channel_confirm", { async execute(client, interaction) { await interaction.update({ content: `Mensagem enviada!`, components: [], embeds: [], }); } }); // 注册取消按钮逻辑 client.buttons.set("channel_cancelar", { async execute(client, interaction) { await interaction.update({ content: `Ação cancelada.`, components: [], embeds: [], }); } });
第二步:移除命令中的收集器代码
删除原命令里的收集器相关逻辑,按钮交互会直接由全局处理器处理。
方案3:临时应急方案(不推荐)
如果暂时无法修改全局处理器,可以在收集器的过滤函数中先对交互做延迟响应,避免全局处理器返回错误:
const collector = async (i) => { if (i.user.id !== interaction.user.id) return false; // 先延迟更新,抢占交互处理权 await i.deferUpdate(); return true; };
注意:这种方法可能引发重复响应的问题,仅作为临时应急使用,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Amees
相关产品推荐
相关产品推荐

