如何在discord.py中重置斜杠命令的冷却时间?
解决discord.py斜杠命令条件跳过冷却的问题
要实现当代码中i == 1时不触发冷却限制,你需要手动管理冷却缓存——因为默认的冷却装饰器是在命令执行前检查的,无法直接根据命令内的条件跳过。以下是两种可行方案:
方案一:手动创建冷却映射(推荐)
先单独定义冷却规则和映射实例,方便在命令内直接操作缓存:
from discord import app_commands # 定义冷却规则:15秒内可执行1次,按「服务器ID+用户ID」维度限制 cooldown_rule = app_commands.Cooldown(1, 15, key=lambda i: (i.guild_id, i.user.id)) # 基于规则创建冷却映射,用于存储用户的冷却记录 cooldown_map = app_commands.CooldownMapping.from_cooldown(cooldown_rule) @client.tree.command(name="my_command") # 使用动态冷却装饰器关联自定义的冷却映射 @app_commands.checks.dynamic_cooldown(cooldown_map, key=lambda i: (i.guild_id, i.user.id)) async def my_command(interaction: discord.Interaction): i = 1 if i == 1: # 计算当前用户的冷却键值,移除缓存中的记录 user_key = cooldown_rule.key(interaction) cooldown_map._cache.pop(user_key, None) await interaction.response.send_message("Cooldown shouldn't apply") else: await interaction.response.send_message("Cooldown should apply ")
方案二:从命令检查器中获取冷却映射
如果不想单独定义冷却实例,可以直接从命令的checks列表中找到冷却器并操作缓存:
from discord import app_commands @client.tree.command(name="my_command") @app_commands.checks.cooldown(1, 15, key=lambda i: (i.guild_id, i.user.id)) async def my_command(interaction: discord.Interaction): i = 1 if i == 1: # 遍历命令的检查器,找到冷却规则实例 for check in my_command.checks: if isinstance(check, app_commands.Cooldown): # 移除当前用户的冷却记录 user_key = check.key(interaction) check._mapping._cache.pop(user_key, None) break await interaction.response.send_message("Cooldown shouldn't apply") else: await interaction.response.send_message("Cooldown should apply ")
说明
- 两种方案的核心逻辑一致:当满足
i == 1的条件时,删除当前用户在冷却缓存中的记录,这样后续执行命令时不会触发冷却限制。 _cache是discord.py内部的私有属性,当前版本可用,但如果库更新可能会有变动,优先推荐方案一。
内容的提问来源于stack exchange,提问作者bbc3
相关产品推荐
相关产品推荐

