我一直在处理此命令(我有一个问题),当用户说u?hi
时,机器人会在将您放入集合之前进行回复。然后,您将超时20秒钟,并且在超时期间,如果键入u?hi
,则漫游器会回复gotta wait x seconds
。超时结束后,他们可以输入u?hi
并且周期继续进行。
但是,我遇到了一个问题。在我的代码中,完成u?hi
之后,我陷入了超时(就像我计划的那样)。但是,在超时期间,如果我输入u?hi
,而让超时时间为1秒,则机器人会说gotta wait 19 more seconds
而不是机器人说gotta wait 19 more seconds
,然后开始递减所有方式为0。这就是我的意思(屏幕截图):
这是我的代码:
const intervalSet = new Set();
bot.on("message", msg => {
let args = msg.content.substring(prefix.length).split(" ");
switch (args[0]) {
case "hi":
var interval = 20;
var intervalID;
if (intervalSet.has(msg.author.id)) {
intervalID = setInterval(() => {
interval -= 1;
if (interval !== 0 && args[0] === 'hi') {
msg.channel.send(`gotta wait ${interval} more seconds`);
}
if (interval === 0) {
clearInterval(intervalID);
msg.channel.send(`Ended`);
intervalSet.delete(msg.author.id);
}
}, 1000);
} else {
intervalSet.add(msg.author.id);
msg.channel.send("heyy");
}
}
});
我尝试移动
if (interval !== 0 && args[0] === 'hi') {
msg.channel.send(`gotta wait ${interval} more seconds`);
}
分开编写代码的其他位置并进行修改,但似乎没有任何效果。我该怎么办?
答案 0 :(得分:0)
是的,这在您的代码中是正常的。您需要做的是创建一个名为cooldown
的地图。用户ID将与时间相关联,因此您可以计算用户的冷却时间。
这是您代码的更新:
const cooldown = new Map();
bot.on("message", msg => {
let args = msg.content.substring(prefix.length).split(" ");
switch (args[0]) {
case "hi":
var interval = 20000; // use milliseconds instead of seconds
var intervalID;
if (cooldown.has(msg.author.id)) {
let cooldownTime = Date.now() - cooldown.get(msg.author.id);
let timeToWait = (interval-cooldownTime)/1000;
if(cooldownTime < interval) {
return message.channel.send(`gotta wait ${timeToWait} more seconds`);
}
}
cooldown.set(msg.author.id, Date.now());
msg.channel.send("heyy");
}
});
如有任何疑问,请随时发表评论!