【问题标题】:Discord.JS Countdown/Timer Command ProblemDiscord.JS 倒计时/定时器命令问题
【发布时间】:2020-08-27 08:05:09
【问题描述】:

我现在正在处理一个命令,在使用一个命令(例如?hello)后,它会将你放入一个集合中。如果您再次使用该命令,您将收到一条消息(例如“请等待 10 秒再使用此命令。”)但是,如果您等待 10 秒,您可以再次使用该命令。

问题是,在 10 秒结束之前,每次我在 10 秒结束之前执行 ?hello 时,机器人总是说“请等待 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() 之类的东西来实现 for() 循环,因为我已经尝试过了,但没有成功。

对于如何实现这一目标的任何帮助,我将不胜感激。非常感谢!

【问题讨论】:

    标签: javascript discord.js


    【解决方案1】:

    那是因为你真的告诉机器人说 10 秒,你需要设置一个变量来代替:

    if (helloSet.has(message.author.id)) {
        const expirationTime = helloSet.get(message.author.id) + 10000; // 10000 is cooldown
    
        if (now < expirationTime) {
            const timeLeft = (expirationTime - now) / 1000;
            return message.reply(`please wait ${timeLeft.toFixed(1)} seconds before using this command again`);
        }
    }
    

    但是,无论哪种方式,计时器都不会过期,因为您需要在将用户添加到 Set() 后立即运行 setTimeout() 函数:

    } else {
          msg.channel.send(`Hello!`)
          helloSet.add(msg.author.id)
          setTimeout(() => {
            helloSet.delete(msg.author.id)
          }, 10000)
        }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多