如何在discord.js中为单个命令添加冷却机制?
在Discord.js中为单个命令添加冷却功能
核心思路
用Map存储用户ID与对应冷却结束时间戳,每次执行/buy命令时先检查用户是否处于冷却状态:如果是则返回提示,否则执行命令逻辑并设置冷却。
代码实现
1. 定义冷却存储与时长
在你的buy命令文件顶层作用域(不要放在execute函数内)添加:
// 存储用户冷却数据:键为用户ID,值为冷却结束时间戳 const buyCooldowns = new Map(); // 冷却时长:5分钟(转换为毫秒) const COOLDOWN_DURATION = 5 * 60 * 1000;
2. 命令内的冷却检查与执行逻辑
在execute函数最开头插入冷却校验,再编写业务逻辑:
const { SlashCommandBuilder } = require('discord.js'); module.exports = { data: new SlashCommandBuilder() .setName('buy') .setDescription('购买指定数量的物品') .addIntegerOption(option => option.setName('count') .setDescription('购买数量') .setRequired(true)), async execute(interaction) { const userId = interaction.user.id; // 检查冷却状态 if (buyCooldowns.has(userId)) { const cooldownEndTime = buyCooldowns.get(userId); if (Date.now() < cooldownEndTime) { const remainingSeconds = Math.ceil((cooldownEndTime - Date.now()) / 1000); await interaction.reply({ content: `抱歉,你需要等待${remainingSeconds}秒才能再次执行此命令`, ephemeral: true // 仅当前用户可见,可选 }); return; // 终止命令执行,不进入业务逻辑 } } // 执行购买业务逻辑 const count = interaction.options.getInteger('count'); // 这里替换成你的实际购买逻辑:比如扣除货币、添加物品到用户背包等 await interaction.reply(`已成功购买${count}个物品!`); // 设置用户冷却 buyCooldowns.set(userId, Date.now() + COOLDOWN_DURATION); }, };
语法与代码位置说明
buyCooldowns必须定义在命令模块的顶层:如果放在execute函数内,每次执行命令都会重新创建Map,冷却规则会失效。- 冷却检查逻辑要放在业务代码最前面:提前终止无效请求,避免不必要的资源消耗。
ephemeral: true是可选配置:开启后冷却提示仅用户自己可见,适合减少频道刷屏。- 修改
COOLDOWN_DURATION可调整冷却时长:单位为毫秒,比如1分钟就是60 * 1000。
内容的提问来源于stack exchange,提问作者Hehehehaw
相关产品推荐
相关产品推荐

