1

我正在为 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 机器人“滚动”,它会写入聊天“安德鲁滚动 1”。

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

4

2 回答 2

3

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

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

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

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

于 2017-12-03T08:31:13.030 回答
3

一种解决方案可能是使用委托/事件处理程序

    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 的文档,请点击此处

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

于 2017-03-11T16:18:36.670 回答