ESports Turbo
Сайт турниров по Dota 2 и панель судьи с событиями матча в реальном времени.
Проект под NDA — детали архитектуры и код готов разобрать голосом.

Панель судьи и сайт турниров ESports Turbo.
2024 · техлид и fullstack-разработчик
Моя роль
Отвечал за архитектуру, NestJS-бэкенд, панель на Next.js, схему данных и деплой. Согласовывал события с разработчиком режима Dota 2 на Lua, ревьюил и принимал работу подрядчика по GSI. Релизы планировал вокруг расписания эфиров.
- Данные из игры
- Сбор состояния матча и событий из Dota 2
- Панель судьи
- События, счёт и выгрузка протокола
- Турнирный день
- Расписание, команды и результаты матчей
Задача бизнеса
Судья переносил события из трансляции в таблицу вручную. Протокол расходился с картинкой, а в конце дня нужен был файл для организаторов. Автоматизацию приходилось внедрять во время ежедневных турниров: эфиры шли с 07:00 до 16:00, окно релиза — после последнего матча.
Данные из игры
Два источника для одного протокола
GSI передаёт состояние от клиента наблюдателя, а кастомный режим на Lua отправляет отдельные события, счёт и таймер. Потоки связываются с матчем на стороне бэкенда.
GSI
Состояние карты от клиента наблюдателя.
Lua
Точечные события из кастомного режима.
NestJS
Обработка и привязка к идентификатору матча.
Панель
События и счёт в рабочем месте судьи.
Жизненный цикл матча
Бэкенд распознаёт начало и конец по состояниям игры. Старт нового матча принудительно закрывает предыдущий, после победы логи очищаются через минуту.
Протокол в игровом времени
Событие хранит идентификатор матча, игровое время, счёт и состояние игры. Эти же данные используются в таблице и выгрузке.
Панель судьи
Рабочий экран вместо ручного протокола
На одной странице собраны события на русском, счёт, таймер и место для трансляции. Судья сверяет происходящее в матче и получает файл для организаторов из той же таблицы.

16 типов событий
Первая кровь, гонки на убийства, башни и бараки, Рошан, терзатель, мегакрипы и руны — состав протокола согласован с оператором турниров.
Выгрузка в Excel
Файл формируется на клиенте: время события, матч, игровое время, счёт, состояние и названия команд. Отдельно переписывать итог дня не нужно.
Инженерные детали
Задержка относительно эфира
Локальный ресендер придерживает пакеты GSI на заданное число секунд. Так можно согласовать протокол с трансляцией, которая идёт с задержкой.
Два стенда
Панель закрыта авторизацией, stage отделён от production. Правки проверяются на тесте, пока основной стенд обслуживает турнир.
Турнирный день
Расписание турнира и результаты матчей
В панели переход к протоколу начинается с даты и строки матча. Публичная часть показывает ход турнирного дня: групповой этап, финал, команды и положение в группе.
Результаты из завершённых матчей
Очки и разница игр рассчитываются на фронтенде по завершённым матчам.
Результат
События матча — в панели судьи и Excel
Разработал бэкенд и панель судьи: события из Dota 2 попадают в протокол матча и выгрузку Excel. Согласовал форматы данных с разработчиками интеграций и выпускал обновления между эфирами.
- 2
- независимых источника данных: GSI и кастомный режим — если один отваливается, протокол живёт на втором
- 16
- типов событий матча в протоколе
Стек
- Next.js
- TypeScript
- NestJS
- TypeORM
- PostgreSQL
- WebSocket
- Dota 2 GSI
- Strapi
- MongoDB
- Docker


