如何使用discord.py实现用户独立的每小时限用一次的命令
Discord Bot 用户独立冷却实现方案
核心逻辑
你需要的用户级独立冷却本质是按命令+用户ID两个维度单独维护调用时间记录,逻辑完全不复杂:
- 以
命令标识:用户ID作为唯一键,存储用户最后一次成功调用该命令的时间戳 - 每次用户调用命令时计算当前时间与存储时间的差值,差值大于设定冷却时长则放行执行,同时更新时间戳,否则返回冷却提示
- 可选优化:定期清理已过期的冷却记录,避免内存占用持续升高
主流开发库现成实现(无需手动造轮子)
目前绝大多数Discord Bot开发框架都内置了用户级冷却的配置项,直接调用即可:
Python(discord.py)
使用@commands.cooldown装饰器,第三个参数指定commands.BucketType.user即可开启用户独立冷却,示例如下:
from discord.ext import commands # 示例:给打工命令设置30秒/次的用户独立冷却 @bot.command() @commands.cooldown(1, 30, commands.BucketType.user) async def work(ctx): # 你的经济系统命令逻辑 await ctx.send("你完成了兼职工作,获得15金币") # 自定义冷却触发时的提示 @work.error async def work_error(ctx, error): if isinstance(error, commands.CommandOnCooldown): await ctx.send(f"你刚完成工作,还需要等{round(error.retry_after)}秒才能再次打工")
JavaScript/TypeScript(discord.js v14+)
注册命令时直接配置cooldowns字段,指定作用域为user即可:
const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('work') .setDescription('打工赚取金币'), cooldowns: { type: 'user', // 冷却作用域为单个用户 duration: 30 // 冷却时长30秒 }, async execute(interaction) { // 你的经济系统命令逻辑 await interaction.reply('你完成了兼职工作,获得15金币'); }, };
冷却触发的自定义提示可在全局命令错误处理逻辑中捕获对应事件返回即可。
自定义实现方案(适用小众框架/自研框架)
如果用的框架没有内置冷却功能,自己实现也非常简单,伪代码逻辑如下:
# 冷却存储:key为 命令名:用户ID,value为最后调用时间戳 # 单机部署直接用内存字典/Map,分布式部署换成Redis即可 cooldown_storage = {} # 对应命令的冷却时长,单位秒 COMMAND_COOLDOWN = 30 function on_command_trigger(command_name, user_id): cache_key = `${command_name}:${user_id}` current_timestamp = get_current_unix_timestamp() # 无记录或冷却已过期则放行 if cache_key not in cooldown_storage or current_timestamp - cooldown_storage[cache_key] > COMMAND_COOLDOWN: cooldown_storage[cache_key] = current_timestamp run_command_logic() else: remaining_seconds = COMMAND_COOLDOWN - (current_timestamp - cooldown_storage[cache_key]) return_response(f"命令冷却中,剩余{remaining_seconds}秒可再次使用")
内容的提问来源于stack exchange,提问作者DBC
相关产品推荐
相关产品推荐

