node.js - 循环 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);
}
}
解决方案
这部分:
emitter.on("ok", message => {
console.log(message.author.username + " : " + message.content);
});
stopEmitter.on("stop", async () => {
await channel.delete();
console.log("jeu fini");
});
不是有效的语法,我不太确定你从哪里得到的。尝试使用MessageCollector或TextChannel#awaitMessages来收听新消息。
推荐阅读
- javascript - 在嵌套组件中反应组件道具
- r - 在 R 中使用条件概率分析学生的测试结果
- machine-learning - 为 CNN 构建二元分类器的正确方法
- wordpress - 内置 WP_USERS 与自定义用户表
- python - 无法继承正确的父类,初始化需要 1 个位置参数,但给出了 2 个
- python - 使用 update() 方法时,Django ImageField 不更新
- javascript - 无法让 Simplebar.js 运行
- node.js - 如何使我的错误消息更具体地针对注册用户?
- postgresql - PostgreSQL 动态 date_trunc 函数四舍五入到给定的时间戳
- java - 有时从声明中初始化的常量返回空值。这是编码错误吗?