不和谐:如何捕获从用户到僵尸的直接消息?

时间:2017-03-09 18:42:24

标签: c# bots discord discord.net

我正在为Discrod服务器创建自己的机器人。到目前为止,我已经成功地将“!roll”这样的命令发送到聊天中,机器人抓住它回复“你滚动6”到聊天中。

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

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

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

2 个答案:

答案 0 :(得分: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;

请确保将此委托/ EventHandler代码放在Command Services设置下方,并且当有人!roll时,机器人不会双重发布。
此外,您可以在通道对象上使用IsPrivate变量来检查通道上发送的消息是否是DM / PM通道。

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

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

答案 1 :(得分:2)

我在网上找到的当前答案令人沮丧,这就是我做到的方式(无法找到任何对#34; Context&#34的引用;人们一直在说,或者#34; IsPrivate&#34 )。不得不通过检查对象本身来解决这个问题。

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

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

希望这有助于某人节省5小时,这浪费了我:)