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() 的参数发生了一些变化。 filteroptions不再有单独的参数; 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直接消息等待不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 命令处理对我不起作用

Discord bot,嵌入欢迎消息不起作用

为啥我的欢迎信息不起作用(discord.js)

Discord.js 机器人命令不起作用。怎么解决?

discord.js 我的代码不起作用,在终端中显示 typeError 但我不知道出了啥问题

Discord.js V12 粗鲁的话过滤器不起作用