post message
Some checks failed
CI / Lint (ruff + mypy) (push) Failing after 32s
CI / Run tests (push) Has been skipped
CI / Docker build test (push) Successful in 10s

This commit is contained in:
2026-04-02 20:59:04 +07:00
parent c286039df7
commit d8231c13a4
5 changed files with 266 additions and 241 deletions

View File

@@ -1,44 +1,51 @@
# Session Status Bot
Бот на `aiogram 3` для управления статусами персонажей через кнопки и автоматического обновления одного сообщения в канале.
Бот на `aiogram 3` для управления статусами актеров и обновления одного поста в канале.
## Что умеет
- показывает пользователю только его кнопку, если он привязан по `operator_user_id` или `operator_user_ids`
- позволяет админам видеть все кнопки
- после выбора персонажа предлагает статус: `open`, `backstage`, `delay`, `rest`
- после выбора статуса все основные действия доступны кнопками: шаблон, без фразы, своя фраза, назад
- обновляет заданное сообщение в канале через `edit_message_text`
- рендерит пост как HTML с кликабельными ссылками
- хранит текущее состояние в `data/state.json`
- показывает пользователю только его кнопку актера
- после выбора актера сразу дает один экран кнопок:
`Открыть`, `Закулисье`, `Задержка`, `Антракт`, `Своя фраза`
- статусы применяются сразу с шаблонной фразой
- `Своя фраза` меняет текст для текущего статуса
- обновляет сообщение канала в `MarkdownV2`
- умеет хранить шаблон поста через `/post`
## Команды
- `/start` или `/panel` — открыть панель
- `/help` — справка
- `/refresh` — перерисовать пост в канале
- `/cancel` — сбросить текущий ввод
- `/post` — сохранить шаблон поста
## Шаблон поста
Шаблон должен содержать:
- `{{actors}}` — сюда бот вставляет блок актеров
- `{{hidden_link}}` — необязательно, сюда бот вставляет скрытую ссылку для превью
Если `{{hidden_link}}` не указан, но в [config/actors.json](/c:/Users/admin/Desktop/pidoras/config/actors.json) заполнен `hidden_link_url`, бот добавит скрытую ссылку в начало сам.
Важно: если просто переслать уже оформленный Telegram-пост, Telegram не гарантирует точное восстановление исходного `MarkdownV2`. Надежнее отправлять шаблон как обычный текст или реплаем на текстовый пост.
## Настройка
1. Установите зависимости:
1. Установить зависимости:
```powershell
uv sync
```
2. Заполните `.env` по примеру из `[.env.example](/c:/Users/admin/Desktop/pidoras/.env.example)`.
2. Заполнить `.env`.
Обязательные переменные:
3. Проверить [config/actors.json](/c:/Users/admin/Desktop/pidoras/config/actors.json):
- `BOT_TOKEN` — токен бота
- `CHANNEL_ID` — ID канала, где лежит обновляемое сообщение
- `CHANNEL_MESSAGE_ID` — ID сообщения в канале
- `ADMIN_IDS` — список Telegram user id через запятую
3. Отредактируйте `[config/actors.json](/c:/Users/admin/Desktop/pidoras/config/actors.json)`.
Для каждого участника задаются:
- `key` — внутренний ключ
- `button_text` — текст на кнопке
- `display_name` — имя в посте
- `link` — ссылка на бота
- `operator_user_id` или `operator_user_ids` — Telegram user id человека, который может менять этот статус
- `phrases` — шаблонные фразы под каждый статус
- `hidden_link_url` — ссылка для скрытого превью
- `phrases` — шаблонные фразы под статусы
- `operator_user_id` или `operator_user_ids` — кто может менять статус
## Запуск
@@ -46,26 +53,8 @@ uv sync
uv run python main.py
```
## Команды
- `/start` или `/panel` — открыть панель
- `/help` — показать справку
- `/refresh` — принудительно перерисовать сообщение канала
- `/cancel` — сбросить текущий ввод и вернуться к панели
## Как это работает
1. Пользователь пишет `/start`.
2. Бот показывает доступные кнопки персонажей.
3. После выбора персонажа бот показывает кнопки статусов.
4. После выбора статуса бот показывает кнопки вариантов фразы.
5. Если выбрать `Своя фраза`, бот ждет одно текстовое сообщение.
6. После выбора бот редактирует сообщение в канале.
## Проверка
Тест рендера:
```powershell
uv run --with pytest python -m pytest
```