как я могу использовать асинхронную функцию в discord js для создания игры с вопросами?

#javascript #node.js #asynchronous #discord #discord.js

#javascript #node.js #асинхронный #Discord #discord.js

Вопрос:

Я хочу создать бота discord, который задаст мне вопрос, если я наберу done в определенное время, он должен сказать, что nice u выиграл, если это ответ, но если он достиг 7 секунд, он должен сказать time up, но я не знаю, иногда он рассылает спам по времени, как я могу исправить, пожалуйстаЯ застрял там на 8 часов?

 
/* === countries image === */

var   kurdistan = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_Kurdistan.svg/800px-Flag_of_Kurdistan.svg.png";
var   catalonia = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Catalonia.svg/810px-Flag_of_Catalonia.svg.png";
var   palastine = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/800px-Flag_of_Palestine.svg.png";


/* === countries names === */

const obj = [
 kurdistan,
 catalonia,
 palastine
];

/* === code === */



client.on('message', async message => {
    if(message.author.bot) return;
  
          const ranImg = Math.floor(Math.random() * obj.length); 
          if(message.content === 'flag') {
             const embed = new Discord.MessageEmbed();
             embed.setTitle('Flag guesser');
             embed.setDescription('which countries flag does this belong?');
             embed.setImage(obj[ranImg]);
             embed.setColor(0x3aeb34);
             embed.setFooter('this game provided by by me');
             embed.setTimestamp();
             message.channel.send(embed).then(() => {
              let filter = m => m.author.id === message.author.id;
  
              message.channel.awaitMessages(filter, { max: 1, time: '7000', errors: ['time'] })
               .then(collected => {  
//when it gives me the image and I write the correct answer of the obj[ranImg] it doesn't says you win all the time it says try again 👇🏽👇🏽👇🏽👇🏽 
                  if (collected.first().content === obj[ranImg]) {
                    return message.channel.send(':white_check_mark: You win!') //they won 
                  } else {
                    return message.channel.send(`:x: Oooh close! Try again!`); // they lost 
                  }
               })
               .catch(collected => {
                  return message.channel.send('times up! no answers were collected!');
               });
            });
        }
    }
  );
 

Ответ №1:

сборщики сообщений сложны, и вы действительно близки. Вам не нужно определять awaitMessages, а также await уже асинхронен, поэтому вам не нужно вводить async перед #awaitMessages . Кроме того, вам нужно #then , чтобы привести к #awaitMessages .

Кроме того, у сборщиков есть понятие о #catch системах, если выдается ошибка errors: ['time'] , определенная obj.

maxMatches устарел, в версии 12 он был изменен на max

В заключение я объединю все вышеперечисленное, чтобы исправить ваш код:

 client.on('message', async message => {
  if(message.author.bot) return; //have this here so the command does as little as possible before returning

        const ranImg = Math.floor(Math.random() * obj.length); 
        if(message.content === 'flag') {
           const embed = new Discord.MessageEmbed();
           embed.setTitle('Flag guesser');
           embed.setDescription('which countries flag does this belong?');
           embed.setImage(obj[ranImg]);
           embed.setColor(0x3aeb34);
           embed.setFooter('this game provided by by me');
           embed.setTimestamp();
           message.channel.send(embed).then(() => {
            let filter = m => m.author.id === message.author.id;

            message.channel.awaitMessages(filter, { max: 1, time: '7000', errors: ['time'] })
             .then(collected => {
                if (collected.first().content === obj[ranImg]) {
                  return message.channel.send(':white_check_mark: You win!') //they won 
                } else {
                  return message.channel.send(`:x: Oooh close! Try again!`); // they lost 
                }
             })
             .catch(collected => {
                return message.channel.send('times up! no answers were collected!'); // if the timer of 7000ms elapses, catch here
             });
          });
      }
  }
);
 

Вот руководство, если вам все еще нужна дополнительная помощь

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

1. о, спасибо, это сработало для меня, и я многому научился благодаря вам, но у меня есть еще одна проблема, которая заключается в том, что ran [obj] не дает мне правильного ответа, поэтому он все время неправильно отвечает на мои объекты и переменные, которые предоставляют мне случайное изображение / * /* === изображение стран === / « вар курдистан = // ссылка на Курдистан вар паластин = // ссылка на паластин вар Каталония = // ссылка на Каталонию / === названия стран === */ const obj = [ курдистан, Каталония, Палестина]; */ «

2. Пожалуйста, отметьте мой ответ как правильный, а что касается вашей проблемы, я понятия не имею, что вы имеете в виду, вам придется объяснить более подробно

3. я сделал это, я имел в виду, что когда я получаю случайное изображение, которое я должен угадать, когда я пишу правильный ответ, например, ключ объекта, я не получаю сообщение, в котором говорится, что вы выиграли, как вы видите в « if (collected . first().content === obj[ranImg]) // случайный объект «

4. Я не знаю, где определен obj, поэтому вам придется обновить приведенный выше код, чтобы правильно объяснить

5. я сделал, пожалуйста, взгляните на комментарий, который я добавил после .затем (собранный)