如何制作点击后延长剩余时间的Discord按钮组件收集器
解决Discord组件收集器点击按钮延长运行时间的问题
你的问题在于,修改time变量并不会影响已经初始化的收集器——收集器在创建时就基于初始的time值启动了定时器,后续修改变量无法改变这个定时器的时长。要实现点击按钮延长剩余时间,需要调用收集器的resetTimer()方法来重启定时器。
修复后的完整代码
let time = 10; const collector = msg.createMessageComponentCollector({ time: 1000 * time }); collector.on("collect", async (btn) => { // 回应按钮交互,避免Discord提示未响应 await btn.deferUpdate(); // 创建并更新嵌入消息 const embed = new Discord.EmbedBuilder() .setColor(0xff0000) .setAuthor({ name: `${btn.user.username}`, iconURL: btn.user.displayAvatarURL({ dynamic: true }) }) .setTitle("You clicked"); await msg.edit({ embeds: [embed] }); // 重置收集器定时器,延长为10秒新时长 collector.resetTimer({ time: 1000 * 10 }); }); collector.on('end', (reason) => { row.components.forEach(bt => bt.setDisabled(true)); msg.edit({ components: [row] }); });
关键改动说明
- 调用
resetTimer():这是实现延长时间的核心操作,它会重启收集器的定时器,你可以在参数中指定新的超时时长,若不指定则使用初始化时的时间。 - 修复语法错误:
- 把
msg.edit{embeds:[embed]}改为msg.edit({ embeds: [embed] })(修正括号使用错误) - 把
iconURL:btn.user.displayAvatar({dynamic:true})改为iconURL: btn.user.displayAvatarURL({ dynamic: true })(补全闭合括号,修正方法名)
- 把
- 添加
btn.deferUpdate():必须回应按钮交互,否则Discord会向用户提示按钮未响应,这是Discord交互机制的强制要求。
额外扩展
如果想实现“每次点击在当前剩余时间基础上增加10秒”(而非直接重置为10秒),可以手动计算剩余时间:
// 在collect事件内替换resetTimer的调用 const remainingTime = collector._timeout - Date.now(); collector.resetTimer({ time: remainingTime + 10000 }); // 追加10秒
内容的提问来源于stack exchange,提问作者Paddycrack
相关产品推荐
相关产品推荐

