【问题标题】:Discord.JS Command IssueDiscord.JS 命令问题
【发布时间】:2020-05-12 15:13:32
【问题描述】:

我一直在处理这个命令(我有一个问题),当用户说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`);
          }

部分到代码的其他地方并对其进行更改,但似乎没有任何效果。我能做些什么呢?

【问题讨论】:

    标签: javascript bots discord.js


    【解决方案1】:

    是的,这对您的代码很正常。您需要做的是创建一个名为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");
      }
    });
    

    如果您有任何问题,请不要犹豫发表评论!

    【讨论】:

    • 非常感谢!我只是对地图不太熟悉。我在 MDN 上对地图进行了一些研究,但不是很清楚。如果您能解释一下地图,我将不胜感激。谢谢!
    • Map 用于为键设置值。如我的回答所示,您可以使用 Map.set("ID", data) 和 Map.get("ID") 来获取数据。在您的情况下,将用户 ID 与冷却时间关联起来很有用。
    • 哦..我明白了,非常感谢您的解释!
    猜你喜欢
    • 2020-04-06
    • 2020-12-29
    • 2020-08-24
    • 2020-06-16
    • 2020-01-14
    • 2021-10-06
    • 1970-01-01
    • 2018-07-14
    • 2020-06-09
    相关资源
    最近更新 更多