javascript - Discord.JS 倒计时/定时器命令问题
问题描述
我现在正在处理一个命令,在使用命令(例如?hello
)之后,它会将您置于一组中。如果您再次使用该命令,您会收到一条消息(例如“请等待 10 秒再使用此命令。”)但是,如果您等待 10 秒,您可以再次使用该命令。
问题是,在 10 秒结束之前,每次我?hello
在 10 秒结束之前执行此操作时,机器人总是说“请等待 10 秒,然后再使用此命令”。这意味着即使我等了 8 秒并使用了该命令,机器人仍然会回复“请等待 10 秒,然后再使用此命令”。而不是“请在再次使用此命令之前等待2秒”。
我目前正在setTimeout()
为此使用,但机器人没有倒计时。我已经尝试过为此使用setInterval()
和使用for()
循环,但我无法弄清楚如何使用它们中的任何一个来完成这项工作。
我的基本代码适合 ?hello 命令
const helloSet = new Set();
bot.on('message', msg => {
let args = msg.content.substring(prefix.length).split(" ");
if(args[0] === 'hello'){
if(helloSet.has(msg.author.id)){
msg.channel.send(`Please wait 10 seconds before using this command again.`)
setTimeout(() => {
helloSet.delete(msg.author.id)
}, 10000)
} else {
msg.channel.send(`Hello!`)
helloSet.add(msg.author.id)
}
}
})
这里面没有计时器/倒计时的东西,所以当我使用?hello
命令时会发生这种情况。
User: ?hello
Bot: Hello!
User right after using ?hello: ?hello
Bot: Please wait 10 seconds before using this command again
User 8 seconds later: ?hello
Bot: Please wait 10 seconds before using this command again
*Even after I wait for 8 seconds, the bot still says wait 10 more seconds although I really only need to wait 2 more seconds.*
User after a total 10 seconds later: ?hello
Bot: Hello!
同样,我不太确定如何使用setInterval()
forfor()
循环之类的东西来实现这一点,因为我已经尝试过了,但它没有奏效。
对于如何实现这一目标,我将不胜感激。太感谢了!
解决方案
根据您的描述,该机器人似乎正在正确倒计时,但它只是没有正确输出剩余时间。这是因为当有人调用帮助函数时,您打印的消息是静态的 ( Please wait 10 seconds before using this command again.
)。
setTimeout 没有在执行前检索剩余时间的方法,因此您必须手动记下第一次调用命令的时间,并在以后的调用中计算剩余时间作为超时和部分已经过去的时间差.
声明一个变量来跟踪时间:
var callTime = 0;
当您调用 setTimeout 时,请记下当前日期/时间:
callTime = (new Date()).getTime();
最后更改您在冷却时打印的消息:
Please wait ${10-((new Date()).getTime() - callTime )} seconds before using this command again.
推荐阅读
- openlayers - Openlayers 功能创建问题
- c - 在两个相同的 Skylake Xeon Gold 6154 系统上测量到不同的内核间延迟
- c++ - 如何让 tesseract 识别这些字母数字字符串?
- javascript - 为什么继承函数创建的实例与父函数创建的实例不同?
- javascript - Body-Parser 不读取请求正文
- django - 为什么我不能再次使用 Django 获取 API 数据?
- xamarin - 如何在 ListView 中为复选框设置名称
- python - 将 pandas df 转换为列表的字典
- javascript - Uint8Array.map(...) 意外行为
- embedded-linux - YOCTO:无法将 linux 模块插入内核:版本不同