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

如何制作点击后延长剩余时间的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:44:17