当我向我的机器人发送私信时,事件消息“messageCreate”未触发/发出(discord.js v13)

13

我为了记录发送给我的机器人的私信而编写了这段代码:

client.on('messageCreate', async message => {

    if (message.author.bot) return;

    const attachment = message.attachments.first()

    if (message.channel.type === 'DM') {
        console.log(message.content)

        const dmLogEmbed = new MessageEmbed()
            .setColor("RANDOM")
            .setTitle(`${message.author.tag} dmed the bot and said: `)
            .setDescription(message.content)
            .setFooter(`User's id: ${message.author.id}`)

        if (message.attachments.size !== 0) {
            dmLogEmbed.setImage(attachment.url)

        }

        client.channels.fetch("852220016249798756").then((channel) => {

            channel.send({ embeds: [dmLogEmbed] })

        })
    }

});

当我更新到discord.js v13时,它不再起作用了。据我所知,唯一的更改是'dm'频道类型不再是'dm',而是'DM',因此我在我的代码中进行了更改,但它仍然无法工作,我真的不知道为什么。


你调试了什么?确认你的 messageCreate 事件是否正在发出,并检查 if 语句是否正确。 - Elitezen
2
我已经成功地复现了你的问题,但是我不知道为什么会出现这种情况。我认为可能是因为你缺少了一个意图 DIRECT_MESSAGES。我添加了它,但还是没有任何作用... messageCreate 没有完全触发...(在公会中可以工作) - Skulaurun Mrusal
是的,我也认为问题出在事件上,也许dms发出这些类型的事件的方式已经改变了,但我不确定,我也毫无头绪。 - tom.js
1
我设法让它工作了,但我不确定这是否是你想要的。机器人必须先向用户发送至少一条DM。然后messageCreate会像往常一样触发。不确定是否有其他方法解决这个问题。我会进一步研究的。 - Skulaurun Mrusal
我在我的回答中写了一个完整的解决方案,你可以去看看。 - Skulaurun Mrusal
1个回答

49

确保您的客户端意图中包含DIRECT_MESSAGES

const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES", "DIRECT_MESSAGES"] });

Discord API v8中有一个重大变化。有关详细信息,请参见此处

在 Discord API v8 及更高版本中,DM 通道不会触发 CHANNEL_CREATE 事件,这意味着 discord.js 无法自动缓存它们。为了使您的机器人可以接收到私信消息,必须启用 CHANNEL partial。

因此我们还需要启用 CHANNEL partial。请注意,在处理partial data时,通常需要使用fetch来获取数据,因为数据不完整。但是,如果您正在使用messageCreate事件,则似乎不需要这样做。接收到的message不是部分消息,也不是message.channel。要检查某个对象是否为partial,您可以使用.partial属性。例如Message.partialChannel.partial

const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES", "DIRECT_MESSAGES"], partials: ["CHANNEL"] });

现在它应该像旧版的discord.js v12一样工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接