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

Discord.js 如何设置机器人对指定消息仅回复一次不重复响应

Discord.js 触发规则仅单次响应实现方法

核心逻辑是新增状态标记记录触发规则是否已经执行过,执行过就直接跳过响应逻辑。注意状态标记必须声明在消息事件监听函数的外部,如果写在监听回调内部,每次收到新消息都会重置标记,无法实现拦截效果。


场景1:全局仅触发一次

所有用户里只要有一个人发「1」触发了回复,后续所有人再发「1」都不会响应,代码实现如下:

// 初始化标记,false代表还未触发过回复
let hasReplied = false;

// 消息事件监听
client.on('messageCreate', message => {
  // 已经回复过直接终止逻辑
  if (hasReplied) return;

  if (message.content === '1') {
    message.channel.send('2');
    // 回复完成后更新标记,拦截后续所有触发
    hasReplied = true;
  }
})

场景2:单用户仅触发一次

每个用户发「1」都能收到一次回复,同一个用户重复发送「1」不会重复响应,不同用户的触发状态互不影响,用Set存储已回复用户ID即可实现:

// 初始化集合,存储已经收到过回复的用户ID
const repliedUserSet = new Set();

client.on('messageCreate', message => {
  // 当前用户已经触发过回复,直接终止逻辑
  if (repliedUserSet.has(message.author.id)) return;

  if (message.content === '1') {
    message.channel.send('2');
    // 回复完成后将当前用户ID加入集合,拦截该用户后续触发
    repliedUserSet.add(message.author.id);
  }
})

注意:以上两种实现的状态都存储在运行内存中,机器人重启后状态会清空,触发次数会重置。如果需要重启后依然保留触发状态,可以将标记值、已回复用户ID持久化存储到本地文件或数据库中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:54:22