【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
相关产品推荐
相关产品推荐

