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 个小时:)
我正在为 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 个小时:)