【问题标题】:How can I listen to mentions in Disord in every message?如何在每条消息中收听 Discord 中的提及?
【发布时间】:2019-05-29 16:13:36
【问题描述】:

我产生了一个私人不和谐,并偶然发现了一个关于提及的问题。

我对如何在不运行命令的情况下收集消息中的提及项的理解为零。这是我的场景:

我有一个命令,它为使用该命令的用户设置个人注释 - 例如“!Setnote 我回来了 16:15”。我的目标是当提到用户(并且有一个活跃的笔记)时,机器人应该回复该笔记。

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

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

我马上就要睡觉了,所以我会在早上检查这个,如果有任何答案/问题,我会回复您(交叉拇指)!提前致谢。

编辑:我希望这还不错,但我意识到这不是帖子中的一个 acualt 问题。这里是:

即使没有执行命令,我如何才能始终收听消息中的提及?

【问题讨论】:

  • 晚安......“问题”将在早上关闭,因为它没有问题
  • 哦,废话!我什至没有意识到。感谢您提及。

标签: c# discord discord.net


【解决方案1】:

我从未使用过 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,我仍然没有使用它。带上一粒盐。

【讨论】:

  • 感谢您提供大量信息的巨大答案。我想要学习的是阅读 API 文档并真正理解它们。我每天都这样做,因为这显然是必须的。我已经对 message_recieved 进行了试验,但你让我再次查看代码,我想我在你的信息后有一个计划!非常感谢您的回答,我希望我能根据这些信息提出解决方案。
【解决方案2】:

在 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 获取提及(如果有),并检查他们是否有活动备注。

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

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2020-11-22
    • 2018-09-23
    • 1970-01-01
    • 2021-04-05
    • 2019-08-12
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多