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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:11