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

