-
-
Notifications
You must be signed in to change notification settings - Fork 223
Longpool (получение событий)
Ivan M edited this page Oct 3, 2023
·
2 revisions
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, в этой версии была опечатка.