如何在每封邮件中收听Disord中的提及?

时间:2019-01-03 03:45:04

标签: c# discord discord.net

我已经形成了私人不和,偶然发现了有关提及的问题。

我不了解如何在不运行命令的情况下收集消息中的提及。这是我的情况:

我有一个命令,可为使用该命令的用户设置个人笔记-例如“!Setnote我回来了16:15”。我的目标是当提及用户(并具有有效的注释)时,机器人应以注释进行回复。

我知道与命令结合使用时如何收集消息中的提及(使用MentionedUsers属性)。但是,即使不使用命令,我也不知道如何始终听取提及。

我正在使用Discord .Net API。我已经尝试了几天,但是我发现大多数人遇到麻烦/不知道Context.Message中的MentionedUsers属性。

我会在任何时候上床睡觉,所以我会在早上检查这一点,并回答您的答案/问题(如果有的话)(交叉拇指)!预先感谢。

编辑:我希望这还可以,但是我意识到这不是帖子中的一个尖锐问题。来了:

即使没有执行命令,我怎么仍能始终收听消息中的提及?

2 个答案:

答案 0 :(得分:0)

我从未使用过Discord.NET ...因此,我想我会重复您已经知道的内容(我会保留它,因为我不知道其中有多少是合理的假设,也不知道有多少会帮助其他人)

根据我在文档和存储库中找到的内容,您可以创建一个客户端:

var client = new DiscordSocketClient();

然后挂接到MessageReceived(您还想调用LoginAsyncStartAsync)。

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获取了提及内容(如果有的话),并检查了它们是否具有有效的注释。

再次感谢。 :)我希望有人需要和我一样的帮助。