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

Discord.js 为Embed状态命令添加5分钟调用冷却的实现方法

单用户5分钟命令冷却实现方法

核心逻辑是用Map结构存储每个用户最后一次成功调用命令的时间戳,每次命令触发时先校验时间差,未过冷却期直接返回提示,过了冷却才执行正常逻辑并更新时间戳。

具体修改步骤

  • 在命令文件的全局变量区域,新增冷却存储对象和冷却时长常量
  • 在run方法最开头加入冷却校验逻辑:先获取触发命令的用户ID,查询该用户的上次调用记录,若仍在冷却期直接返回提示
  • 校验通过后,先记录当前用户的调用时间,再执行原有的服务器状态查询回复逻辑

修改后的完整可运行代码

const Discord = require("discord.js");
const yaml = require("js-yaml");
const fs = require("fs"); // 补全原代码缺失的fs引入,否则读取配置会直接报错

const supportbot = yaml.load(
  fs.readFileSync("./Configs/supportbot.yml", "utf8")
);
const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8"));

const Command = require("../Structures/Command.js");
const Gamedig = require('gamedig');

let state = null;
let players = 0;
// 新增冷却配置
const cooldowns = new Map();
const COOLDOWN_TIME = 5 * 60 * 1000; // 5分钟换算为毫秒值

setInterval(() => {
  Gamedig.query({
    type: 'minecraft',
    host: 'mc.latinplay.net',
    port: '25565'
  })
  .then((updatedState) => {
    state = updatedState;
    players = state.players.length;
}).catch((error) => {
    console.log("Server is offline");
    players = 0;
});
}, 6000);

module.exports = new Command({
  name: cmdconfig.EstadoCommand,
  description: cmdconfig.EstadoCommandDesc,

  async run(interaction) {
    // 冷却校验逻辑
    const userId = interaction.user.id;
    const now = Date.now();

    if (cooldowns.has(userId)) {
      const lastUsed = cooldowns.get(userId);
      const timePassed = now - lastUsed;
      if (timePassed < COOLDOWN_TIME) {
        // 冷却期内返回提示,ephemeral设置为true让提示仅触发用户可见,避免额外刷屏
        return interaction.reply({
          content: "你还需要等待5分钟才能使用此命令",
          ephemeral: true
        });
      }
    }

    // 校验通过,更新用户最后调用时间
    cooldowns.set(userId, now);

    // 原有命令逻辑
    const LatinEstado = new Discord.MessageEmbed() 
    .setColor('RANDOM') 
      .setTitle('𝐋𝐚𝐭𝐢𝐧𝐏𝐥𝐚𝐲 𝐍𝐞𝐭𝐰𝐨𝐫𝐤 **Estado del Servidor**')
      .setURL("https://store.latinplay.net/")
      .addField('**Jugadores en linea:**', `${players || "0"}`) 
      .addField('**Estado Actual:**', "**En Linea💚**", true)
      .setThumbnail('https://media0.giphy.com/media/5RQ6coK6GVXGfPPq69/giphy.gif?cid=790b76115867f0dba05d9cf2aceb80efed5b0e494387e3b2&rid=giphy.gif&ct=g')
      .setFooter({ text: 'LatinBot | Version 1.0 ', iconURL: 'https://cdn.discordapp.com/attachments/953043417234026547/988805760458821642/Diseno_sin_titulo.png' });
      interaction.reply({
        embeds: [LatinEstado],
      });
    }
  },
);

补充说明

  • 冷却提示加了ephemeral: true配置,仅触发命令的用户可见,不会额外占用公屏空间
  • 补全了原代码缺失的fs模块引入、players变量初始值定义,修复了原代码潜在的运行报错问题
  • 冷却记录存在内存中,机器人重启后会自动清空,不需要额外写逻辑清理过期数据,足够小型Discord服务器使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:06:11