首页 > 解决方案 > 当我向我的机器人发送 DM 时,事件 messageCreate 没有触发/发射(discord.js v13)

问题描述

我制作了这段代码来记录发送到我的机器人的 DM:

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”,所以我在我的代码中更改了它,但它仍然无法正常工作,我真的不知道为什么。

标签: javascriptnode.jsdiscorddiscord.js

解决方案


确保您DIRECT_MESSAGES符合客户的意图。

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

Discord API v8 中有一个重大变化。参考请看这里

在 Discord API v8 及更高版本上,DM 通道不会发出CHANNEL_CREATE事件,这意味着 discord.js 无法自动缓存它们。为了让您的机器人接收 DM,CHANNEL必须启用部分。

所以我们也需要启用部分功能CHANNEL。请记住,在处理部分数据时,您通常希望获取数据,因为它不完整。但是,如果您正在使用该事件,这似乎不是您的情况messageCreate。收到的message不偏也不message.channel。要检查某些内容是否不完整,您可以使用该.partial属性。例如Message.partialChannel.partial

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

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


推荐阅读