首页 > 解决方案 > 用户 DM 中的 awaitMessages() 问题

问题描述

我正在为我的机器人创建一个报告功能,这样当被调用时,它将向用户发送 DM 请求报告,当用户提供报告时,它将获取报告并将其嵌入服务器内的预定义通道中。

message.author.send("Please send your report here in a single message below 1000 characters in length. Provide the tag of the User, Reason and Evidence(optional). This instance shall expire in 120 seconds")
    .then((rMsg) => {
        rMsg.channel.awaitMessages(res => res.content, {
            max: 1,
            time: 120000,
            errors: ['time']
        })
        .then((report) => {

            console.log(report);
            let dmrEmbed = new discord.RichEmbed()
            .setColor('#8E5BC5')
            .setTitle('User Report (Type: DM)')
            .addField('Reporter :', `<@${message.author.id}> ID: ${message.author.id}`)
            .addField('Report Content:', `${report.content}`)
            .setFooter(message.createdAt);

            rMsg.channel.send('Your report has been received. You may be contacted for further information.');

            rChannel.send(dmrEmbed);

        }).catch(() => {
            rMsg.channel.send('This instance has expired.');
        });
    });

    return;

这段代码有两个主要问题。它应该在 DM 中接受用户的输入,但是当它向用户发送第一条要求报告的消息时,它会立即发布“您的报告已收到”消息。当我在控制台登录时report,我可以看到机器人已将它自己的第一条消息作为回复。

第二个问题是,即使报告有一个包含消息的内容元素,也会report.content返回。undefined

标签: javascriptdiscord.js

解决方案


有一些小问题,让我们回顾一下:

问题 1: DMChannel#awaitMessages参数为: 文档

因此,您需要添加适当的过滤器以仅接受来自记者的消息,例如:

rMsg.channel.awaitMessages(res => res.content && res.author.id == , {

这将确保仅捕获带有内容和来自报告者的消息。

问题 2:DMChannel#awaitMessages返回一个集合。 文档

所以而不是

.then((report) => {

利用

.then((collected) => {
    const report = collected.first(); // This will return the proper message object.

推荐阅读