История создания одного CHPP-приложения для Hattrick.org…
Всё началось с того, что я откликнулся на призыв тренера старшей сборной России (Spirit_of_Gold) о помощи в доработке трекера игроков сборных онлайнового футбольного менеджера Hattrick.org. С этой помощью особо не получилось – трекер уже писался на PHP, а я уже года с 2005 на нем ничего серьезного не делал и давно уже специализируюсь на ASP.NET. Тогда Spirit_of_Gold предложил писать что-нибудь другое, например, сайт со статистикой сборных – сначала России, а в будущем и всех остальных стран. Мне эта идея тоже показалась интересной (давно хотел попробовать что же за зверь такой — CHPP) и работа началась. Был конец февраля 2012 года.
Сразу же столкнулся с небольшой проблемой – готовых фреймворков для работы через CHPP для ASP.NET не было (для PHP же, например, был PHT). Обдумав этот момент, пришел к мысли, что это даже лучше, поскольку я хоть и не люблю писать «велосипеды», но уж если такового «велосипеда» нет – то я могу сделать это не хуже, чем кто-нибудь другой, а уровень понимания и знание подводных камней будет выше. Да и процесс обновления чужого фреймворка может оказаться не таким простым для собственного проекта (опять же надо четко представлять, что могло поменяться от версии к версии и знать каким образом это повлияет на имеющийся код).
Пришлось начинать, как говорится, с самого начала – с CHPP-авторизации. Технология использует OAuth и поиск выявил сразу несколько библиотек-кандидатов для работы с ней в среде .NET. Однако примерно неделя ушла на их перебор и попытки заставить их толком заработать – постоянно что-то не срасталось. Лишь перейдя к самому навороченному варианту из всех (DotNetOpenAuth) всё получилось, хотя и пришлось помудрить с реализацией хранения получаемых токенов (реализацией интерфейса IConsumerTokenManager) – пришлось сделать хранение и в сессии, в файлах cookies и в базе данных.
Сразу же была поставлена первая промежуточная цель – мониторинг трансферов игроков сборных и сохранение информации об их навыках. Проведя анализ API CHPP сразу стало понятно — ограничится парой-тройкой XML-ек не получится… Обдумав ситуацию, было решено отказаться от первого подхода: получать только ту информацию, которой казалось достаточно для проекта (сборная, игроки, матчи). Решено было делать «движок». Базу данных строить, используя всю информацию из XML-файлов, по возможности максимально консистентную со всеми необходимыми вторичными ключами. А объектную модель делать по принципу каскадного построения объектов (т.е. создаем объект «сборная», в ней есть тренер сборной — создаем объект «игрок», в нем есть ссылка на клуб — создаем объект «клуб» и т.д.). Подумав еще раз, решено было сразу делать кеширование всех объектов в памяти, поскольку это может позволить сэкономить на повторном создании объектов, что особенно может помочь при массовых операциях загрузки/обновления (что прекрасно подтвердилось при массовой загрузке матчей сборных). Поэтому была написана прослойка, которая позволяла либо взять объект из кеша, либо приступить к его созданию. Потом были написаны классы для таких объектов как регион, язык, страна, стадион, лига, клуб, менеджер, сборная, матч, игрок — всё то, что было необходимо для гарантии получения объекта, содержащего всю информацию, взятую из XML-файлов.
При создании объект не просто создавался в памяти и хранился в кеше, естественно он еще сохранялся в базе данных, но кроме этого для целей тестирования было предусмотрено сохранение всех XML-файлов получаемых через CHPP. Это сильно пригодилось на первых порах для тестирования — загрузка данных была написана таким образом, что сначала шло получение объекта из кеша, потом, если объект обновлялся в течение суток, шла загрузка из базы данных, иначе же (при наличии доступа через CHPP) шла загрузка через API CHPP, если же она была недоступна, то загружалось из базы данных вне зависимости от свежести этих данных, а когда и в базе данных не было нужной информации — читались сохраненные XML-файлы.
Таким вот образом, в свободное время дома и на работе писалось всё это где-то до майских праздников. Потом было приобретено доменное имя, найден недорогой ASP.NET хостинг и 15 мая 2012 года был развернут сайт http://hattrickportal.pro – с версией 0.1 с данными об игроках и матчах всех сборных и был запущен ежедневный процесс обновления данных по всем игрокам. Фактически же после создания движка процесс обновления данных по всем игрокам состоял в пробеге по всем еще не обновленным в течение одних суток игрокам с командой NewPlayer(PlayerID). Для подобных задач была создана веб-служба для запуска данных задач в отдельных потоках. Однако как раз на этом этапе пришлось серьезно задуматься над проблемой передачи текущего контекста (HttpContext) и токена доступа (AccessToken) в данные потоки. Пришлось добавить еще один слой абстракции для текущего контекста и всё это начало наконец-то нормально функционировать. Возникающие ошибки со всеми подробностями писались в таблицу в базе данных, что позволило выявить баги с отсутствующими объектами и пофиксить их (всё-таки API-документация по CHPP не совсем полна).
Несмотря на полученные возможности по автоматической загрузке матчей всех сборных использовать их пришлось в полуручном режиме: имеющийся хостинг тупо не выдерживал большого количества потоков и сайт ложился (что трудно отнести хостингу в вину – какие деньги, такая и работа), поэтому пришлось загружать 48 сезонов для 256 сборных максимум в пять потоков, при этом следя — не отвалились ли эти фоновые процессы и не нужно ли их перезапустить заново. Тут как раз здорово пригодилось кеширование — если первый матчи сборной в сезоне загружались со всеми данными секунд за десять, то следующие уже пролетали уже ощутимо быстрее — за 2-4 секунды. Таким образом, были загружены все матчи всех сборных команд, а на сайт была добавлена статистика по личным встречам сборных команд и общая статистика по игрокам (версия 0.2).
В начале июня было добавлено хранение истории формы, выносливости, опыта, зарплаты, TSI и навыков игроков (версия 0.3). В течение лета еще была добавлена статистика по всем сыгранным официальным матчам всех сборных команд (версия 0.5). Также было добавлено хранение и отображение истории изменений командного духа и уверенности сборных команд (версия 0.6).
Последним вопросом решалась локализация приложения. В принципе проект сразу строился с возможностью локализации (никаких «просто строк», только локализуемые компоненты ASP.NET). Но пришлось руками выполнить много тупой работы по поиску, копированию и вставке текста на двух языках (всего 96 xml-файлов локализации). Зато 19.09.2012 года была выложена полностью локализованная версия 0.7 с двумя языками – английским и русским. Язык по умолчанию определяется по языку браузера, но с возможностью изменения на сайте.
Внешний вид сайта изначально для упрощения брался с сайта Hattrick’а. Т.е. все стили, картинки, макет, перевод и прочее. Это позволило, особо не напрягаясь, получить сразу рабочий вариант дизайна, привычный всем пользователям Hattrick’а. Однако это вообще-то не соответствует правилам (программа не должна полностью копировать внешний вид) и пришлось немного доработать напильником за пару часов для получения «оригинальной» темы сайта. Получилось так себе, зато сохранилась совместимость с темой Hattrick’а.
Теперь что касается авторизации на данном сайте. В принципе, просто смотреть статистику обычным пользователям можно и без всякой авторизации, зато с авторизацией пользователи, во-первых, получают возможность получать актуальные данные (через CHPP), а не только то, что хранится в базе данных (информация по многим объектам может быть устаревшей), а во-вторых, российские пользователи могут выбирать тему сайта (да-да, можно выбрать дизайн Hattrick’а!). Для тренеров же сборных авторизация даст больше возможностей – просматривать навыки игроков на тот момент, когда они были на трансфере. Для тренеров всех стран можно просматривать только игроков своей страны, для российских же тренеров – игроков любых стран. Кроме этого тренер сборной может на сайте добавить себе помощников (скаутов, шпионов…), которые также смогут просматривать навыки игроков, полученных таким способом.
Пока четких планов по развитию данного ресурса у меня нет – жду предложений от пользователей по расширению функциональности. В качестве внутренней архитектуры приложения хотелось бы движок выделить в отдельную библиотеку и заняться её развитием в полноценный фреймворк, но пока не вижу в этом особого смысла.
Все пользователи, интересующиеся сборными командами в мире Hattrick’а, приглашаются на Портал Hattrick: http://hattrickportal.pro!
- dukeyusupov
- 0
- 570