Награды за голосование
Награды за голосование используют Webhook-события server.vote и project.vote: обработчик получает событие, запрашивает данные голоса через API, находит пользователя в вашей системе и выдает награду только один раз.
Сначала настройте Webhook проекта и проверку signature. Данные голоса запрашиваются через GET /votes/:vote_id.
Как работает сценарий
- Примите событие Webhook и проверьте signature. Если is_test равен
true, верните204без запроса голоса и без выдачи награды. - Убедитесь, что
event_typeравенserver.voteилиproject.vote. - Используйте
event_idкак ID голоса. - Получите данные голоса через GET /votes/:vote_id и найдите игрока в своей системе.
- В одной транзакции примените защиту от повторной обработки по
event_type+event_idи выдайте награду только для нового события. - Если награду нельзя выдать безопасно, верните ответ с ошибкой. После исправления причины повторите доставку из интерфейса.
Пример выдачи награды
Допустим, игрок PlayerName проголосовал за сервер с ID 1, а ваша система должна начислить ему 100 монет.
- GAMEMONITORING отправляет Webhook с
event_type: server.voteиevent_id: 9824cabb-2203-437e-9b6c-aba43dde3e4b. - Обработчик проверяет signature. Если подпись неверная, он возвращает
401и останавливается. - Обработчик запрашивает
GET /votes/9824cabb-2203-437e-9b6c-aba43dde3e4b, получает никнейм, сервер и пользователя, затем находит локальный аккаунт. - В транзакции обработчик сохраняет
event_type+event_idдля защиты от повторной обработки. - Для нового события обработчик начисляет
100монет в той же транзакции. - При повторной доставке обработчик находит уже сохраненное событие, не начисляет награду повторно и возвращает
204.
Такой сценарий подходит не только для монет. Вместо баланса можно выдать предмет, роль, VIP-время, промокод или поставить задачу во внутреннюю очередь.
Событие голосования
Для голоса за сервер GAMEMONITORING отправляет server.vote, а для голоса за проект — project.vote. В теле события есть только данные доставки: event_type, event_id, is_test и signature. Полные данные голоса нужно запросить отдельно.
В обоих событиях event_id является ID голоса. Не используйте тело Webhook как источник никнейма, сущности или пользователя: эти данные приходят из API.
Получение данных голоса
Используйте event_id как vote_id и запросите данные голоса через GET /votes/:vote_id:
Для выдачи награды используйте response.entity_type и response.entity_id, чтобы определить цель голоса. Голос за сервер также содержит response.server, а голос за проект — response.project. Оба типа содержат response.nickname и публичные данные response.user.
response.nickname помогает найти аккаунт в вашей базе, response.entity_type и response.entity_id выбирают правило награды, а response.user.id можно сохранить в журнале выдач. Всегда проверяйте, что для server.vote API вернул entity_type: server, а для project.vote — entity_type: project.
Если API временно недоступен или вернул неожиданный ответ, не выдавайте награду без проверки. Верните код ошибки, исправьте причину и повторите доставку из интерфейса.
Шаг 3. Обработчик награды за голос
Пример продолжает базовый обработчик: он проверяет подпись, получает данные голоса, защищает событие от повторной обработки и начисляет награду в одной транзакции. Название таблицы пользователей, поле баланса и правило поиска игрока замените на структуру вашей системы.
Перед запуском примера настройте Webhook проекта, проверьте GET /votes/:vote_id и замените SQL-запросы обновления пользователя на вашу модель аккаунтов.