discord.py中如何为on_message内的命令添加Cooldowns冷却无需重写代码?
解答
完全不需要重写现有命令逻辑,只需要增加几行通用冷却判断代码即可实现功能,操作步骤如下:
步骤1:全局初始化冷却配置
首先在代码顶部引入时间模块,定义冷却配置和用户使用记录存储变量:
import time # 配置每个命令的冷却时间,单位:秒,有其他命令直接新增条目即可 command_cooldowns = { "!test": 30, # 示例:"!sign": 86400, 代表签到命令24小时冷却 } # 存储每个用户使用各命令的最后时间,结构为 {用户ID: {命令名: 最后使用时间戳}} user_last_use = {}
步骤2:添加通用冷却检查函数
复制下方的通用检查函数到你的代码中,无需修改:
def is_on_cooldown(user_id: str, command: str) -> bool: # 未配置冷却的命令直接返回未冷却 if command not in command_cooldowns: return False # 无用户使用记录直接返回未冷却 if user_id not in user_last_use: user_last_use[user_id] = {} return False # 用户未使用过该命令直接返回未冷却 if command not in user_last_use[user_id]: return False # 计算距离上次使用的时间差,判断是否还在冷却期 time_passed = time.time() - user_last_use[user_id][command] return time_passed < command_cooldowns[command]
步骤3:在现有命令中插入冷却逻辑
原有命令的功能代码完全不需要修改,只需要在每个命令的判断块开头加几行冷却检查逻辑即可,以你给出的!test命令为例:
原代码:
if message.content.lower().startswith("!test"): await message.channel.send(db[str(message.author.id)])
修改后代码:
if message.content.lower().startswith("!test"): user_id = str(message.author.id) # 冷却检查 if is_on_cooldown(user_id, "!test"): # 冷却中可提示用户剩余时间,也可直接静默跳过 remaining = round(command_cooldowns["!test"] - (time.time() - user_last_use[user_id]["!test"])) await message.channel.send(f"命令冷却中,请{remaining}秒后再试") return # 冷却通过,更新该用户的命令最后使用时间 user_last_use[user_id]["!test"] = time.time() # 下方是你原来的命令逻辑,完全不用改动 await message.channel.send(db[str(message.author.id)])
其他旧命令适配方法
你所有已写好的旧命令都可以快速适配冷却:
- 在
command_cooldowns字典中新增对应命令名称和冷却时长 - 在对应命令的判断逻辑开头插入冷却检查、更新使用时间的代码即可
小提示:当前实现的冷却记录存在内存中,机器人重启后会清空,如果需要重启后冷却依然生效,把
user_last_use的数据持久化存储到你当前使用的数据库中即可,其他逻辑无需修改。
内容的提问来源于stack exchange,提问作者Nobody
相关产品推荐
相关产品推荐

