Improve Telegram forum onboarding and topic safety
This commit is contained in:
parent
2b56b98697
commit
a1b7a14138
13 changed files with 1101 additions and 376 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue