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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:15:07