我从未使用过 Discord.NET...因此,我想我会重复您已经知道的内容(我会保留它,因为我不知道其中有多少是合理的假设,也不知道有多少可能对其他人有帮助) .
根据我在文档和存储库中找到的内容,您可以创建一个客户端:
var client = new DiscordSocketClient();
然后挂钩到MessageReceived(你也想调用LoginAsync和StartAsync)。
client.MessageReceived += MessageReceived;
Task MessageReceived(SocketMessage message)
{
// ...
}
然后你可以阅读SocketMessage.MentionedUsers(你提到你已经知道怎么做),这将是提到的用户(SocketUser)的集合。我猜你会搜索它并找到它是否与你的列表相交......假设你通过名称识别它们,并且有一个方法 UsersWithNotes 返回一个带有你想要匹配的名称的 IEnumerable<string>,你可以做这样的事情:
Task MessageReceived(SocketMessage message)
{
// ...
var foundUsers = message.MentionedUsers.Select(u => u.Username).Intersect(UsersWithNotes());
// ...
}
查看源代码中的示例,似乎 SocketMessage 获取了所有消息,然后您继续过滤掉命令。示例:
async Task HandleCommandAsync(SocketMessage messageParam)
{
// Filter out system messages
var message = messageParam as SocketUserMessage;
if (message == null)
{
return;
}
// Filter out non commands
int argPos = 0;
if (!(message.HasCharPrefix('!', ref argPos) ||
message.HasMentionPrefix(_client.CurrentUser, ref argPos)) ||
message.Author.IsBot)
return;
//...
}
好吧,如果您需要阅读所有消息中的SocketMessage.MentionedUsers,那么不管进行这些检查。
注意:显然,您的机器人也会收到它发送的消息,因此您可能仍希望过滤掉来自自身的消息。此外,您可以使用message.Content 获取消息的文本,这意味着您可以随意解析它。
另请参阅:How can I have my Discord C# respond to mentions?,它显示了当您的机器人被提及时如何处理。
我没有测试我在这里所说的内容。我从来没有使用过 Discord.NET,我仍然没有使用它。带上一粒盐。