Discord.NET Если к сообщению прикреплен файл, дождитесь его загрузки и удалите его.

Моя проблема в следующем; Я делаю бота с Discord.NET 1.0.2, который, когда пользователь отправляет сообщение, проверяет, есть ли прикрепленный к этому сообщению файл, а затем удаляет его. Теперь я сделал это, но есть одна проблема с этим. Сообщение не будет удалено, пока файл не будет загружен. Я пробовал разные способы, но не могу найти решение, как дождаться загрузки файла, а затем удалить сообщение. Любая помощь приветствуется. Вот с чем я работаю:

private async Task CheckForImageMessage(SocketMessage s)
{
        var msg = s as SocketUserMessage;
        if (msg == null) return;
        var context = new SocketCommandContext(_client, msg);
        if (context.Message.Attachments.ElementAt(0) != null)
        {

        }
    }
}

person Coder's Crux    schedule 03.03.2019    source источник


Ответы (1)


Прежде всего, вы не создаете команду, поэтому у вас очень мало причин вообще использовать командный контекст — сообщение уже доступно вам как s (коллекция Attachments существует под интерфейсом IMessage).

Во-вторых, вы не можете перехватывать сообщения до загрузки файла. Если я правильно понял, вы хотите удалить все сообщения с вложениями? Если это так, метод Any на Attachments коллекция подойдет.

private async Task RemoveAttachmentMsgsAsync(SocketMessage msg)
{
    // check if the source channel is a message channel in a guild
    if (msg.Channel is SocketTextChannel textChannel)
    {
        // get the current user to check for permissions
        var currentUser = textChannel.Guild.CurrentUser;
        // bail if the bot does not have manage message permission
        if (!currentUser.GetPermissions(textChannel).ManageMessages) return;
    }
    // if we made it this far, we can assume that the bot has permission for
    // the channel (including DM channel)
    // use LINQ Any to check if the attachment contains anything
    if (msg.Attachments.Any())
        await msg.DeleteAsync();
}
person Still    schedule 03.03.2019
comment
С этим есть одна проблема, и она заключается в том, что я подписываю это событие на делегат MessageReceived, поэтому после получения сообщения файл не был загружен, и я не могу удалить сообщение, пока оно не будет загружено. Вот почему мне нужно было проверить, когда файл загружен, а затем удалить его. - person Coder's Crux; 03.03.2019
comment
Что ты имеешь в виду? Сообщение не может быть получено, если сообщение даже не было отправлено. Как вы ожидаете, что WebSocket Discord предоставит то, чего они даже не получили? - person Still; 03.03.2019