Improve Telegram forum onboarding and topic safety

This commit is contained in:
Mikhail Putilovskij 2026-04-01 01:49:45 +03:00
parent 2b56b98697
commit a1b7a14138
13 changed files with 1101 additions and 376 deletions

View file

@ -2,14 +2,17 @@
## Концепция
Один бот, несколько чатов через Topics в Forum-группе.
Один бот, несколько чатов, две поверхности:
При первом запуске бот создаёт для пользователя персональную Forum-группу
(супергруппу с включёнными темами). Каждый новый чат с агентом — отдельная тема
внутри группы. Пользователь видит это как список чатов в одном месте.
- базовая поверхность — личка с ботом (DM)
- опциональная advanced-поверхность — Topics в пользовательской Forum-группе
Бот управляет группой от имени пользователя через Telegram Bot API:
создаёт темы, переименовывает, архивирует.
При первом запуске пользователь начинает в DM: бот создаёт первый чат и
переключает пользователя в него. Если позже пользователь подключает Forum-группу
через `/forum`, существующие чаты получают соответствующие темы в супергруппе.
DM и Forum используют один и тот же `chat_id`: пользователь может писать
либо в личке, либо в forum topic, а платформа видит единый разговор.
---
@ -29,44 +32,51 @@
---
## Чаты через Forum Topics (вариант В)
## Чаты в DM и Forum Topics
### Как это работает
- Бот создаёт супергруппу с Topics для каждого нового пользователя
- Каждый чат = отдельная тема (Topic) в этой группе
- История хранится нативно в Telegram (в самой теме)
- Переключение между чатами = переключение между темами
- После `/start` бот создаёт `Чат #1` в DM
- В DM активный чат хранится как `active_chat_id`
- Ответы в личке приходят в общий поток с тегом `[Чат #N]`
- После `/forum` пользователь привязывает свою супергруппу с Topics
- Каждый чат может получить соответствующую тему (`forum_thread_id`)
- В forum-теме ответы приходят без тега, прямо в тему
- История forum-разговоров хранится нативно в Telegram
### Управление чатами
Внутри каждой темы доступны команды:
В DM доступны команды:
| Команда | Действие |
|---|---|
| `/new` | Создать новый чат (новую тему) |
| `/rename Название` | Переименовать текущий чат |
| `/archive` | Архивировать текущий чат |
| `/new` | Создать новый чат |
| `/chats` | Показать список всех чатов |
| `/forum` | Подключить Forum-группу |
В forum-темах поддерживается тот же разговорный контекст, а `/new` может
зарегистрировать текущую тему как отдельный чат.
### Создание нового чата
1. Пользователь пишет `/new` или нажимает кнопку
2. Бот спрашивает название (опционально, можно пропустить)
3. Бот создаёт новую тему в группе: «Чат 1», «Чат 2» и т.д.
4. Бот отправляет в новую тему приветствие; при первом сообщении платформа автоматически поднимает контейнер
1. Пользователь пишет `/new [название]` или нажимает кнопку
2. Бот создаёт новый чат в локальной БД: `Чат #N` или указанное название
3. Если Forum уже подключён, бот дополнительно создаёт новую тему в привязанной группе
4. В DM бот переключает `active_chat_id` на новый чат
### В моке
- Группа и темы создаются реально через Bot API
- Сообщения передаются в MockPlatformClient с `chat_id` (C1, C2...)
- История в темах хранится нативно в Telegram, ничего не нужно делать
- DM-чаты работают сразу после `/start`
- Если Forum подключён, темы создаются реально через Bot API
- Сообщения из DM и forum topic передаются в `MockPlatformClient` с одним и тем же `chat_id`
---
## Основной диалог
### Флоу сообщения
1. Пользователь пишет текст в тему
1. Пользователь пишет текст в DM или в forum topic
2. Бот показывает `typing...`
3. Запрос уходит в платформу (сейчас — MockPlatformClient)
4. Бот отвечает текстом агента
4. Бот отвечает:
- в DM: с тегом `[Чат #N]`
- в forum topic: без тега, в ту же тему
### Вложения
- Фото, документы, голосовые — передаются в платформу как `attachments`
@ -92,7 +102,7 @@
## Настройки
Доступны через `/settings` в любой теме или в главном меню бота.
Доступны через `/settings` в личке или в forum topic.
Реализованы как цепочка инлайн-кнопок.
### Главное меню настроек
@ -198,16 +208,14 @@
## FSM состояния
```
[Start] → AuthPending → AuthConfirmed
GroupSetup → Idle
ReceivingMessage → WaitingResponse → Idle
ConfirmAction → [Confirmed/Cancelled] → Idle
Settings → [подменю] → Idle
```text
[Start] -> ChatState.idle
ForumSetupState.waiting_for_group
ChatState.waiting_response -> ChatState.idle
SettingsState.*
```
---
@ -216,6 +224,6 @@
- Python 3.11+
- aiogram 3.x (Router, FSM, InlineKeyboard, Forum Topics API)
- MockPlatformClient → `platform/interface.py`
- MockPlatformClient → `sdk/mock.py`
- structlog для логирования
- SQLite для хранения `tg_user_id → platform_user_id` и состояния скиллов
- SQLite для хранения `tg_user_id → platform_user_id`, чатов и forum bindings