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

如何用Python为Discord不同角色设置差异化的命令冷却时间

结论

完全可以实现,核心逻辑是在命令执行前的校验阶段,根据用户所持有的角色匹配对应的冷却规则,再决定是否跳过冷却校验。

实现方案(以Python的discord.py框架为例,其他框架逻辑通用)

核心思路

  • 提前定义角色ID与对应冷却时长的映射规则,比如premium角色对应0秒(无冷却)、bronze角色对应10秒
  • 命令触发时先拉取触发用户的所有角色ID,匹配最高优先级的冷却规则
  • 若匹配到无冷却规则,直接跳过冷却校验执行命令;否则执行常规的冷却时间差校验

示例代码

1. 提前配置基础映射

# 替换为你服务器内的实际角色ID,冷却时间单位为秒,0代表无冷却
ROLE_COOLDOWN_CONFIG = {
    987654321098765432: 0,  # premium 角色ID
    987654321098765433: 10  # bronze 角色ID
}
# 存储用户上次执行命令的时间戳,生产环境建议替换为Redis等持久化存储
user_command_timestamp = {}

2. 命令逻辑实现

@bot.command(name="sample_cmd")
async def sample_command(ctx):
    # 获取当前用户所有角色ID
    user_role_ids = [role.id for role in ctx.author.roles]
    # 匹配用户对应的冷却时间(优先级按配置顺序,premium在前优先匹配无冷却)
    user_cooldown = 0
    for role_id, cd in ROLE_COOLDOWN_CONFIG.items():
        if role_id in user_role_ids:
            user_cooldown = cd
            break

    # 无冷却用户直接执行命令
    if user_cooldown == 0:
        # 此处替换为实际命令业务逻辑
        await ctx.send("命令执行成功(Premium用户无冷却限制)")
        return

    # 有冷却用户执行时间校验
    current_time = ctx.message.created_at.timestamp()
    last_exec_time = user_command_timestamp.get(ctx.author.id, 0)
    time_diff = current_time - last_exec_time

    if time_diff < user_cooldown:
        remaining = round(user_cooldown - time_diff, 1)
        await ctx.send(f"命令冷却中,请 {remaining} 秒后再尝试")
        return

    # 冷却校验通过,更新时间戳后执行命令
    user_command_timestamp[ctx.author.id] = current_time
    # 此处替换为实际命令业务逻辑
    await ctx.send("命令执行成功")

注意事项

  • 需将示例中的角色ID替换为你服务器内的实际角色ID
  • 若用户同时持有多个匹配冷却规则的角色,可自行调整优先级逻辑,比如默认取冷却时间最短的规则
  • 生产环境建议将冷却时间戳存储到Redis等持久化数据库中,避免Bot重启后冷却数据全部丢失
  • 若使用其他Discord开发框架(如discord.js、JDA),核心逻辑完全通用,仅需调整对应框架的角色获取、时间处理语法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 09:27:02