{"id":24530939,"url":"https://github.com/exsaron/hearthstone-deck-helper","last_synced_at":"2026-04-12T20:37:21.150Z","repository":{"id":37719256,"uuid":"498703175","full_name":"exsaron/hearthstone-deck-helper","owner":"exsaron","description":"Вспомогательный сервис для игроков Hearthstone и организаторов турниров","archived":false,"fork":false,"pushed_at":"2025-01-08T08:10:25.000Z","size":26578,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-22T08:18:16.974Z","etag":null,"topics":["celery","django","django-rest-framewok","docker","nginx","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exsaron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-01T11:11:29.000Z","updated_at":"2025-01-08T08:10:30.000Z","dependencies_parsed_at":"2025-01-08T09:35:56.867Z","dependency_job_id":null,"html_url":"https://github.com/exsaron/hearthstone-deck-helper","commit_stats":null,"previous_names":["exsaron/hearthstone-deck-helper"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Fhearthstone-deck-helper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Fhearthstone-deck-helper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Fhearthstone-deck-helper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exsaron%2Fhearthstone-deck-helper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exsaron","download_url":"https://codeload.github.com/exsaron/hearthstone-deck-helper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243776442,"owners_count":20346351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["celery","django","django-rest-framewok","docker","nginx","python"],"created_at":"2025-01-22T08:18:21.825Z","updated_at":"2026-04-12T20:37:16.111Z","avatar_url":"https://github.com/exsaron.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hearthstone Deck Helper\n\nВспомогательный сервис для игроков Hearthstone и организаторов фан-турниров.  \n\n\u003e Проект заброшен - я полностью потерял интерес к Hearthstone и не слежу за обновлениями.\n\n---\n\n- [Описание](#описание)\n  - [Стэк](#стэк)\n  - [Функционал](#функционал)\n  - [Реализовано](#реализовано)\n  - [Иллюстрации](#иллюстрации)\n    - [Рендеринг колод (примеры)](#рендеринг-колод)\n- [Локальная установка и запуск](#локальная-установка-и-запуск)\n  - [Требования](#требования)\n  - [Установка](#установка)\n  - [Запуск](#запуск)\n\n---\n\n## Описание\n\n**Hearthstone** - коллекционная карточная игра, в которой колоды составляются из 30-40 карт и копируются из клиента игры как байтовые строки в Base64 (чтобы ими было удобно делиться).  \nОсновная функция сервиса - расшифровка таких строк по известному алгоритму и удобный просмотр колод.  \n\n### Стэк\n\n| **Python 3.10**                 |                                                                   |\n| :-----------------------------: | ----------------------------------------------------------------: |\n| **Django 4**                    |                                                                   | \n| **Django REST Framework**       | Открытый API (read-only доступ к картам и колодам)                | \n| **PostgreSQL 14**               |                                                                   | \n| **Celery**                      | Рендеринг колод                                                   | \n| **celery-beat**                 | Проверка обновлений Hearthstone; обновление БД                    | \n| **Redis**                       | Бэкенд и брокер для Celery; бэкенд кэширования                    | \n| **Docker** \u0026 **docker-compose** | Запуск в контейнере PostgreSQL, Celery, Celery-beat, Redis, Nginx | \n| **Nginx** \u0026 **Gunicorn**        | Продакшн                                                          | \n| **HTML** \u0026 **CSS**              |                                                                   | \n| **JavaScript**                  | AJAX, анимации колод, удаление пустых полей из GET-запросов и т.д.| \n\n### Функционал\n\n- **Расшифровка кодов колод и их детализированный просмотр**  \n  \"Сырой\" вид прямо из клиента игры также поддерживается.\n- **База данных колод**  \n  Расшифрованные колоды сохраняются и доступны для просмотра, в т.ч., посредством API.  \n  Отображаются также похожие колоды при наличии таковых в БД.\n- **Личное хранилище колод пользователя**[^1]  \n  Требует авторизации. Колоды сохраняются в отдельных экземплярах.\n- **Подробная информация о составе колоды**  \n  Полезно для организаторов турниров с особыми требованиями к составлению колод.\n- **[Рендеринг](#рендеринг-колод) подробного изображения колоды в высоком разрешении**  \n  Полезно при заявлении колод на турниры.  \n  **Процесс получения рендера**:  \n  1. Юзер нажимает большую кнопку на странице колоды и задает параметры рендеринга в форме.\n  2. Клиент отправляет AJAX-запрос с ID колоды.\n  3. Запускается таск Celery, создающий рендер и сохраняющий его в `/media/`.\n  4. Клиент получает ответ с `task_id`.\n  5. Клиент каждую секунду отправляет AJAX-запрос на URL вида `get_render/\u003ctask_id\u003e/`, проверяя статус таска.\n  6. Если таск выполнен - его результат используется для вставки рендера на страницу. Среднее время ожидания: 3-5 с.\n- **База данных карт Hearthstone**  \n  В т.ч. неколлекционные карты, недоступные для включения в колоду.  \n  Отображаются также колоды, в которых карта присутствует.  \n  БД собирается из открытых API:  \n  - https://rapidapi.com/omgvamp/api/hearthstone - данные\n  - https://hearthstonejson.com - изображения   \n  \n  **Процесс обновления БД**:   \n  1. Раз в сутки запускается таск Celery-Beat, выполняющий запрос к API с данными и сравнивающий версии.\n  2. Если версии различаются - спустя 23 часа запускается таск обновления БД. Задержка обусловлена возможной разницей во времени обновления API данных и API изображений.\n  3. Таск обновления БД предварительно также сравнивает версии.  \n  \n  Возможен запуск вручную: `python manage.py update_db`.  \n- **Открытый API для read-only доступа к картам и колодам**\n  - Функционал:\n    - поиск карт и колод по названию, классам, типам, форматам\n    - поиск колод по включенным картам\n    - расшифровка кода колоды\n  - Документация сгенерирована через Swagger\n  - API используется [другим моим проектом](https://github.com/exsaron/hdh-api-bot)\n- **Статистика по картам и колодам**\n\n### Реализовано\n- **Полная локализация (английский и русский язык)**  \n  Переключение языка - на боковой панели.\n- **Система аккаунтов** (без использования расширений) \n  - Регистрация с подтверждением email\n  - Сброс пароля через email\n- **Логирование ошибок в Django Middleware**\n- **Кэширование** на уровне представлений (Redis в качестве бэкенда)\n- **Юнит-тестирование (pytest)**\n- **Celery с Redis в качестве брокера и бэкенда**\n  - Рендеринг колоды в таске\n  - Периодические проверки обновлений hearthstone API посредством celery-beat\n  - Планирование обновления БД\n- **Контейнеризация (Docker, docker-compose)**\n- **Деплой (Nginx + Gunicorn)**\n\n\n### Иллюстрации\n\n#### Рендеринг колод\n\n![render01](/pics/render01.png)\n\n---\n\n![render02](/pics/render02.png)\n\n---\n\n![render03](/pics/render03.png)\n\nQR-код содержит код колоды.  \n\n---\n  \n## Локальная установка и запуск\n\n\u003e (!) Для работы сервису требуется предварительное заполнение БД и скачивание + обработка около 1.5 Гб изображений коллекционных карт, что может занять несколько часов.  \n\u003e Изображения скачиваются по просьбе разработчиков [hearthstoneJSON.com](https://hearthstonejson.com/docs/images.html) для уменьшения нагрузки.\n\n### Требования\n- Docker\n- docker-compose\n- Git\n\n### Установка\n\nКлонировать репозиторий:\n```shell\ngit clone https://github.com/ysaron/hearthstone-deck-helper.git\n```\n\nВ корневом каталоге проекта создать `.env.dev` и задать в нем следующие переменные окружения:\n```dotenv\nDEBUG=1\nSECRET_KEY=\"\u003cyour_secret_key\u003e\"\nDJANGO_ALLOWED_HOSTS=\".localhost 127.0.0.1 [::1]\"\nSQL_ENGINE=django.db.backends.postgresql\nSQL_DATABASE=local_db\nSQL_USER=local_user\nSQL_PASSWORD=password\nSQL_HOST=db\nSQL_PORT=5432\nDATABASE=postgres\nX_RAPIDARI_KEY=\u003cyour_rapidapi_key\u003e\n```\n\n`X_RAPIDARI_KEY` - токен для доступа к API с данными Hearthstone, получить нужно [здесь](https://rapidapi.com/omgvamp/api/hearthstone).\n\nДля работы системы аккаунтов понадобится также электронная почта с настроенным SMTP и доп. переменные окружения:\n```dotenv\nEMAIL_HOST_USER\nEMAIL_HOST_PASSWORD\n```\n\n### Запуск\n\nСборка образа + запуск:\n```shell\ndocker-compose up -d --build\n```\n\nПереход в контейнер приложения: \n```shell\ndocker-compose exec web bash\n```\n\nСоздание суперпользователя:\n```shell\npython manage.py createsuperuser\n```\n\nСборка БД с картами + скачивание изображений коллекционных карт:\n```shell\npython manage.py update_db\n```\n\nДобавление в БД \"starter pack\" с колодами:\n```shell\npython manage.py import_decks\n```\n\nВыход из контейнера\n```shell\nexit\n```\n\nСайт будет доступен на http://127.0.0.1:8000/.\n\nОстановка:\n```shell\ndocker-compose down\n```\n\n[^1]: Поскольку клиент игры на данный момент позволяет сохранять только 27 колод одновременно. Маловато? Маловато.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsaron%2Fhearthstone-deck-helper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexsaron%2Fhearthstone-deck-helper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexsaron%2Fhearthstone-deck-helper/lists"}