#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, время вышло».
Комментарии:
1. Возможный подход состоит в том , чтобы создать
while
цикл, который всегдаtrue
, а затем иметь события как для игрока 1, так и для игрока 2, которые установлены в message.channel.sendanswer_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);
});
}
}