如何为机器人命令添加冷却时间,防止用户频繁发送命令刷屏
实现命令冷却机制(强制等待+剩余时长提示)
核心思路
要实现这个功能,核心是追踪每个用户的上次命令执行时间,每次收到命令时对比当前时间,判断是否仍在冷却周期内:
- 若在冷却中:计算剩余等待时长并告知用户
- 若冷却结束:执行命令并更新用户的上次执行时间
单机场景示例(Python)
适合单实例运行的机器人或服务,用内存字典存储用户的时间戳:
import time # 存储用户ID与上次执行时间的映射,确保用户唯一标识 user_last_exec = {} # 可根据需求切换为30秒 COOLDOWN_DURATION = 15 def process_user_command(user_id, command_content): current_ts = time.time() # 检查冷却状态 if user_id in user_last_exec: elapsed = current_ts - user_last_exec[user_id] if elapsed < COOLDOWN_DURATION: remaining = int(COOLDOWN_DURATION - elapsed) print(f"请等待{remaining}秒后再发送命令") return # 执行实际命令逻辑 print(f"执行用户[{user_id}]的命令:{command_content}") # 更新用户的上次执行时间 user_last_exec[user_id] = current_ts
分布式场景示例(Redis)
如果服务是多实例部署,需要用共享缓存(如Redis)存储冷却数据,避免实例间状态不一致:
import redis import time # 初始化Redis连接 redis_client = redis.Redis(host="localhost", port=6379, db=0) COOLDOWN_DURATION = 15 def process_user_command_distributed(user_id, command_content): current_ts = time.time() cache_key = f"cmd_cooldown:{user_id}" # 从Redis获取上次执行时间 last_exec_ts = redis_client.get(cache_key) if last_exec_ts: elapsed = current_ts - float(last_exec_ts) if elapsed < COOLDOWN_DURATION: remaining = int(COOLDOWN_DURATION - elapsed) print(f"请等待{remaining}秒后再发送命令") return # 执行命令 print(f"执行用户[{user_id}]的命令:{command_content}") # 存储时间戳并设置过期时间(自动清理失效数据) redis_client.setex(cache_key, COOLDOWN_DURATION, current_ts)
关键注意事项
- 用户标识唯一性:必须用用户的唯一ID(如平台UID)作为键,避免不同用户的冷却状态互相干扰
- 灵活配置冷却时间:可以针对不同命令设置不同的冷却时长,把
COOLDOWN_DURATION改为函数参数即可 - 提示语优化:剩余时长取整数,用户感知更清晰;也可以根据场景调整提示文案,比如“还剩{remaining}秒,稍后再试”
内容的提问来源于stack exchange,提问作者Ace
相关产品推荐
相关产品推荐

