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
相关产品推荐
相关产品推荐

