【问题标题】:Different cooldown length for different parts of a command命令不同部分的冷却时间不同
【发布时间】:2022-08-02 19:53:33
【问题描述】:
我有一个名为“work”的命令。该命令有 3 个部分,列出、应用和常规工作。当用户运行 -work list 时,将列出可用的作业,我不希望这部分有任何冷却时间。 -work apply 改变用户的工作,而 -work 只是生成随机数。所以,我希望当用户运行 -work apply 并改变他们的工作时,必须应用 1 天的冷却时间。当用户刚刚通过 - 工作时,我想要一个 1 小时的冷却时间。我想到命令的不同部分会返回不同的字符串,例如 work_apply 和 work_work,并使用该信息来应用不同的冷却时间。但这是不可能的,因为我不能在没有命令输出的情况下应用任何冷却,并且要获得一些输出,我必须运行命令。所以我不能在不运行它的情况下应用任何冷却。
标签:
discord.js
rate-limiting
【解决方案1】:
我真的不知道你的命令处理程序是如何工作的,所以我会给你一个想法。
您可以尝试制作地图并推送消息作者以及他们运行命令的时间。一旦你这样做了,下次同一个人在时间限制内运行代码时,设置它以便命令处理程序在地图中查找成员,如果他们找到它,他们检查他们上次运行命令的时间以及它是否在时间限制下,它返回函数
再次我不知道你的命令处理程序是如何工作的,但我是这样做的
PS。如果您的整个命令在 1 个文件中,那么我将显示的代码将不起作用。您应该尝试编辑代码的某些部分以使其符合您的喜好
// command handler file
const cooldowns = new Map();
let name = command.name;
if (!cooldowns.has(name)) {
cooldowns.set(name, new Discord.Collection());
}
if (!message.member.roles.cache.has('ROLE_ID')) { // role that bypass cooldown
const current_time = Date.now();
const time_stamps = cooldowns.get(name);
const cooldown_amount = (command.cooldown) * 1000;
if (time_stamps.has(message.author.id)) {
const expiration_time = time_stamps.get(message.author.id) + cooldown_amount;
if (current_time < expiration_time) {
message.reply({
content: `Please wait until the cooldown has ended`
});
return;
}
}
time_stamps.set(message.author.id, current_time);
setTimeout(() => time_stamps.delete(message.author.id), cooldown_amount);
}
// command file
module.exports = {
name: 'commandname',
cooldown: 15 // this has to be in seconds | you can type '0' if there r no cooldowns
async execute(YOUR PARAMETERS) {
// command code
}
}