Commit Graph
20 Commits
Author SHA1 Message Date
admin 87f22fb249 fix(subscription): show expiry clock time (MSK) when under a day
- subscription_time_left: replace floor-div '23 ч.'/'мин.' branches with the
  concrete expiry timestamp when less than a full day remains
- add MSK_TIMEZONE (UTC+3) as display default; label time as '(МСК)'
- add shared subscription_status_text helper, use it in status menu,
  post-payment reply and dev confirmation instead of floor-rounded days
- tests: cover under-a-day clock format; fix stale to_thread mock
2026-10-30 13:04:38 +02:00
admin 57f4c6cb4f fix(subscription): show precise remaining time 2026-10-29 21:35:58 +02:00
admin 61c66def3f feat(training): summarize learned profile and add info button 2026-10-29 20:05:42 +02:00
admin dc2ec6344b fix(subscription): process zero-day one-star payment 2026-10-29 13:03:55 +02:00
admin 3819230b3e test: add zero-star invoice probe 2026-10-21 12:56:50 +02:00
admin c32702c402 fix: simplify subscription payment messages 2026-10-20 21:13:51 +02:00
admin 9c37a05139 fix: simplify user-facing bot messages 2026-10-19 15:15:53 +02:00
admin 073c7d2c81 fix: use reply keyboard for subscription purchase 2026-10-12 21:14:58 +02:00
admin 87e421ae73 feat: stream operation status as a live draft with activity phrases
Статус долгой операции больше не оставляет в чате отдельное сообщение:
в приватном чате он стримится живым драфтом (sendMessageDraft), пока
идет классификация, генерация, чтение скриншотов или распознавание речи.

- activity_phrases.py: пулы фраз по типу операции (generation, training,
  images, voice, ideas), случайный интервал 3-8 сек (ACTIVITY_MIN_SECONDS /
  ACTIVITY_MAX_SECONDS), фраза не повторяет предыдущую
- OperationStatus: драфт со стабильным draft_id, фоновая ротация фраз,
  finish() отправляет финальный статус реальным сообщением, retarget()
  меняет пул на лету (generate_ideas), предохранитель ACTIVITY_MAX_ROTATIONS
- в группах и топиках драфты недоступны: прежний answer + edit_text,
  ротация фраз отключена; при ошибке драфта автоматический откат
- Dockerfile копирует activity_phrases.py и support.py, иначе контейнер
  падает на импорте

Проверено: 172 теста OK,其中包括 14 новых в tests/test_activity_phrases.py.
Тесты нашли и закрыли баг: ротация запускалась и в группах, где каждый тик
был бы реальным редактированием сообщения.

VERSION: 0.1.0+48 -> 0.1.0+49
2026-10-11 14:51:07 +02:00
admin a43ededa1b feat: gate post generation on training flag 2026-10-09 20:11:41 +02:00
admin e847a4b390 feat: add generate-post button 2026-10-09 19:42:35 +02:00
admin 6f8741cf3c feat: generate posts from images and reject video 2026-10-09 18:18:37 +02:00
admin ea0f7ee27c fix: keep training completion status concise 2026-10-09 16:52:32 +02:00
admin 3e33a9deb5 feat: show editable operation status 2026-10-09 16:46:11 +02:00
admin 3bcec7a9a5 feat: add cumulative account profile training 2026-10-08 23:04:32 +02:00
admin 1dffdcf32d feat: confirm training reset and polish bot messages 2026-10-08 21:21:58 +02:00
admin aaea5b6f58 fix: send subscription Stars invoice directly 2026-10-08 18:28:26 +02:00
admin 6dd685a6a5 feat: refine mode navigation and subscription renewal UX 2026-10-08 16:34:24 +02:00
admin 36a17f7639 feat: add mode-based bot navigation 2026-10-08 15:56:32 +02:00
admin 971bf115da feat: reply-клавиатура + фикс пропавший _send_idea
- keyboards.py: MAIN_MENU (✍️ Написать пост / 💡 Идея / 🎨 Мой стиль / 📖 Помощь / 💳 Подписка / 👤 Баланс)
  и LOCKED_MENU — при блокировке первой кнопкой идёт «💳 Оплатить подписку»
- кнопки не обходят роутинг: resolve_button_text превращает их в slash-команду
  (/help, /balance, /subscribe, /style) или готовый запрос («Напиши пост», «предложи идею…»)
- новая команда /style показывает сохранённый Tone of Voice и подсказывает, как его настроить
- set_my_commands публикует slash-команды при старте, ошибка не роняет бот
- fix: _send_idea вызывалась на bot.py, но была потеряна в коммите про подписку —
  /idea падал с NameError; функция восстановлена
- 17 новых тестов клавиатуры; 92 теста OK; VERSION 0.1.0+26
2026-10-07 11:30:39 +02:00