首页 > 解决方案 > 循环 discord.js 中的消息侦听器

问题描述

我正在使用 Discord.js 编写一个机器人,并且在我的代码循环中,“消息”事件的回调函数不会在其中触发,而是在执行期间的其他任何地方都可以使用。我使用 console.log 指令进行了测试,但找不到解决方案。

这是代码:循环在这个块的底部

module.exports.play = async (client, channel, players) => {
    try {
        let playersCards = [];
        let pyramideCards = [];

        emitter.on("ok", message => {
            console.log(message.author.username + " : " + message.content);
        });
        stopEmitter.on("stop", async () => {
            await channel.delete();
            console.log("jeu fini");
        });

        await beginMessage(players, channel);
        await beginGame(players, playersCards, pyramideCards);

        //attendre que les messages se suppriment
        await sleep(30000);
        for(let i = 0; i < pyramideCards.length; i++)
            await continueGame(pyramideCards[i], i, channel, players);
    }
    catch(e) {
        console.error(e);
    }    
};

async function beginMessage(players, channel) {
    let message = "que le jeu commence ";
    players.forEach(player => {
        message += `${player.toString()} `;
    });

    await removeSendingMessages(players, channel);
    await channel.send(message);
}

async function beginGame(players, playersCards, pyramideCards) {
    return new Promise(async (resolve, reject) => {
        fs.readFile('Utils/cartes.json', 'utf8', async (err, data) => {
            if(err) return reject(err);

            let cartes = JSON.parse(data);
            cartes = cartes.cartes;

            await asyncForEach(players, async player => {
                let playerCards = await distributeCards(player, cartes);
                playersCards.push(playerCards);
            });

            distributePyramideCards(pyramideCards, cartes);


            if(pyramideCards.length > 0 && playersCards.length > 0)
                resolve();
        });
    });
}

async function distributeCards(player, cartes) {
    let playerCards = { 
        name : player.username,
        cards : [],
    };

    for(let i = 0; i < 4; i++) {
        let carte = getRandomCard(cartes);
        playerCards.cards.push(carte.name);
        playerCards.value = carte.value;
    }
    playerCards.cards.sort((a, b) => a - b);

    let dmChannel = await player.createDM();
    let messageSend = await dmChannel.send(`Voici tes cartes retiens les bien tu as 30sec : ${playerCards.cards}`);
    let deletedMessage = setTimeout(async () => {await messageSend.delete()},30000);

    return playerCards; 
}

function distributePyramideCards(pyramideCards, cartes, base = 4) {
    for(let i = base; i > 0; i--) {
        pyramideCards[pyramideCards.length] = [];
        for(let j = 0; j < i; j++) {
            pyramideCards[pyramideCards.length-1].push(getRandomCard(cartes));
        }
    }
}

function getRandomCard(cartes) {
    let carte = cartes[Maths.getRandomNumber(0,12)];
    let valid = carte.count > 0;

    while(!valid) {
        carte = cartes[Maths.getRandomNumber(0,12)];
    }

    carte.count--;
    return carte;
}

async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index++) {
      await callback(array[index], index, array);
    }
}

async function continueGame(rangee, numRangee, channel, players) {
    let voteMess = "";
    for(let i = 0; i < players.length; i++) {
        voteMess += `pour attaquer ${players[i].username} envoie ${i+1}\n`;
    }

    await channel.send(new Discord.MessageEmbed()
        .setColor("GREY")
        .addFields({
            name : "règles",
            value : `rangée ${numRangee + 1} : ${numRangee + 1} coups en jeu`,
            inline : true
        },
        {
            name : "joueurs",
            value : voteMess
        })
    );

    for(let i = 0; i < rangee.length; i++)
        await playRound(rangee[i], channel, players);
}

async function playRound(carte, channel, players) {
    await channel.send(new Discord.MessageEmbed()
        .setTitle("prochaine carte")
        .setColor("RED")
        .addField("carte", carte.name)
    );

    let playersCopy = [];
    players.forEach(player => {
        playersCopy.push({
            name : player.username,
            ok : false
        });
    });

    await attack(carte, channel, players, playersCopy);
}

async function attack(carte, channel, players, playersCopy) {
    let valid = playersCopy.every(player => player.ok == true);
    await addSendingMessages(players, channel);
    let me = await channel.send("phase d'attaque quand vous avez fini envoyer 'ok'");

    while(!valid) {
        // !!!!!! in this loop !!!!
        let valid = playersCopy.every(player => player.ok == true);
    }
}

这是回调函数 在此处输入图像描述

标签: node.jsasynchronouseventsdiscord.js

解决方案


这部分:

        emitter.on("ok", message => {
            console.log(message.author.username + " : " + message.content);
        });
        stopEmitter.on("stop", async () => {
            await channel.delete();
            console.log("jeu fini");
        });

不是有效的语法,我不太确定你从哪里得到的。尝试使用MessageCollectorTextChannel#awaitMessages来收听新消息。


推荐阅读