428th-exchange-bot/README.md
Artemii Peretiachenko 7588d74ceb Show the wait-ack only on a client's first relayed message.
Stops repeating the ack on every client message so the private chat is not cluttered after the first contact.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-29 19:00:21 +02:00

100 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 428th Exchange Bot
Telegram-бот — прослойка между клиентом и менеджером.
Клиент пишет боту в личку. Менеджер отвечает в супергруппе с **Topics**: у каждого клиента своя тема. Клиент получает ответы от имени бота.
## Требования
- Python 3.9+
- Бот от [@BotFather](https://t.me/BotFather)
- Супергруппа с включёнными темами (Topics)
## Быстрый старт
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# отредактируйте .env
python -m bot
```
## Настройка Telegram
1. Создайте бота у @BotFather и скопируйте token в `BOT_TOKEN`.
2. Создайте супергруппу, включите **Topics** (настройки группы → Topics).
3. Добавьте бота в группу и сделайте **администратором** с правами:
- Manage topics
- Post messages
- Delete messages (нужно для `/del`)
4. Узнайте `chat_id` группы и пропишите в `MANAGER_GROUP_ID` (обычно отрицательный, вида `-100…`).
- Запустите бота, добавьте его в группу — в лог напишется id чата.
- Либо перешлите любое сообщение из группы боту [@userinfobot](https://t.me/userinfobot) / аналогу.
5. Напишите боту `/start` с тестового аккаунта и отправьте сообщение — в группе появится новая тема.
## Переменные окружения
| Переменная | Описание |
|---|---|
| `BOT_TOKEN` | Token бота |
| `MANAGER_GROUP_ID` | Id супергруппы с Topics |
| `DATABASE_PATH` | Путь к SQLite (по умолчанию `data/bot.db`) |
| `WELCOME_TEXT_RU` / `WELCOME_TEXT_UK` | Опционально: приветствие для языка |
| `ACK_TEXT_RU` / `ACK_TEXT_UK` | Опционально: текст после первого сообщения клиента |
| `COOLDOWN_TEXT_RU` / `COOLDOWN_TEXT_UK` | Опционально: ответ при кулдауне |
| `WELCOME_TEXT` / `ACK_TEXT` / `COOLDOWN_TEXT` | Legacy: только для RU (UK не перезаписывается) |
| `CLIENT_COOLDOWN_SECONDS` | Кулдаун клиента в секундах (по умолчанию `5`) |
## Как это работает
1. Клиент: `/start` → выбор языка (RU/UK) → приветствие, запись в SQLite.
2. Клиент пишет сообщение → бот создаёт тему (если ещё нет) и копирует сообщение менеджерам. На первое сообщение — «Спасибо, дальше вам будет отвечать менеджер»; дальше ack не повторяется.
3. Менеджер пишет в теме клиента → бот копирует содержимое клиенту в личку от своего имени.
4. Правки сообщений синхронизируются в обе стороны (текст и подписи).
5. Реакции синхронизируются в обе стороны.
6. Удаление: ответьте на сообщение командой `/del` — копия удалится и у клиента, и у менеджера.
7. Язык можно сменить командой `/lang`. Список услуг — кнопка под приветствием.
Сообщения бота в теме (копии от клиента) обратно клиенту не уходят.
## Запуск
```bash
source .venv/bin/activate
python -m bot
```
Данные клиентов хранятся в SQLite (`telegram_id``topic_id`).
Рядом с `bot.db` могут появляться файлы `-wal` / `-shm` (режим WAL) — их тоже не нужно коммитить (`data/` в `.gitignore`).
При старте бот проверяет `MANAGER_GROUP_ID`: супергруппа с Topics, бот — админ с правами Manage topics и Delete messages. При ошибке процесс завершится с понятным текстом в логе и stderr.
## Деплой на VPS (Docker)
Нужны Docker и Docker Compose. Бот работает через long-polling — открывать порты не нужно, достаточно исходящего HTTPS к `api.telegram.org`. Запускайте **один** контейнер на один `BOT_TOKEN`.
```bash
git clone <repo-url> && cd 428th-exchange-bot
cp .env.example .env
# заполните BOT_TOKEN и MANAGER_GROUP_ID
mkdir -p data
# каталог должен быть доступен пользователю контейнера (uid 1000)
sudo chown -R 1000:1000 data
docker compose up -d --build
docker compose logs -f
```
SQLite лежит в `./data` на хосте (`DATABASE_PATH=/app/data/bot.db` внутри контейнера). Бэкапьте эту папку (вместе с `-wal` / `-shm`, если они есть).
Полезные команды:
```bash
docker compose ps
docker compose restart
docker compose down # остановить без удаления ./data
docker compose up -d --build # обновить код после git pull
```