#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. я сделал, пожалуйста, взгляните на комментарий, который я добавил после .затем (собранный)