基于Twitch/Node/TMI的单用户独立命令冷却系统实现方法
解决方案
你当前的冷却逻辑使用全局布尔变量block做限制,所以触发后会全局生效。只需要将全局冷却标记替换为按用户维度存储的冷却状态即可实现独立冷却,推荐使用Set或Map结构实现,以下是可直接复用的调整方案:
调整后完整代码
// 全局声明:存储处于冷却状态的用户名,替换原有的全局block变量 const userCooldowns = new Set(); if(message == '!joinqueue') { // 仅检查当前触发命令的用户是否处于冷却中 if(!userCooldowns.has(user.username)) { client.say(channel, `@${user.username}, Joined The Queue!`); queue.push(user.username); console.log(queue); // 将当前用户加入冷却名单 userCooldowns.add(user.username); // 10分钟后自动解除该用户的冷却限制 setTimeout(() => { userCooldowns.delete(user.username); }, 10 * 60 * 1000) // 等价于600000毫秒,写法更易读 } else { client.say(channel, `@${user.username} Please Wait Before Doing This Command Again`) } }
改动说明
- 用
userCooldowns集合替换原有的全局block变量,以用户名作为唯一标识记录冷却状态 - 命令触发时仅校验当前操作用户的冷却状态,不同用户之间互不影响
- 冷却到期后仅删除对应用户的冷却标记,其余用户仍可正常调用命令
可选优化建议
- 如果需要给多个命令配置不同的冷却规则,可以将冷却逻辑封装为通用工具函数,传入命令标识、用户名、冷却时长即可复用
- 若需要Bot重启后冷却规则仍然生效,可以将冷却记录存储到本地JSON文件或Redis等持久化存储中
内容的提问来源于stack exchange,提问作者Zoren Singh
相关产品推荐
相关产品推荐

