Вспомогательный сервис для игроков Hearthstone и организаторов фан-турниров.
Проект заброшен - я полностью потерял интерес к Hearthstone и не слежу за обновлениями.
Hearthstone - коллекционная карточная игра, в которой колоды составляются из 30-40 карт и копируются из клиента игры как байтовые строки в Base64 (чтобы ими было удобно делиться).
Основная функция сервиса - расшифровка таких строк по известному алгоритму и удобный просмотр колод.
Python 3.10 | |
---|---|
Django 4 | |
Django REST Framework | Открытый API (read-only доступ к картам и колодам) |
PostgreSQL 14 | |
Celery | Рендеринг колод |
celery-beat | Проверка обновлений Hearthstone; обновление БД |
Redis | Бэкенд и брокер для Celery; бэкенд кэширования |
Docker & docker-compose | Запуск в контейнере PostgreSQL, Celery, Celery-beat, Redis, Nginx |
Nginx & Gunicorn | Продакшн |
HTML & CSS | |
JavaScript | AJAX, анимации колод, удаление пустых полей из GET-запросов и т.д. |
-
Расшифровка кодов колод и их детализированный просмотр
"Сырой" вид прямо из клиента игры также поддерживается. -
База данных колод
Расшифрованные колоды сохраняются и доступны для просмотра, в т.ч., посредством API.
Отображаются также похожие колоды при наличии таковых в БД. -
Личное хранилище колод пользователя1
Требует авторизации. Колоды сохраняются в отдельных экземплярах. -
Подробная информация о составе колоды
Полезно для организаторов турниров с особыми требованиями к составлению колод. -
Рендеринг подробного изображения колоды в высоком разрешении
Полезно при заявлении колод на турниры.
Процесс получения рендера:- Юзер нажимает большую кнопку на странице колоды и задает параметры рендеринга в форме.
- Клиент отправляет AJAX-запрос с ID колоды.
- Запускается таск Celery, создающий рендер и сохраняющий его в
/media/
. - Клиент получает ответ с
task_id
. - Клиент каждую секунду отправляет AJAX-запрос на URL вида
get_render/<task_id>/
, проверяя статус таска. - Если таск выполнен - его результат используется для вставки рендера на страницу. Среднее время ожидания: 3-5 с.
-
База данных карт Hearthstone
В т.ч. неколлекционные карты, недоступные для включения в колоду.
Отображаются также колоды, в которых карта присутствует.
БД собирается из открытых API:- https://rapidapi.com/omgvamp/api/hearthstone - данные
- https://hearthstonejson.com - изображения
Процесс обновления БД:
- Раз в сутки запускается таск Celery-Beat, выполняющий запрос к API с данными и сравнивающий версии.
- Если версии различаются - спустя 23 часа запускается таск обновления БД. Задержка обусловлена возможной разницей во времени обновления API данных и API изображений.
- Таск обновления БД предварительно также сравнивает версии.
Возможен запуск вручную:
python manage.py update_db
. -
Открытый API для read-only доступа к картам и колодам
- Функционал:
- поиск карт и колод по названию, классам, типам, форматам
- поиск колод по включенным картам
- расшифровка кода колоды
- Документация сгенерирована через Swagger
- API используется другим моим проектом
- Функционал:
-
Статистика по картам и колодам
- Полная локализация (английский и русский язык)
Переключение языка - на боковой панели. - Система аккаунтов (без использования расширений)
- Регистрация с подтверждением email
- Сброс пароля через email
- Логирование ошибок в Django Middleware
- Кэширование на уровне представлений (Redis в качестве бэкенда)
- Юнит-тестирование (pytest)
- Celery с Redis в качестве брокера и бэкенда
- Рендеринг колоды в таске
- Периодические проверки обновлений hearthstone API посредством celery-beat
- Планирование обновления БД
- Контейнеризация (Docker, docker-compose)
- Деплой (Nginx + Gunicorn)
QR-код содержит код колоды.
(!) Для работы сервису требуется предварительное заполнение БД и скачивание + обработка около 1.5 Гб изображений коллекционных карт, что может занять несколько часов.
Изображения скачиваются по просьбе разработчиков hearthstoneJSON.com для уменьшения нагрузки.
- Docker
- docker-compose
- Git
Клонировать репозиторий:
git clone https://github.com/ysaron/hearthstone-deck-helper.git
В корневом каталоге проекта создать .env.dev
и задать в нем следующие переменные окружения:
DEBUG=1
SECRET_KEY="<your_secret_key>"
DJANGO_ALLOWED_HOSTS=".localhost 127.0.0.1 [::1]"
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=local_db
SQL_USER=local_user
SQL_PASSWORD=password
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres
X_RAPIDARI_KEY=<your_rapidapi_key>
X_RAPIDARI_KEY
- токен для доступа к API с данными Hearthstone, получить нужно здесь.
Для работы системы аккаунтов понадобится также электронная почта с настроенным SMTP и доп. переменные окружения:
EMAIL_HOST_USER
EMAIL_HOST_PASSWORD
Сборка образа + запуск:
docker-compose up -d --build
Переход в контейнер приложения:
docker-compose exec web bash
Создание суперпользователя:
python manage.py createsuperuser
Сборка БД с картами + скачивание изображений коллекционных карт:
python manage.py update_db
Добавление в БД "starter pack" с колодами:
python manage.py import_decks
Выход из контейнера
exit
Сайт будет доступен на http://127.0.0.1:8000/.
Остановка:
docker-compose down
Footnotes
-
Поскольку клиент игры на данный момент позволяет сохранять только 27 колод одновременно. Маловато? Маловато. ↩