C# 我怎样才能在每条信息中听到不一致的提及?
我私下产生了不和,偶然发现了一个关于提及的问题 我完全不知道如何在不运行命令的情况下收集消息中提到的内容。这是我的设想: 我有一个命令,可以为使用该命令的用户设置个人备忘,例如“!Setnote I'm back 16:15”。我的目标是当一个用户被提及(并且有一个活动的注释)时,机器人应该用注释回复 我知道如何在与命令组合时收集消息中的提及(使用属性sinetiedUsers)。一、 然而,即使没有使用命令,我也不知道如何始终倾听提及 我正在使用Discord.NETAPI。我已经试着找了好几天了,但我发现大多数人都有问题/不知道Context.Message中提到的属性 我随时准备睡觉,所以我会在早上检查,如果有任何问题,我会回答你的答案/问题(交叉拇指)!提前谢谢 编辑:我希望这没问题,但我意识到这不是一个尖锐的问题。下面是:C# 我怎样才能在每条信息中听到不一致的提及?,c#,discord,discord.net,C#,Discord,Discord.net,我私下产生了不和,偶然发现了一个关于提及的问题 我完全不知道如何在不运行命令的情况下收集消息中提到的内容。这是我的设想: 我有一个命令,可以为使用该命令的用户设置个人备忘,例如“!Setnote I'm back 16:15”。我的目标是当一个用户被提及(并且有一个活动的注释)时,机器人应该用注释回复 我知道如何在与命令组合时收集消息中的提及(使用属性sinetiedUsers)。一、 然而,即使没有使用命令,我也不知道如何始终倾听提及 我正在使用Discord.NETAPI。我已经试着找了好几
即使没有执行任何命令,我怎么能总是听到消息中提到的内容?我从未使用过Discord.NET。。。因此,我想我会重复你已经知道的东西(我会保留它,因为我不知道它有多少是合理的假设,也不知道它有多少可能帮助别人) 根据我在文档和存储库中找到的内容,您可以创建一个客户端:
var client = new DiscordSocketClient();
然后钩住MessageReceived
(您还需要调用LoginAsync
和StartAsync
)
然后您可以阅读SocketMessage.ReferencedUsers
(您提到的您已经知道如何做),这将是所提到的用户的集合(SocketUsers
)。我猜你会搜索它,然后发现它是否与你的列表相交。。。假设您通过名称识别它们,并且有一个方法UsersWithNotes
,该方法返回一个IEnumerable
,其中包含您想要匹配的名称,您可以执行以下操作:
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.ReferencedUsers
,则不管这些检查结果如何,都要这样做
注意:显然,您的机器人也会收到它发送的消息,因此您可能仍希望从自身过滤掉消息。此外,您还可以使用message.Content
获取消息文本,这意味着您可以根据需要对其进行解析
另请参见:它显示了在提到您的机器人时如何处理
我在这里所说的话,我什么也没试过。我从来没有用过Discord.NET,现在也没有用过。有了Theraot的帮助,我开始重新审视代码,并试图理解到底发生了什么 我真正做的唯一一件事就是制作一个每次收到消息时都会执行的方法(我真正不明白的是如何让提到的用户加入这个方法),现在我觉得这个方法很愚蠢,因为它感觉很简单。早些时候,我并不真正理解收到的消息是如何工作的,因为前100行代码只是让bot运行的模板,之后我编写了自己的命令 我删除了下面的一些代码行,以便对其进行进一步清理,从而使最有用的代码行脱颖而出:
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.CheckIfUserisMentured)中,我使用context.Message.ReferenceUsers获取了提及(如果有),并检查它们是否有活动的注释
再次感谢。:)我希望有人和我一样需要帮助。晚安。。。“问题”将在早上结束,因为伊藤没有问题,废话!我甚至没有意识到。谢谢你提到这一点。谢谢你提供了大量的信息。我试图学习的是阅读API文档并真正理解它们。我每天都这样做,因为这显然是必须的。我已经尝试过收到的消息,但是你让我再次查看代码,我想我在收到你的信息后有了一个计划!我很感谢你的回答,我希望我能用这些信息想出一个解决方案。
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);
}