Skip to content

Longpool (получение событий)

Ivan M edited this page Oct 3, 2023 · 2 revisions

!!! Этот функционал доступен начиная с VkNet 1.76

Для сообществ

var longPoll = new BotsLongPollUpdatesHandler(new(_api, _groupId)
{
    // Вы можете сохранять Ts от последнего обработанного события и при перезапуске бота вставлять его сюда, чтобы ничего не пропустить.
    Ts = null,
    // Если вернуть в этой функции true, то получение событий будет приостановлено
    GetPause = () => false,
    // Сюда приходят критические ошибки, которые могут помешать получению событий. Рекомендуется отправлять их в логгер.
    OnException = (exception) => 
    {
        // TODO Отправлять ошибку в логгер
    },
    // Сюда приходят ошибки, при которых получение событий продолжит работать стабильно.
    OnWarn = (exception) =>
    {
        switch (exception)
        {
            case PublicServerErrorException:
            case HttpRequestException:
            case SocketException:
            {
                // Игнорируем ошибки, связанные с интернетом или сервером ВКонтакте
                return;
            }
            default:
            {
                // TODO Отправлять ошибку в логгер
                return;
            }
        }
    },
    // Сюда приходят все события
    OnUpdates = (e) =>
    {
        // Отделяем GroupUpdate от Exception
        var updates = new List<GroupUpdate>();

        foreach (var updateEvent in e.Updates)
        {
            if (updateEvent.Update is not null)
            {
                updates.Add(updateEvent.Update);
                continue;
            }

            if (updateEvent.Exception is null)
            {
                continue;
            }

            // Тут бывает ошибка сериализации JSON, если ВК пришлёт что-то странное.
            // TODO Отправлять ошибку в логгер
        }

        if (!updates.Any())
        {
            // если событий нет
            return;
        }

        // Пример: получаем новые сообщения
        var newMessages = updates.Where(x => x.Instance is MessageNew)
            .Select(x => x.Instance as MessageNew);
        // TODO Обработать полученные события
    }
});
// Запускаем отслеживание событий
await longPoll.RunAsync();

Для пользователей

var longPoll = new UsersLongPollUpdatesHandler(new(_api)
{
    // Вы можете сохранять Pts от последнего обработанного события и при перезапуске бота вставлять его сюда, чтобы ничего не пропустить.
    Pts = null,
    // Если вернуть в этой функции true, то получение событий будет приостановлено
    GetPause = () => false,
    // Сюда приходят критические ошибки, которые могут помешать получению событий. Рекомендуется отправлять их в логгер.
    OnException = (exception) => 
    {
        // TODO Отправлять ошибку в логгер
    },
    // Сюда приходят ошибки, при которых получение событий продолжит работать стабильно.
    OnWarn = (exception) =>
    {
        switch (exception)
        {
            case PublicServerErrorException:
            case HttpRequestException:
            case SocketException:
            {
                // Игнорируем ошибки, связанные с интернетом или сервером ВКонтакте
                return;
            }
            default:
            {
                // TODO Отправлять ошибку в логгер
                return;
            }
        }
    },
    // Сюда приходят все события
    OnUpdates = (e) =>
    {
        // Отделяем Message от Exception
        var messages = new List<Message>();

        foreach (var messageEvent in e.Messages)
        {
            if (messageEvent.Message is not null)
            {
                messages.Add(messageEvent.Message);
                continue;
            }

            if (messageEvent.Exception is null)
            {
                continue;
            }

            // Тут бывает ошибка сериализации JSON, если ВК пришлёт что-то странное.
            // TODO Отправлять ошибку в логгер
        }

        if (!messages.Any())
        {
            // если сообщений нет
            return;
        }

        // TODO Обработать полученные сообщения
    }
});
// Запускаем отслеживание событий
await longPoll.RunAsync();

Если у вас старая версия (VkNet 1.76) переименуйте LongPoll на LongPool, в этой версии была опечатка.