Releases: exfador/playerok-api
Release list
2.0.4
Кратко
В версии 2.0.4 обновлены SHA-256 хеши persisted GraphQL-запросов под текущую схему playerok.com. Без этого запросы deals, deal, chatMessages и items начали возвращать PersistedQueryNotFound: переставали открываться список сделок, конкретная сделка, история сообщений в чате и витрина лотов. После апдейта всё снова работает.
🐛 Исправлено
🔄 GraphQL PersistedQueryNotFound
В словаре PERSISTED_QUERIES (pok/gql.py) под актуальную схему playerok.com обновлены sha256-хеши четырёх запросов. Остальные 19 хешей не менялись.
| Запрос | Что чинит |
|---|---|
deals |
Список сделок в разделе сделок. |
deal |
Открытие конкретной сделки и подгрузка её деталей. |
chatMessages |
Подгрузка истории сообщений в чате. |
items |
Витрина лотов по игре/категории. |
Это GET-операции с persisted query: на сервер уходит только хеш (без тела запроса), поэтому достаточно обновить значения — структура запросов не менялась.
🛠 Изменено
- Версия проекта поднята с
2.0.3до2.0.4(lib/consts.py).
📂 Изменённые файлы
| Файл | Что поменялось |
|---|---|
| pok/gql.py | Обновлены 4 хеша: deals, deal, chatMessages, items. |
| lib/consts.py | Версия 2.0.3 → 2.0.4. |
🔧 Как обновиться
Если у вас уже стоит 2.0.x:
- В Telegram-боте перейдите в «🛠 Система» → «🔄 Проверить обновления» → «📥 Загрузить и применить 2.0.4». Бот скачает релиз и сам перезапустится.
- Либо вручную:
git pullили скачайте zip с GitHub и распакуйте поверх. Папкиconf/,db/,logs/трогать не нужно — они переживут обновление.
Если у вас была версия 2.0.3 и запросы недавно начали возвращать PersistedQueryNotFound — после апдейта на 2.0.4 это пройдёт.
✅ Проверки качества
Перед релизом прогнаны:
py_compileна изменённых .py-файлах — компилируются без ошибок.- Сверка хешей с актуальной схемой API — обновлены ровно 4 значения, остальные 19 совпадают с прежними.
🔗 Ссылки
| Канал | @coxerhub_playerok |
| Чат | @coxerhub_ch |
| GitHub | exfador/playerok-api |
2.0.3
Кратко
В версии 2.0.3 переработан блок обновлений и добавлен импорт расширений прямо из Telegram-панели. Раньше для подключения нового расширения нужно было лазить в файловую систему сервера и руками класть папку в ext/; теперь можно отправить zip-архив боту и получить готовое расширение в один шаг.
Также появился переключатель «Авто-установка» — если он включён, бот сам скачает новую версию на старте и перезапустится без вашего вмешательства. Уведомления о новых релизах теперь имеют отдельный тумблер (раньше управлялись только общим флагом alerts.on.update).
Параллельно обновлены SHA-256 хеши persisted GraphQL-запросов под текущую схему playerok.com — без этого user, deal и gameCategoryInstructions начали возвращать PersistedQueryNotFound.
✨ Добавлено
🔃 Раздел «Обновления» в меню «Настройки»
В Telegram-панели в разделе «⚙️ Настройки» появился новый пункт «🔃 Обновления» с двумя переключателями:
| Переключатель | Что делает |
|---|---|
| ⬇️ Авто-установка | Бот будет автоматически обновляться до последней версии при запуске (не во время работы). По умолчанию — выкл. |
| 🔔 Оповещать | При выходе новой версии вам придёт уведомление сюда в Telegram с кнопкой «📥 Загрузить и применить». По умолчанию — вкл. |
Соответствующие ключи в conf/config.json:
{
"updater": {
"enabled": true,
"interval_sec": 3600,
"auto_update": false,
"notify": true
}
}При обновлении со старого конфига оба новых ключа допишутся со значениями по умолчанию автоматически (механизм need_restore в lib/cfg.py).
🚀 Авто-установка обновления на старте
Если в настройках включена «⬇️ Авто-установка», при старте main.py (после интерактивного мастера, но до запуска движка магазина и Telegram-панели) бот:
- Дёргает GitHub Releases и сравнивает теги через
lib.updater.is_newer. - Если новее — скачивает архив релиза, распаковывает во временную папку, копирует файлы в проект (с тем же набором
_PRESERVE, что и при ручном обновлении:conf/,db/,logs/,__pycache__,.git,.venvне трогаются). - Сохраняет в
db/updater_state.jsonметкуlast_applied_tag/applied_at. - Запускает
schedule_reboot(2.0)— процесс корректно перезапускается, выставляяCXH_FAST_REBOOT=1(в баннере на старте видно «↻ Перезапуск»).
Логика реализована в CXHBot._startup_auto_update() в main.py. Если по дороге что-то ломается (нет сети, прокси падает, GitHub возвращает не 200) — старт продолжается как обычно: пишется warning, бот никуда не падает.
🔔 Отдельный тумблер уведомлений о новых релизах
Раньше уведомления о новых версиях управлялись только общим флагом alerts.on.update. Это было неудобно: чтобы заглушить именно «спам про апдейты», приходилось копаться в общем разделе уведомлений.
Теперь в bot/core.py в фоновой задаче _update_check_loop() уведомление отправляется, только если оба флага включены:
alerts_on = alerts.get('enabled', True) and (alerts.get('on') or {}).get('update', True)
notify_on = bool((self.config.get('updater') or {}).get('notify', True))
if alerts_on and notify_on and is_newer(rel.tag, _VERSION) and ...:
panel.notify_update(...)Выключить именно «уведомления об апдейтах», оставив все остальные алерты включёнными, можно одним нажатием в разделе «🔃 Обновления».
🔄 Обновлены GraphQL persisted-query хеши
В словаре PERSISTED_QUERIES (pok/gql.py) под актуальную схему playerok.com обновлены sha256-хеши и добавлен новый запрос:
| Запрос | Что обновилось |
|---|---|
user |
Новый хеш — старый возвращал PersistedQueryNotFound, ломая карточку профиля и поиск по нику. |
deal |
Новый хеш — открытие конкретной сделки и подгрузка её деталей. |
gameCategoryInstructions |
Свой хеш (раньше по ошибке использовался хеш gameCategoryObtainingTypes — наследие старой схемы). |
messageTemplates |
Новый ключ — для запроса шаблонов сообщений с сервера. |
Остальные 19 хешей остались прежними. Если у вас была версия 2.0.2 и запросы недавно начали возвращать PersistedQueryNotFound — после апдейта на 2.0.3 это пройдёт.
➕ Импорт расширения из Telegram-панели
В разделе «🧩 Расширения» в Telegram-боте появилась кнопка «➕ Импортировать». Сценарий:
- Жмёте кнопку — бот переключается в состояние ожидания файла и пишет инструкцию.
- Отправляете в чат zip-архив документом с папкой расширения внутри (либо архив, где
__init__.pyлежит в корне — тогда имя папки берётся из имени файла). - Бот:
- валидирует пути (отказ при
.., абсолютных путях и__MACOSX/), - находит все корневые папки с
__init__.py, - распаковывает их в
ext/(если папка с таким именем уже есть — она будет заменена), - отвечает списком импортированных расширений и просит перезапуститься.
- валидирует пути (отказ при
После перезапуска бот сам прогонит lib.ext.discover_extensions() и подключит новые модули; включить/выключить их можно из того же раздела «🧩 Расширения».
🛠 Изменено
- Меню настроек. В
fac_080()(ctrl/ui/settings.py) добавлена строка[🔃 Обновления], открывающая новый экран черезPduPrefsScope(to='updates'). - Список расширений. В
fac_046()(ctrl/ui/main.py) перед кнопкой «⬅️ Меню» добавлена кнопка «➕ Импортировать» с callbackCX.xt_imp. Текст подсказкиfac_047()дополнен инструкцией про импорт. - Дефолты конфига. В lib/cfg.py блок
updaterрасширен ключамиauto_update/notify. Старые конфиги получают их автоматически. - FSM-состояния. В
PduAddonGrp(ctrl/states.py) добавлено состояниеpdu_addon_import_fileдля приёма zip-документа. - Версия проекта поднята с
2.0.2до2.0.3(lib/consts.py).
🐛 Исправлено
- GraphQL
PersistedQueryNotFoundна запросахuser,deal,gameCategoryInstructions— sha256-хеши обновлены под текущую схему API. gameCategoryInstructionsдублировал хешgameCategoryObtainingTypes— теперь у запроса собственный хеш (5991cead…).- Гонка флагов уведомлений. При включённых общих алертах уведомления о новых релизах слали даже тем, кто хотел их выключить отдельно. Теперь блок управляется собственным тумблером и не зависит от настроек алертов про чаты/сделки/отзывы.
- Безопасные пути в импорте. Импорт расширения проверяет zip на zip-slip-уязвимости: пути с
.., абсолютные пути и\отбраковываются с понятной ошибкой ещё до распаковки.
📂 Изменённые файлы
| Файл | Что поменялось |
|---|---|
| lib/cfg.py | updater.auto_update, updater.notify в _DEFAULTS. |
| lib/consts.py | Версия 2.0.2 → 2.0.3. |
| main.py | Метод _startup_auto_update() и его вызов после _interactive_config(). |
| bot/core.py | Учёт updater.notify в _update_check_loop(). |
| pok/gql.py | Обновлены 3 хеша, добавлен ключ messageTemplates. |
| ctrl/cb.py | Новые callback-id: upd_auto, upd_notify, xt_imp. |
| ctrl/states.py | Состояние PduAddonGrp.pdu_addon_import_file. |
| ctrl/ui/settings.py | Пункт «🔃 Обновления» в меню и шаблоны fac_upd_text() / fac_upd_kb(). |
| ctrl/ui/main.py | Кнопка «➕ Импортировать» в списке расширений + обновлённый текст подсказки. |
| ctrl/actions.py | Хендлеры hx_upd_auto, hx_upd_notify, hx_xt_imp + ветка to == 'updates' в hx_079. |
| ctrl/cmd.py | Хендлер rx_addon_import для приёма zip-архива расширения + импорт shutil. |
🔧 Как обновиться
Если у вас уже стоит 2.0.x:
- В Telegram-боте перейдите в «🛠 Система» → «🔄 Проверить обновления» → «📥 Загрузить и применить 2.0.3». Бот скачает релиз и сам перезапустится.
- Либо вручную:
git pull(если ставили из git) или скачайте zip с GitHub и распакуйте поверх. Папкиconf/,db/,logs/трогать не нужно — они переживут обновление.
После обновления зайдите в «⚙️ Настройки» → «🔃 Обновления» и решите:
- хотите ли получать уведомления о новых версиях (по умолчанию — да),
- хотите ли, чтобы бот сам ставил обновления на старте (по умолчанию — нет).
✅ Проверки качества
Перед релизом прогнаны:
- Pyright (
pyrightconfig.jsonпроекта) — 0 errors, 0 warnings, 0 informations. - AST syntax на 11 изменённых .py-файлах — все парсятся.
- Функциональный обход — 16/16 проверок: импорт каждого нового символа, round-trip конфига, рендер всех новых UI-шаблонов, существование всех новых хендлеров.
- Zip-handling для импорта расширений — 8/8 кейсов: одиночное расширение в папке,
__init__.pyв корне, несколько расширений в одном архиве,__MACOSX/игнорируется, zip-slip через..и абсолютные пути отклоняются, архив без__init__.pyотклоняется, имя файла санируется.
🔗 Ссылки
| Канал | @coxerhub_playerok |
| Чат | @coxerhub_ch |
| GitHub | exfador/playerok-api |
2.0.2
2026-04-24 (2.0.2)
Добавлено
- Обход DDoS-Guard через Cookie-авторизацию (вместо голого токена).
- Ввод Cookie через conf/cookies.json (экспорт Cookie-Editor → JSON → ввести
true); в Telegram-панели — принимается JSON-файл документом, JSON-текстом или классическая Header String. - Автопроверка релизов на GitHub, push-уведомление админам о новой версии.
- Инлайн-кнопка «Загрузить и применить» — скачивает zip релиза, заменяет файлы проекта (сохраняя conf/, db/, logs/, pycache, .git, .venv), перезапускает процесс.
- Пункт «🛠 Система» в /start: текущая версия, статус обновления, время последней проверки, кнопки «Загрузить», «Что нового», «Проверить», «GitHub».
- Exception BotCheckDetectedException на срабатывание DDoS-Guard (с подсказкой обновить Cookie).
- pyrightconfig.json — проект проходит статический анализ без ошибок и предупреждений.
Изменено
- GraphQL-запросы и SHA-хеши обновлены под актуальную схему playerok.com.
- Отправка фото в чат теперь через двухшаговый flow: uploadChatImageIntoTemporaryStore → createChatMessage с imagesIds. send_message принимает и один путь, и список путей.
- WS-подписка chatMessageCreated теперь передаёт showForbiddenImage: true (без неё Playerok возвращал пустой images[] для входящих фото).
- Входящие фото-сообщения теперь проходят гидратацию и показываются в Telegram как «📷 изображение» (раньше гонка с chatUpdated побеждала и Telegram показывал «нет текста»).
- URL для скачивания релиза: приоритет asset → github.com/{repo}/archive/refs/tags/{tag}.zip → zipball_url.
- Исправлена env-переменная для перезапуска: CXH_QUICK_REBOOT → CXH_FAST_REBOOT (совпала с чтением в main.py, баннер «↻ Перезапуск» теперь появляется).
- Кнопка «Загрузить обновление» теперь инлайн-callback, а не URL — скачивание и замена идут внутри бота.
- Мастер первого запуска принимает Cookie через JSON-файл вместо длинной вставки в консоль.
Исправлено
- Главный баг: платное восстановление лотов срабатывало даже при выключенной галке «💎 Платное (PREMIUM)». Теперь при отсутствии бесплатного тира и выключенном PREMIUM лот пропускается (с логом), деньги не списываются.
Удалено
- Legacy-запрос createChatMessageWithFile (старая схема отправки фото одним запросом, заменена новым двухшаговым flow).
- Авто-pip-install на старте (теперь только warning).