首页 > 解决方案 > 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()循环之类的东西来实现这一点,因为我已经尝试过了,但它没有奏效。

对于如何实现这一目标,我将不胜感激。太感谢了!

标签: javascriptdiscord.js

解决方案


根据您的描述,该机器人似乎正在正确倒计时,但它只是没有正确输出剩余时间。这是因为当有人调用帮助函数时,您打印的消息是静态的 ( 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.


推荐阅读