javascript - 如何循环消息收集器?
问题描述
我正在尝试使用 Discord.js 发出战斗命令。我试过使用while
和for
循环,但它们不起作用。到目前为止,这是我的代码:
db.set(`p2name_${message.channel.id}`, message.mentions.users.first().username);
db.set(`p2id_${message.channel.id}`, message.mentions.users.first().id);
db.set(`p1name_${message.channel.id}`, message.author.username);
let p2id = db.fetch(`p2id_${message.channel.id}`);
let p2name = db.fetch(`p2name_${message.channel.id}`);
let p1name = db.fetch(`p1name_${message.channel.id}`);
let p1health = 100;
let p2health = 100;
let p1turn = true;
let p2turn = false;
const gstart = message.channel.createMessageCollector(m => m.author.id === message.mentions.users.first().id, { time: 3600000 });
const p1 = message.channel.createMessageCollector(m => m.author.id === message.author.id, { time: 100000 });
const p2 = message.channel.createMessageCollector(m => m.author.id === message.mentions.users.first().id, { time: 100000 });
message.channel.send(`${p2name}, do you accept the challenge?`)
gstart.on('collect', message => {
if (message.content.toLowerCase() === "yes") {
message.channel.send(`${p2name} has accepted the challenge!`)
gstart.stop();
message.channel.send(`${p1name}, what do you want to do? \`Punch\``)
function a() {
p1.on('collect', message => {
if (message.content.toLowerCase() === "punch") {
p2health = p2health - rng.random(1, 50)
if (p2health === 0) return message.channel.send(`${p1name} wins with ${p1health}! Congratulations!`)
message.channel.send(`${p2name}, your health is now ${p2health}.`)
p1.stop();
message.channel.send(`${p2name}, what do you want to do? \`Punch\``)
.then(() => {
p2.on('collect', message => {
if (message.content.toLowerCase() === "punch") {
p1health = p1health - rng.random(1, 70)
if (p1health === 0) return message.channel.send(`${p2name} wins with ${p2health}! Congratulations!`);
message.channel.send(`${p1name}, your health is now ${p1health}.`)
p2.stop()
message.channel.send(`${p1name}, what do you want to do? \`Punch\``)
}
})
})
}
})
}
while (p1health !== 0 && p2health !== 0) {
a();
}
} else {
message.channel.send(`${p1name}, ${p2name} has declined your challenge.`);
gstart.stop();
}
})
有什么我做错了吗?每当我的 alt 说是时,我的机器人就会停止运行。
解决方案
这是您可以尝试的另一种方法,无需将message
事件侦听器放在彼此内部。基本上,我使用的awaitMessages
是返回一个 promise 并将其放置在try...catch
块内的方法。
代码示例 - 根据您的需要对其进行修改:
try {
//either create a filter here or put it outside, I didn't include one in the code
let msg = await message.channel.awaitMessages(filter, { max: 1, time: 10000, errors: ['time'] }); //waits for 10 seconds
console.log(msg.first().content); //logs the message content it receives
} catch (err) {
console.log(err);
message.channel.send('You ran out of time!');
}
推荐阅读
- powershell - Powershell Active Directory 脚本 - 通过更改显示名称批量禁用
- javascript - WebRTC onicecandidate 不会在 chrome for android 上触发,但适用于所有其他浏览器,包括适用于 android 的 firefox
- java - 有什么办法可以访问隐藏文件android?
- python - 如何使用“代码”。python脚本中的命令
- android - Android 地理围栏 - 对概念和限制的质疑
- docker - 使用“外部”泊坞窗守护程序时,Paketo buildpack 绑定不起作用
- php - array_splice 不替换数组键值
- python - 如何使用列表索引ndarray中的单个元素?
- excel - Excel 用户窗体导致文件出现问题/损坏,文件在 Visual Basic 的“项目资源管理器”中多次出现
- java - 将一系列时间戳与 JPA 的 Query by Example 匹配