Commit Graph
62 Commits
Author SHA1 Message Date
hermes 21db563f28 feat: поддержка в боте — топик, сводка профиля, приветствие оператора
Обращение открывается кнопкой «🆘 Поддержка» или /support в режиме «Помощь».
Отдельного FSM-режима нет: пока обращение активно, внизу остаётся только
«Главное меню», а переключение режимов отклоняется.

- support.py: личка пользователя ↔ персональный топик группы SUPPORT_GROUP_ID.
  Топик создаётся один раз на пользователя и переиспользуется, поэтому
  повторные обращения продолжают ту же переписку. Пересылаются все типы
  контента через copy_message; ответ оператора из топика уходит в личку;
  сообщение с префиксом // остаётся внутренней заметкой. Функция выключена
  без SUPPORT_GROUP_ID.
- Карточка профиля уходит первым сообщением топика: аватарка, имя, username,
  id и сводка — сколько дней пользуется ботом, сколько продлений подписки,
  сколько дней осталось, обучен ли бот (user_store.support_profile_summary).
- Бот не объясняет пользователю, что «передаёт оператору»: в ответ приходит
  случайная фраза из пула SUPPORT_GREETINGS (activity_phrases.support_greeting).
  Формулировки безличные, без «я/бот/оператор»; пул переопределяется через
  SUPPORT_GREETINGS без деплоя.

Проверено: 207 тестов OK (30 новых в tests/test_support.py).
VERSION: 0.1.0+51 -> 0.1.0+52
2026-10-11 16:48:04 +02:00
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
admin a95ae7ae5b docs: sync README/IDEA.MD with 0.1.0+48 2026-10-11 14:07:17 +02:00
admin ff09b74f03 feat: log raw telegram updates in development 2026-10-11 13:19:39 +02:00
admin 926031713d fix: recover complete posts from truncated json 2026-10-10 16:57:30 +02:00
admin 04b33e708d feat: show main menu with version notice 2026-10-10 14:13:40 +02:00
admin b665bf3394 fix: remove max token limit from llm calls 2026-10-10 14:00:23 +02:00
admin 9f62b35798 feat: persist dev bot logs 2026-10-09 21:17:06 +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 da70e30960 feat: add canned replies and injection screening 2026-10-09 17:31:50 +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 189f6bc1f0 fix: show user id in subscription status message 2026-10-09 15:13:40 +02:00
admin c90af5b4df feat: show user id in subscription message 2026-10-08 23:13:05 +02:00
admin 3bcec7a9a5 feat: add cumulative account profile training 2026-10-08 23:04:32 +02:00
admin 766ba22f17 fix: retry empty model responses with lower reasoning 2026-10-08 22:12:18 +02:00
admin 1dffdcf32d feat: confirm training reset and polish bot messages 2026-10-08 21:21:58 +02:00
admin 92771c9d9f feat: repair malformed model JSON responses 2026-10-08 20:58:47 +02:00
admin 2d743d2220 feat: improve operation diagnostics and API logging 2026-10-08 19:35:31 +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 c02db5ada9 fix: isolate dev messages from production 2026-10-08 14:04:51 +02:00
admin 45b1c5b468 feat: dev-кнопка подтверждения тестовой оплаты 2026-10-08 13:32:07 +02:00
admin d5225e2e95 docs: порядок работы по правке бота в IDEA.MD
Правки -> версия -> коммит -> пуш в dev -> деплой -> вебхук -> отчет.
Отмечено, что статус в Coolify API поллить не нужно.
2026-10-07 11:32:35 +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
admin 3c8917c20a feat: настоящая оплата Telegram Stars вместо имитации
- payments.py: sendInvoice (XTR, 100 звёзд) -> pre_checkout_query -> successful_payment
- /subscribe больше не активирует подписку сам — только отправляет счёт
- handle_pre_checkout подтверждает только свой payload в XTR на 100 звёзд
- таблица payments по telegram_payment_charge_id защищает от двойного начисления
- 16 новых тестов платежей, старый тест заглушки переписан; 75 тестов OK
- Dockerfile копирует payments.py, VERSION 0.1.0+25
2026-10-07 10:35:51 +02:00
admin b586d3aa36 feat: полноширинные кнопки справки + переход в любой раздел
- каждая кнопка в отдельном <tg-button-row align="left"> — во всю ширину сообщения
- из любого раздела доступны кнопки на все остальные (было: «предыдущий»/«следующий»)
- текущий раздел рендерится как <tg-button type="disabled">, чтобы не было активной кнопки на себя
- «⌂ В меню» остаётся отдельной полноширинной кнопкой
- 59 тестов, VERSION 0.1.0+24
2026-10-07 09:52:57 +02:00
admin c85f0a34fe feat: /help разбита на разделы с навигацией инлайн-кнопками (aiogram 3.31.0)
- requirements.txt: aiogram 3.26.0 -> 3.31.0 (нативный send_rich_message + edit_message_text(rich_message=...))
- help_message.py: HELP_RICH_HTML -> HELP_SECTIONS (6 разделов) + help_menu_html/help_section_html/help_view/help_plain_view
- навигация на HTML-тегах <tg-button-row>/<tg-button type="callback_data"> (в меню 2 кнопки в ряд, в разделе «В меню» + «Предыдущий»/«Следующий»)
- bot.py: самописный raw-запрос sendRichMessage заменён на bot.send_rich_message; edit_rich_message + callback help_navigation
- онбординг по-прежнему вызывает help_command — кнопки появляются и там
- тест поймал реальный баг: в help_navigation пропущен await у edit_rich_message
- 58 тестов, VERSION 0.1.0+23
2026-10-06 23:15:47 +02:00
admin 0ff0e1abe7 feat: онбординг после /start — welcome Rich Message + вызов help_command
- help_message.py: добавлен WELCOME_RICH_HTML (приветствие, примеры, скриншоты)
- bot.py: send_rich_help -> send_rich_html(html, stage) + send_rich_message с plain-fallback
- bot.py: start теперь шлёт welcome Rich Message, пауза 0.8с, затем help_command
- help_command вызывает общий send_rich_message — правки HELP_RICH_HTML меняют и онбординг
- тесты: OnboardingTests (3), README/IDEA/VERSION 0.1.0+22
2026-10-06 22:57:47 +02:00
admin d618fd8a61 docs: план работ в IDEA.MD, проект Gitea с задачами, v0.1.0+21 2026-10-06 19:41:14 +02:00
admin b43049d283 docs: справка бота с /balance и /subscribe, актуализация README/IDEA, v0.1.0+20 2026-10-06 19:11:11 +02:00
admin a2927052f4 docs: подробная документация (UX + код), фикс дублей, /help без подписки, v0.1.0+19 2026-10-06 18:31:44 +02:00
admin f5d6fa95bd chore: bump VERSION to 0.1.0+18 (подписка и триал) 2026-10-06 18:17:16 +02:00
admin 1d4d216b2a fix: import sqlite3 in bot.py (NameError на деплое) 2026-10-06 18:10:55 +02:00
admin 78d57fe36b feat: подписка 100 звёзд, триал 3 дня, /balance, /subscribe 2026-10-05 19:50:28 +02:00
admin 7c5b28233b chore: remove deploy test file 2026-10-05 19:10:53 +02:00
admin 00b380e71e test: trigger deploy via webhook 2026-10-05 19:09:09 +02:00
admin db1b1bf75c feat: add three-message onboarding after /start 2026-10-05 17:15:26 +02:00
admin 2941cb2a24 feat: remove /idea_voice, revert to text-only ideas 2026-10-05 15:25:22 +02:00
admin 7b76bef889 fix: register slash command handler 2026-10-05 01:47:32 +02:00
admin 40383eb6e7 fix: use APInex TTS for voice ideas 2026-10-05 01:35:41 +02:00
admin 95f9729261 feat: add voice idea command 2026-10-05 01:24:23 +02:00
admin 6ed2599a52 feat: add voice idea command 2026-10-05 01:17:47 +02:00
admin 0d181b0c05 feat: make ideas single-use and clear user data 2026-10-05 00:43:47 +02:00
admin 7744884b78 feat: add idea generation and post history 2026-10-05 00:18:53 +02:00