Как я могу слушать упоминания Disord в каждом сообщении? - PullRequest
0 голосов
/ 03 января 2019

Я развил личную рознь и наткнулся на проблему с упоминаниями.

Я не понимаю, как собирать упоминания в сообщениях без выполнения команды. Это мой сценарий:

У меня есть команда, которая устанавливает личную заметку для пользователя, который использует команду - например, Msgstr "Задать, я вернулся 16:15". Моя цель - когда пользователь упоминается (и имеет активную заметку), бот должен ответить с заметкой.

Я знаю, как собирать упоминания в сообщении в сочетании с командой (используя свойство MentionedUsers). Однако я не знаю, как ВСЕГДА прислушиваться к упоминаниям, даже если команда не используется.

Я использую Discord .Net API. Я пытался искать это несколько дней, но в основном я обнаружил, что у людей возникли проблемы / они не знали о свойстве MentionedUsers в Context.Message.

Я пойду спать в любую минуту, поэтому проверю это утром и отвечу на ваши ответы / вопросы, если таковые имеются (Crossing thumbs)! Заранее спасибо.

Редактировать: Я надеюсь, что это нормально, но я понял, что это не был актуальный вопрос в посте. Здесь идет:

Как я всегда могу прослушать упоминания в сообщении, даже если не была выполнена команда?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

С помощью Theraot я снова начал реально смотреть на код и пытался понять, что на самом деле произошло.

Единственное, что я действительно делал, это делал метод, который выполнялся каждый раз, когда получалось сообщение (чтоЯ действительно не понимал, как включить упомянутых пользователей в метод), что сейчас я считаю очень глупым, потому что это было так легко.Ранее я не очень понимал, как работает message_recceive, поскольку первые 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 ипроверил, если у них была активная заметка.

Еще раз спасибо.:) Надеюсь, кому-то нужна такая же помощь, как и мне.

0 голосов
/ 03 января 2019

Я никогда не использовал 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, означающим, что вы можете проанализировать его так, как хотите.

См. Также : Как мне сделать, чтобы мой Discord C # отвечал на упоминания? , который показывает, как обращаться, когда упоминается ваш бот.

Я ничего не проверял из того, что я здесь говорю. Я никогда не использовал Discord.NET и до сих пор не использовал его. Возьмите с собой крупицу соли.

...