Discord js直接消息等待不起作用
Posted
技术标签:
【中文标题】Discord js直接消息等待不起作用【英文标题】:Discord js direct message await not working 【发布时间】:2021-11-17 02:17:20 【问题描述】:所以我的不和谐机器人向 DM 中的用户询问 API 机密。我想等待用户的响应,以便我可以用我的密钥做进一步的事情。
来自client.on('messageCreate')
的用户请求添加密钥后我调用此函数
async function takeApiSecret(msg)
const botMsg = await msg.author.send("Please provide your api secret");
const filter = collected => collected.author.id === msg.author.id;
const collected = await botMsg.channel.awaitMessages(filter,
max: 1,
time: 50000,
).catch(() =>
msg.author.send('Timeout');
);
但是我无法等待用户的回复并收集它。相反,当我回复时,我在client.on('messageCreate')
上收到另一条消息。任何线索我可能做错了什么?
【问题讨论】:
消息中的内容是什么? @MrMythical 什么都没有......我根本没有收到任何错误。 你使用的是什么版本的 discord.js? @MrMythical 13.10 和节点 16.8.0 你应该知道 awaitMessages 过滤器现在作为对象的属性在第一个参数中,所以它应该看起来像这样:awaitMessages(filter, max: 1, time: 50000)
【参考方案1】:
在 discord.js v13.x 中,awaitMessages()
的参数发生了一些变化。 filter
和options
不再有单独的参数; filter
现在包含在选项中。这应该可以解决您的问题:
const filter = collected => collected.author.id === msg.author.id;
const collected = await botMsg.channel.awaitMessages(
filter,
max: 1,
time: 50000,
).catch(() =>
msg.author.send('Timeout');
);
您可以找到文档here。出于某种原因,这些选项似乎没有完整记录,但您可以查看该页面上的示例以了解新格式。
此外,如果在通过 DM 发送消息时调用此代码,您可能需要防止收集的消息触发其余的 messageCreate
事件侦听器代码。这是您可以做到的一种方法:
messageCreate
外部处理程序:
const respondingUsers = new Set();
就在awaitMessages()
之前
respondingUsers.add(msg.author.id);
在您的.then()
和.catch()
内部awaitMessages()
:
respondingUsers.delete(msg.author.id);
在您的 messageCreate
处理程序顶部附近,就在您的其他检查之后(例如检查消息是否为 DM):
if (respondingUsers.has(msg.author.id)) return;
如果我们将所有这些放在一起,它可能看起来像这样(显然,修改它以使用您的代码):
const respondingUsers = new Set();
client.on('messageCreate', msg =>
if (msg.channel.type != "DM") return;
if (respondingUsers.has(msg.author.id)) return;
respondingUsers.add(msg.author.id);
const filter = collected => collected.author.id === msg.author.id;
const collected = botMsg.channel.awaitMessages(
filter,
max: 1,
time: 50000,
)
.then(messages =>
msg.author.send("Received messages");
respondingUsers.delete(msg.author.id);
)
.catch(() =>
msg.author.send('Timeout');
respondingUsers.delete(msg.author.id);
);
)
【讨论】:
感谢您的详细解答!真的帮了大忙。如果我们使用 .then 就像你在代码中提到的那样,我们不需要等待 没错,我没有看到await
那里大声笑。感谢您指出了这一点。我已将其从答案中删除。如果你愿意,你可以调整它以使用async/await
(老实说,与使用.then
相比,这种方式更干净)。以上是关于Discord js直接消息等待不起作用的主要内容,如果未能解决你的问题,请参考以下文章