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

【discord.py 2.0】能否在其他函数中调用命令时手动触发其冷却机制?

如何在调用另一个命令时手动触发其冷却机制

当然可以手动触发目标命令的冷却机制!discord.py的冷却系统是通过commands.CooldownMapping来跟踪用户的命令使用记录的,我们可以直接操作这个映射来手动给指定用户添加冷却状态。

具体实现步骤

以你提供的代码为例,我们可以在command2中手动触发command1的冷却,不管你是直接调用command1(ctx)还是用ctx.invoke(),都可以用下面的方法:

import discord
from discord.ext import commands

@bot.command()
@commands.cooldown(2, 3600*3, commands.BucketType.member)
async def command1(ctx):
    await ctx.send("执行command1的逻辑")

@bot.command()
async def command2(ctx):
    # 第一步:获取目标命令对象
    target_cmd = bot.get_command("command1")
    if not target_cmd:
        await ctx.send("找不到目标命令")
        return
    
    # 第二步:获取该命令的冷却映射实例
    cooldown_map = target_cmd._buckets
    # 第三步:根据当前上下文获取对应用户的冷却桶
    bucket = cooldown_map.get_bucket(ctx.message)
    
    # 第四步:手动触发冷却——更新冷却桶的最后使用时间
    # 使用UTC时间戳,避免时区偏差
    current_timestamp = discord.utils.utcnow().timestamp()
    bucket.update_rate_limit(current_timestamp)
    
    # 现在可以正常调用command1了,冷却机制已经生效
    await command1(ctx)
    # 或者用 await ctx.invoke(target_cmd)

关键代码解释

  • target_cmd._buckets:每个带冷却装饰器的命令都会有这个属性,它是CooldownMapping的实例,负责按照你设置的BucketType(这里是member,即按用户区分)管理冷却状态。
  • get_bucket(ctx.message):根据消息上下文,获取当前用户对应的冷却桶(Bucket),每个用户对应一个独立的桶。
  • update_rate_limit(current_timestamp):调用这个方法会把该冷却桶的最后使用时间设置为当前时间,这样冷却系统就会认为用户刚刚使用过command1,自动开始计算冷却时长。

额外注意事项

  • 如果你的命令有别名,记得用正确的命令名称去get_command(),比如如果command1有别名cmd1,用bot.get_command("cmd1")也能拿到同一个命令对象。
  • 如果你只是想触发冷却而不执行command1的逻辑,只需要执行前面的冷却触发步骤,跳过调用命令的部分即可。
  • 一定要用UTC时间戳,discord.py内部的冷却系统也是基于UTC时间计算的,用discord.utils.utcnow()能避免时区问题导致的冷却异常。

内容的提问来源于stack exchange,提问作者S3NI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:29:08