Discord:如何捕捉从用户到机器人的直接消息?

Discord: how to catch direct message from user to bot?

我正在为 Discrod 服务器创建自己的机器人。到目前为止,我已经成功地向它发送了诸如“!roll”之类的命令到聊天中,并且机器人也捕获了它对聊天的回复 "you rolled 6"。

client.UsingCommands(input => { input.PrefixChar = '!' });
command.CreateCommand("roll").Do(async (e) => { 
  await channel.SendMessage(username + " rolls " + rng.Next(1, 7)) });

但我不喜欢人们在聊天中输入命令的方式,因为这在某些时候可能会造成干扰。我想创造一种可能性,通过从用户到机器人的直接消息来调用命令。你会 DM 机器人 "roll",它会写信给聊天 "andrew rolled 1"。

但我不知道该怎么做,甚至不知道是否可能。有什么想法吗?

一个解决方案可能是使用 Delegates/EventHandlers

    var client = new DiscordClient();
        client.MessageCreated += (s, e) =>
            {
                if (!e.Message.IsAuthor && e.Message.ToLower().Contains("roll")){
/*Code here*/
}       
            }
            EventHandler<MessageEventArgs> handler = new EventHandler<MessageEventArgs>(HandleMessageCreated);
            client.MessageCreated += handler;

只需确保将此 delegate/EventHandler 代码放在命令服务设置下方,当有人 !roll 时,机器人不会加倍 post。
此外,您可以在通道对象上使用 IsPrivate 变量来检查通道上发送的消息是否为 DM/PM 通道。

如果您需要 Discord.NET v0.9.6 的文档,here 是。

此外,您可能需要考虑改用 Discord.NET v1.0.0+。

我在网上找到的当前答案令人沮丧,我就是这样做的(找不到任何参考 "Context" 人们一直在说的,或 "IsPrivate")。必须通过检查对象本身来弄清楚这些东西。

SocketMessage.Channel 属性 似乎从 SocketTextChannel 更改为 SocketDMChannel,具体取决于来源。以下是我确定一条消息是否是 DM 的方法。

private bool IsPrivateMessage(SocketMessage msg) {
    return (msg.Channel.GetType() == typeof(SocketDMChannel));
}

希望这可以帮助别人节省我浪费的 5 个小时:)