首页 > 解决方案 > 如何循环消息收集器?

问题描述

我正在尝试使用 Discord.js 发出战斗命令。我试过使用whilefor循环,但它们不起作用。到目前为止,这是我的代码:

    db.set(`p2name_${message.channel.id}`, message.mentions.users.first().username);
    db.set(`p2id_${message.channel.id}`, message.mentions.users.first().id);
    db.set(`p1name_${message.channel.id}`, message.author.username);

    let p2id = db.fetch(`p2id_${message.channel.id}`);
    let p2name = db.fetch(`p2name_${message.channel.id}`);
    let p1name = db.fetch(`p1name_${message.channel.id}`);
    let p1health = 100;
    let p2health = 100;
    let p1turn = true;
    let p2turn = false;

    const gstart = message.channel.createMessageCollector(m => m.author.id === message.mentions.users.first().id, { time: 3600000 });
    const p1 = message.channel.createMessageCollector(m => m.author.id === message.author.id, { time: 100000 });
    const p2 = message.channel.createMessageCollector(m => m.author.id === message.mentions.users.first().id, { time: 100000 });

    message.channel.send(`${p2name}, do you accept the challenge?`)
    gstart.on('collect', message => {
      if (message.content.toLowerCase() === "yes") {
        message.channel.send(`${p2name} has accepted the challenge!`)
        gstart.stop();


        message.channel.send(`${p1name}, what do you want to do? \`Punch\``)

        function a() {
          p1.on('collect', message => {
            if (message.content.toLowerCase() === "punch") {
              p2health = p2health - rng.random(1, 50)
              if (p2health === 0) return message.channel.send(`${p1name} wins with ${p1health}! Congratulations!`)
              message.channel.send(`${p2name}, your health is now ${p2health}.`)
              p1.stop();
              message.channel.send(`${p2name}, what do you want to do? \`Punch\``)
                .then(() => {
                  p2.on('collect', message => {
                    if (message.content.toLowerCase() === "punch") {
                      p1health = p1health - rng.random(1, 70)
                      if (p1health === 0) return message.channel.send(`${p2name} wins with ${p2health}! Congratulations!`);
                      message.channel.send(`${p1name}, your health is now ${p1health}.`)
                      p2.stop()
                      message.channel.send(`${p1name}, what do you want to do? \`Punch\``)
                    }
                  })
                })
            }
          })

        

      }

        while (p1health !== 0 && p2health !== 0) {
          a();
        }
        
      } else {
        message.channel.send(`${p1name}, ${p2name} has declined your challenge.`);
        gstart.stop();
      }
    })

有什么我做错了吗?每当我的 alt 说是时,我的机器人就会停止运行。

标签: javascriptnode.jsdiscord.js

解决方案


这是您可以尝试的另一种方法,无需将message事件侦听器放在彼此内部。基本上,我使用的awaitMessages是返回一个 promise 并将其放置在try...catch块内的方法。

代码示例 - 根据您的需要对其进行修改:

try {
    //either create a filter here or put it outside, I didn't include one in the code
    let msg = await message.channel.awaitMessages(filter, { max: 1, time: 10000, errors: ['time'] }); //waits for 10 seconds
    console.log(msg.first().content); //logs the message content it receives
} catch (err) {
    console.log(err);
    message.channel.send('You ran out of time!');
}

推荐阅读