D2-LRG или как мне приспичило генерировать отчёты по турнирам

Собственно, наверное многие в курсе, что у меня наконец руки дошли доделать первую версию Dota 2 League Report Generator. Проект не очень большой, не особо важный в целом, но довольно важный для меня. Ниже я изложу причины, почему он вообще был создан, как был создан и какие идеи были заложены.



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

Собственно, когда была запущена страница Pro Circuit от Valve, я загорелся идеей сделать такой генератор отчётов, потому что меня задолбало. Сами отчёты я делал с оглядкой на Reddit и то, как их оформляют в постах из серии "Competitive Meta Trends". В целом я до сих пор оглядываюсь на эти посты, но некоторые вещи принципиально отличаются, да и генератора Markdown версии отчёта всё ещё нет.

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

Что вообще мне хотелось получить?

  • Возможность генерировать отчёты по "кастомным" лигам: спискам матчей, которые я вручную формирую (как это было с FPL)
  • Возможность полностью автоматизировать процесс получения списка матчей, данных о матчах, заполнения базы и создания отчёта
  • В отчёте добавить информацию о парах героев, статистику героев на разных позициях и граф комбинаций героев
  • Добавить индивидуальную статистику для команд
  • Добавить поддержку микс-турниров (вроде FPL, опять же)
  • Добавить поддержку матчей с ботами
  • Оформление в духе Pro Circuit
  • Красивую страницу Overview со всеми необходимыми данными
  • Поддержку переводов на разные языки
  • Поддержку разных режимов игры (Captains Draft, Captains Mode, All Draft)
А теперь поговорим о том, что я вообще сделал, как, а также в каких местах я облажался.

Сделал я набор скриптов, каждый из которых делает какую-то часть анализа. Почему всё разделено? Да чтобы не приходилось миллиард раз повторять какие-то операции, когда это не надо. Какие есть модули?
  • init - создаёт базу данных, запрашивает список матчей, отсекает лишнее, создаёт файл с параметрами для анализатора
  • fetcher - учитывает параметры анализатора, запрашивает матчи с OpenDota (и кэширует их), после чего заполняет базу данных этими матчами. Помимо этого ещё заполняет базу игроков и команд
  • analyzer - бомбардирует базу запросами, вытаскивая все нужные данные и рассчитывая показатели, формирует один большой отчёт и сохраняет его в JSON
  • web view - кидается на веб сервер, открывает файлы отчётов от анализатора и показывает, как они выглядят вообще и что в них есть
Всё это написано на PHP, в качестве базы используется MySQL. Почему? Да хрен его знает. В первую очередь мне хотелось всё это реализовать, а уже потом думать над тем, как это всё переписывать, но по ходу дела мне стало всё равно: меня самого всё устраивает, а это волнует больше всего. В идеале, впрочем, лучше было написать это на Python/Node.JS + PostgreSQL. Ну, впрочем, не важно уже.

Главные проблемы, с которыми я столкнулся:
  • Переводы сделаны были слишком лениво и их надо переписывать, а мне в падлу
  • Я написал веб-модуль достаточно "прямолинейно", что было не самой лучшей идеей. Если бы я придерживался парадигмы MVC, было бы намного проще сделать потом и другие варианты отображения (например генератор Markdown-отчётов), но вместо этого я сделал лишь огромный и нечитабельный код, который ещё и сложно переписывать. Одна из моих главных задач сейчас -- переписать всё как следует
  • Я думал привлечь внимание к проекту на Reddit, да и думал, что отчёты и статистика будут интересны людям (во всяком случае, посты по другим турнирам заходили нормально). Тут же мои посты по теме просто остались незамеченными и тут уже не совсем ясно, где именно косяк: либо надо было делать Markdown-отчёты, чтобы пользователям не приходилось нажимать на лишнюю ссылку, либо формулировать заголовки более интересно, либо делать картиночки на основе отчётов (и загружать скриншоты отчёта на imgur), а возможно я просто публиковал посты в то время, когда их никто не видел
  • Любая модификация внутренней структуры базы повлечёт за собой несовместимость версий, а я не хочу терять совместимость старых отчётов с новым отображением. С этим придётся повозиться
Есть, конечно, один большой плюс: это лишний опыт, дополнительный контент, да и в целом, когда я перепишу веб-часть как следует, будет отличный и модифицируемый инструмент, который можно будет ещё и (в теории) легко переписывать под собственные нужды или вообще другие игры. В Trello я описываю все планы на будущее (и ближайшие версии), но также в будущем я планирую либо прикрутить свой разборщик реплеев, либо от OpenDota, чтобы можно было работать с записями локальных турниров. Это вообще сделает LRG незаменимым для микс-турниров. Ну а пока, наверное, я сделаю паузу и просто буду фиксить баги, которые оставил после себя.