如何在 Discord.js 中检查消息是否为私信?

The*_*1er 8 javascript discord discord.js

目前我使用的是最新版本的Discord.js (v13.1.0)

我希望能够检测某条消息是否是 DM。我尝试创建一个messageCreate事件并执行 if 语句来检查该通道是否是 DM

client.on('messageCreate', message => {
   if (message.channel.type == 'DM') {
      console.log('Dm recieved!')
   }
})
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这不起作用。所以我不知道会发生什么。

这是我的intents

[Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.DIRECT_MESSAGES]

顺便说一句,该事件确实有效:

client.on('messageCreate', message => {
   console.log('Event')
}
Run Code Online (Sandbox Code Playgroud)

Can*_*ide 10

我之前也遇到过这个问题;我深入研究了discord.js v12 和 v13 之间的变化并找出了原因。

正如在 Discordjs.guide 网页上看到的,网页专门介绍了更新之间的重大更改:

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

对于处理 DM 消息这一非常重要的功能,该通知很难找到。它只是直接提及该CHANNEL_CREATE事件,但基本上意味着您的机器人根本无法接收 DM,除非CHANNEL在您的客户端选项中启用了部分功能。

以下是如何执行此操作的示例:

const client = new Discord.Client({ partials: ["CHANNEL"], intents: [...] });
Run Code Online (Sandbox Code Playgroud)

您需要将该partials属性添加到Client构造函数中才能接收 DM。这样做之后,您的代码将正常工作。

  • 我不确定他们是否意味着该活动正在*为 DM* 运行,或者只是一般情况下运行,例如他们是否使用公会消息对其进行了测试。他们没有提到在他们的问题中启用了部分,所以这可能是原因。我想我们会看到的。 (2认同)