Как слушать параллельно двух пользователей?

#javascript #node.js #discord.js #bots

Вопрос:

У меня есть следующий код:

 module.exports = {
  name: 'd',
  description: 'test',
  execute(client, message, args) {
    const Discord = module.require("discord.js");
    
      message.channel.send("Yes or no?")

      let player1 = '0';
      function firstListen() {
        const collector1 = new Discord.MessageCollector(message.channel, m => m.author.id === 'HERE_ID_PLAYER_1', { time: 10000 });
        collector1.on('collect', message => {
          if (message.content.toLowerCase() == "yes") {
            player1 = 'yes';
            message.channel.send("Player 1 chose YES");
          } else if (message.content.toLowerCase() == "no") {
            player1 = 'no';
            message.channel.send("Player 1 chose NO");
          }
        })
      };

      let player2 = '0';
      function secondListen() {
        const collector2 = new Discord.MessageCollector(message.channel, m => m.author.id === 'HERE_ID_PLAYER_2', { time: 10000 });
        collector2.on('collect', message => {
          if (message.content.toLowerCase() == "yes") {
            player2 = 'yes';
            message.channel.send("Player 2 chose YES");
          } else if (message.content.toLowerCase() == "no") {
            player2 = 'no';
            message.channel.send("Player 2 chose NO");
          }
        })
      };

      async function runListen() {
        message.channel.send('start');
        await firstListen();
        await secondListen();
        await message.channel.send(`Player 1 chose ${player1} and Player 2 chose ${player2}`);
      }

      runListen();

    }
  }
 

Сначала я хочу отправить сообщение от бота «Да или нет?»,
Затем хочу подождать, пока оба пользователя не ответят «да» или «нет», или пока не истечет время,
и только после этого хочу отправить окончательный результат «Игрок 1 выбрал да/нет, а игрок 2 выбрал да/нет».
Но не могу понять, как работать с .затем в js, или как правильно использовать async/await..(
Потому что Игрок 2 может ответить быстрее, чем игрок 1. Необходимо прослушивать обоих пользователей параллельно, и у них должен быть общий таймер (например: 10 секунд для обоих).
PS: у меня есть 3 вопроса:

  1. Как я могу получить результат от каждой функции после того, как пользователи что-то выбрали? (чтобы что-то сделать со своим выбором)
  2. Как я могу дождаться завершения обеих функций и только после этого отправить сообщение с результатами?
  3. Как я могу поймать, когда время истекло? и отправьте «Игрок 1, время вышло» или «Игрок 2, время вышло».

Комментарии:

1. Возможный подход состоит в том , чтобы создать while цикл, который всегда true , а затем иметь события как для игрока 1, так и для игрока 2, которые установлены в message.channel.send answer_player_1 и answer_player_2 в «true», если answer_player_1 and answer_player_2 are both true затем прервать цикл. У вас также будет установлен тайм-аут/счетчик при вызове runListen , как только этот тайм-аут будет достигнут, пусть он разорвет while цикл (так что либо оба игрока, отвечающие, разорвет цикл, либо тайм-аут разорвет цикл). Посмотрите на источники событий для примеров.

2. @Manny — Цикл опроса во время не будет работать в nodejs, так как он заблокирует цикл событий, и ни одно из других событий не будет обработано.

3. ОБНОВЛЕНИЕ: Вопрос № 3: Как я могу поймать, когда время истекло? и отправьте ответ «Игрок 1, время вышло» или «Игрок 2, время вышло».: collector2.on('end', (collected, reason) => { if ((reason === 'time') amp;amp; (result === '0')) { result = 'time'; message.channel.send('Time is up!'); } });

4. @jfriend00 Спасибо вам за это руководство и объяснение.

Ответ №1:

Спасибо всем! Ответ был: нужно использовать обещание, и обещание.все)

 module.exports = {
  name: 'd',
  description: 'test',
  async execute(client, message, args) {
    const Discord = module.require("discord.js");
    message.channel.send("Yes or no?")

    var p1 = new Promise((resolve, reject) => {
      const collector1 = new Discord.MessageCollector(message.channel, m => m.author.id === '568481051895136278', { max: 1, time: 10000 });
      collector1.on('collect', message => {
        if (message.content.toLowerCase() == "yes") {
          resolve('yes');
          message.channel.send("Player 1 chose YES");
        } else if (message.content.toLowerCase() == "no") {
          resolve('no');
          message.channel.send("Player 1 chose NO");
        }
      })
      collector1.on('end', (collected, reason) => {
        if (reason === 'time') {
          resolve('time');
          message.channel.send('Player 1, Time is up!');
        }
      });
    });
    var p2 = new Promise((resolve, reject) => {
      const collector2 = new Discord.MessageCollector(message.channel, m => m.author.id === '568481051895136279', { max: 1, time: 10000 });
      collector2.on('collect', message => {
        if (message.content.toLowerCase() == "yes") {
          resolve('yes');
          message.channel.send("Player 2 chose YES");
        } else if (message.content.toLowerCase() == "no") {
          resolve('no');
          message.channel.send("Player 2 chose NO");
        }
      })
      collector2.on('end', (collected, reason) => {
        if (reason === 'time') {
          resolve('time');
          message.channel.send('Player 2, Time is up!');
        }
      });
    });

    Promise.all([p1, p2]).then(values => {
      console.log(values);
    });

  }
}