Я пишу бот, используя discord. js, и у меня проблема с функцией обратного вызова. При первом вызове не возникает проблем. обратный вызов вызывается дважды, как если бы это была итеративная функция. Я поставлю код и вывод, чтобы вы могли понять.
async function endRound(carte, channel, players, playersCopy, playersCards) {
console.log("début endRound");
let valid = playersCopy.every(player => player.ok == true);
await addSendingMessages(players, channel);
await channel.send("phase d'attaque quand vous avez fini envoyer 'ok'");
emitter.on("ok", message => {
let playerOk = playersCopy.find(player => player.name === message.author.username);
playerOk.ok = true;
});
emitter.on("attack", async message => {
console.log("debut callback attack");
await channel.send(`${message.author.username} attaque ${players[message.content - 1]}`);
await attack(message.author, players[message.content - 1], carte, channel, playersCards);
console.log("fin callback attaque");
});
while(!valid) {
await sleep(50);
valid = playersCopy.every(player => player.ok == true);
}
console.log("fin endRound");
}
async function attack(attacker, attacked, carte, channel, playersCards) {
console.log("debut fonction attaque")
await channel.send(`${attacked.username} est ce que ${attacker.username} ment ou pas ? réponds par oui ou non`);
//bug ici
emitter.on("attackResponse", async message => {
console.log("debut callback attackResponse");
if(message.content === "oui") {
if(contest(carte, attacker, playersCards))
await channel.send(`${attacker.username} ne ment pas ${attacked.username} boit double`);
else
await channel.send(`${attacker.username} ment il boit double`);
}
else {
await message.channel.send(attacked.username + "boit alors");
}
console.log("fin callback attackResponse");
});
console.log("fin fonction attaque");
}
function contest(carte, attacker, playersCards) {
console.log("debut fonction contest");
let attackerPlayer = playersCards.find(player => player.name === attacker.username);
let test = attackerPlayer.cards.some(card => card === carte);
console.log("fin fonction contest");
return test;
}
выход:
- дебют endRound
- дебютная атака обратного вызова
- атака на дебютную функцию
- атака на финную связь
- атака на фин обратного вызова
- атака на дебютный обратный вызовResponse
- конкурс на дебютную функцию
- конкурс на роль фина
- fin callback attackResponse
- дебютная атака обратного вызова
- дебютная атака функции
- конечная атака fin *
- атака обратного вызова fin
- дебют callback attackResponse
- конкурс дебютных функций
- конкурс функций fin *
- дебют callback attackResponse
- конкурс дебютных функций
- конкурс функций fin
- fin callback attackResponse
- fin callback attackResponse
Почему это происходит?