Commit Graph
3 Commits
Author SHA1 Message Date
admin 7a630a974f fix: push the final text into the draft before sending it as a message
Драфт с последней фразой висел в чате ещё несколько секунд после того, как
уже ушло сообщение «✅ Обучение завершено»: содержимое драфта не совпадало
с финальным сообщением, и клиент не мог их слить.

Финальный текст теперь сначала пушится в драфт тем же draft_id, и только
потом уходит реальным сообщением с тем же текстом — драфт заменяется без
задержки. finish() без текста гасит драфт пустым пушем.

Проверено: 198 тестов OK (2 новых на совпадение текста драфта и сообщения).

VERSION: 0.1.0+50 -> 0.1.0+51
2026-10-11 15:34:15 +02:00
admin 635b78cb86 fix: always close the operation status so the draft stops hanging
Драфт исчезает только когда бот отправляет реальное сообщение. Ряд путей
завершения операции не закрывал статус, из-за чего последняя показанная
фраза висела в чате до конца TTL драфта и выглядела неактуальной.

- OperationStatus: флаг _closed, finish() принимает None (только снять
  статус), finish_if_open() — идемпотентное закрытие, _finished_draft_id
  сохраняется до обнуления draft_id
- finish_status(status, text) — хелпер, терпит None: закрывает статус на
  любом пути выхода без повторения `if status:`
- закрыты пути без finish: _rebuild_account_profile при переданном статусе,
  _process_voice -> _classify_and_respond, успешные выходы _handle_image_message
  и transcribe_voice через else-ветку, ранние возвраты /help и проверки подписки

Проверено: 176 тестов OK (4 новых на закрытие статуса).

VERSION: 0.1.0+49 -> 0.1.0+50
2026-10-11 15:18:59 +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