discord.py中如何设置条件冷却,避免指定子命令触发冷却?
Discord.py 命令条件冷却实现方案
实现思路
默认的@commands.cooldown装饰器会对该命令的所有调用生效,无法区分不同参数场景,因此需要手动控制冷却校验逻辑,仅在执行实际工作操作时触发冷却校验。
具体实现代码
1. 导入依赖
from discord.ext import commands from discord.ext.commands import Cooldown, CooldownMapping
2. 初始化冷却映射
# 配置规则:单用户每3600秒(1小时)可调用1次工作功能 work_cooldown = CooldownMapping(Cooldown(1, 3600, commands.BucketType.user))
3. 重写work命令逻辑
@bot.command(name='work') async def work(ctx, arg = None): # 调用!work list时直接返回内容,不触发冷却 if arg == 'list': # 此处填写你原有的工作列表展示逻辑 await ctx.send("工作列表:\n1. 餐厅服务员 奖励:80-120金币\n2. 快递员 奖励:70-150金币") return # 非查询类请求,执行冷却校验 bucket = work_cooldown.get_bucket(ctx.message) remaining_cd = bucket.update_rate_limit() if remaining_cd: # 冷却未结束时的提示逻辑,可自行调整格式 await ctx.send(f"你刚完成工作不久,还需要休息{round(remaining_cd/60)}分钟才能再次工作") return # 冷却校验通过,执行正常工作逻辑 # 此处填写你原有的工作执行、奖励发放逻辑 await ctx.send("你完成了餐厅服务员的工作,获得了100金币")
说明
- 该方案完全复用discord.py原生的冷却能力,不需要自行维护用户冷却时间的存储逻辑
- 你可以根据业务需要扩展更多免冷却的参数场景,只需要在冷却校验前增加对应的判断分支即可
内容的提问来源于stack exchange,提问作者Omkaar
相关产品推荐
相关产品推荐

