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

Posted

技术标签:

【中文标题】Discord:如何捕获从用户到机器人的直接消息?【英文标题】:Discord: how to catch direct message from user to bot? 【发布时间】:2017-07-30 21:30:28 【问题描述】:

我正在为 Discrod 服务器创建自己的机器人。到目前为止,我已经设法在聊天中向它发出“!roll”之类的命令,机器人捕捉到它也在聊天中回复“you roll 6”。

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

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

但我不知道如何做到这一点,或者是否有可能。有什么想法吗?

【问题讨论】:

可以让bot删除命令信息。 是的,我正在考虑将其作为一种解决方案,以防我找不到直接消息的答案。尽管我仍然更喜欢直接消息解决方案,因为在某些情况下,我希望机器人也可以直接消息回答以避免频道垃圾邮件。感谢您的建设性回复! 【参考方案1】:

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

根据来源,SocketMessage.Channel 属性似乎从 SocketTextChannel 更改为 SocketDMChannel。以下是我确定消息是否为 DM 的方法。

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

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

【讨论】:

更简单的方法:msg.Channel is SocketDMChannel【参考方案2】:

一种解决方案可能是使用 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;

只需确保将此委托/事件处理程序代码放在命令服务设置下方,当有人这样做!roll 时,机器人不会重复发布。 另外,您可以在频道对象上使用IsPrivate 变量来检查频道上发送的消息是否为DM/PM 频道。

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

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

【讨论】:

以上是关于Discord:如何捕获从用户到机器人的直接消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户帐户获取/获取消息 (discord.py)

Discord bot 从用户消息中获取照片

如何使用 discord.js 从 discord bot 向特定用户发送消息

从反应 discord.js 中获取消息 ID

Discord.js:如何发送消息并从中收集反应

使用 Discord 机器人,我如何从另一个机器人获取嵌入消息的字符串