Все кейсы

Руководитель разработки

ESports Turbo

Сайт турниров по Dota 2 и панель судьи с событиями матча в реальном времени.

Проект под NDA — детали архитектуры и код готов разобрать голосом.

Протокол матча в панели судьи: события Dota 2 приходят по вебсокету и ложатся в таблицу с игровым временем и счётом. Соседняя кнопка собирает из этой же таблицы файл Excel для организаторов.
Протокол матча в панели судьи: события Dota 2 приходят по вебсокету и ложатся в таблицу с игровым временем и счётом. Соседняя кнопка собирает из этой же таблицы файл Excel для организаторов.

Панель судьи и сайт турниров ESports Turbo.

2024 · техлид и fullstack-разработчик

Моя роль

Отвечал за архитектуру, NestJS-бэкенд, панель на Next.js, схему данных и деплой. Согласовывал события с разработчиком режима Dota 2 на Lua, ревьюил и принимал работу подрядчика по GSI. Релизы планировал вокруг расписания эфиров.

Данные из игры
Сбор состояния матча и событий из Dota 2
Панель судьи
События, счёт и выгрузка протокола
Турнирный день
Расписание, команды и результаты матчей

Задача бизнеса

Судья переносил события из трансляции в таблицу вручную. Протокол расходился с картинкой, а в конце дня нужен был файл для организаторов. Автоматизацию приходилось внедрять во время ежедневных турниров: эфиры шли с 07:00 до 16:00, окно релиза — после последнего матча.

Данные из игры

Два источника для одного протокола

GSI передаёт состояние от клиента наблюдателя, а кастомный режим на Lua отправляет отдельные события, счёт и таймер. Потоки связываются с матчем на стороне бэкенда.

  1. GSI

    Состояние карты от клиента наблюдателя.

  2. Lua

    Точечные события из кастомного режима.

  3. NestJS

    Обработка и привязка к идентификатору матча.

  4. Панель

    События и счёт в рабочем месте судьи.

Жизненный цикл матча

Бэкенд распознаёт начало и конец по состояниям игры. Старт нового матча принудительно закрывает предыдущий, после победы логи очищаются через минуту.

Протокол в игровом времени

Событие хранит идентификатор матча, игровое время, счёт и состояние игры. Эти же данные используются в таблице и выгрузке.

Панель судьи

Рабочий экран вместо ручного протокола

На одной странице собраны события на русском, счёт, таймер и место для трансляции. Судья сверяет происходящее в матче и получает файл для организаторов из той же таблицы.

Карточки счёта, игровое время и отметка LIVE обновляются из общей сущности матча, а ниже идёт закупка предметов по игрокам обеих сторон.
Карточки счёта, игровое время и отметка LIVE обновляются из общей сущности матча, а ниже идёт закупка предметов по игрокам обеих сторон.

16 типов событий

Первая кровь, гонки на убийства, башни и бараки, Рошан, терзатель, мегакрипы и руны — состав протокола согласован с оператором турниров.

Выгрузка в Excel

Файл формируется на клиенте: время события, матч, игровое время, счёт, состояние и названия команд. Отдельно переписывать итог дня не нужно.

Инженерные детали
  • Задержка относительно эфира

    Локальный ресендер придерживает пакеты GSI на заданное число секунд. Так можно согласовать протокол с трансляцией, которая идёт с задержкой.

  • Два стенда

    Панель закрыта авторизацией, stage отделён от production. Правки проверяются на тесте, пока основной стенд обслуживает турнир.

Турнирный день

Расписание турнира и результаты матчей

В панели переход к протоколу начинается с даты и строки матча. Публичная часть показывает ход турнирного дня: групповой этап, финал, команды и положение в группе.

Результаты из завершённых матчей

Очки и разница игр рассчитываются на фронтенде по завершённым матчам.

Расписание турнирного дня: судья выбирает дату в календаре и переходит из строки матча прямо в протокол.
Расписание турнирного дня: судья выбирает дату в календаре и переходит из строки матча прямо в протокол.
Страница турнирного дня на публичном сайте: матчи группового этапа и финала, составы команд и таблица группы. Очки и разница игр считаются на фронтенде из завершённых матчей.
Страница турнирного дня на публичном сайте: матчи группового этапа и финала, составы команд и таблица группы. Очки и разница игр считаются на фронтенде из завершённых матчей.
Ещё экраны (1)
Публичный сайт лиги: ежедневные турниры Dota 2 Turbo, к которым подключён протокол, и заявка на форматы 1×1 и CS2.
Публичный сайт лиги: ежедневные турниры Dota 2 Turbo, к которым подключён протокол, и заявка на форматы 1×1 и CS2.

Результат

События матча — в панели судьи и Excel

Разработал бэкенд и панель судьи: события из Dota 2 попадают в протокол матча и выгрузку Excel. Согласовал форматы данных с разработчиками интеграций и выпускал обновления между эфирами.

2
независимых источника данных: GSI и кастомный режим — если один отваливается, протокол живёт на втором
16
типов событий матча в протоколе

Стек

  • Next.js
  • TypeScript
  • NestJS
  • TypeORM
  • PostgreSQL
  • WebSocket
  • Dota 2 GSI
  • Strapi
  • MongoDB
  • Docker