我已经形成了私人不和,偶然发现了有关提及的问题。
我不了解如何在不运行命令的情况下收集消息中的提及。这是我的情况:
我有一个命令,可为使用该命令的用户设置个人笔记-例如“!Setnote我回来了16:15”。我的目标是当提及用户(并具有有效的注释)时,机器人应以注释进行回复。
我知道与命令结合使用时如何收集消息中的提及(使用MentionedUsers属性)。但是,即使不使用命令,我也不知道如何始终听取提及。
我正在使用Discord .Net API。我已经尝试了几天,但是我发现大多数人遇到麻烦/不知道Context.Message中的MentionedUsers属性。
我会在任何时候上床睡觉,所以我会在早上检查这一点,并回答您的答案/问题(如果有的话)(交叉拇指)!预先感谢。
编辑:我希望这还可以,但是我意识到这不是帖子中的一个尖锐问题。来了:
即使没有执行命令,我怎么仍能始终收听消息中的提及?
答案 0 :(得分:0)
我从未使用过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,但至今仍未使用过。撒一粒盐。
答案 1 :(得分:0)
在Theraot的帮助下,我开始真正地重新查看代码,并试图了解实际发生的情况。
我唯一真正做的就是制作一个方法,该方法每次接收到一条消息就执行一次(我真正不了解的是如何使提到的用户加入该方法),现在我发现这很愚蠢,因为它感觉很容易。早些时候我并不真正了解message_recieved的工作方式,因为前100行代码只是使机器人运行的模板,然后我编写了自己的命令。
我删除了一些下面的代码行,以对其进行更多清理,以便使最有用的行脱颖而出:
private async Task Client_MessageReceived(SocketMessage messageParams)
{
var message = messageParams as SocketUserMessage;
var context = new SocketCommandContext(Client, message);
if (context.Message == null || context.Message.Content == "")
return;
if (context.User.IsBot)
return;
NoteCommands.CheckIfUserIsMentioned(context);
var result = await _commands.ExecuteAsync(context, argPos);
}
然后在方法(Notecommands.CheckIfUserIsMentioned)中,我使用context.Message.MentionedUsers获取了提及内容(如果有的话),并检查了它们是否具有有效的注释。
再次感谢。 :)我希望有人需要和我一样的帮助。