2017-03-09 78 views
1

我正在为Discrod服务器创建自己的机器人。到目前为止,我已经设法给它像“!roll”这样的命令进入聊天,并且bot抓到它回复“你已经6点”进入聊天。不和谐:如何捕捉用户到机器人的直接消息?

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

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

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

+0

可以使机器人删除命令消息。 – Pipe

+0

是的,我正在考虑将其作为一种解决方案,以免我找不到直接信息的答案。虽然我仍然更喜欢直接消息解决方案,因为在某些情况下,我希望机器人也能够直接回复消息,以避免发送频道垃圾邮件。感谢您的建设性答复! – Andrew

回答

2

一种解决方案可以使用委托/事件处理器

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 +。

1

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

看来SocketMessage.Channel属性从SocketTextChannel更改为SocketDMChannel,具体取决于源。以下是我确定邮件是否为DM的方法。

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

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