forked from zovos/bot_tg
99 lines
6 KiB
Markdown
99 lines
6 KiB
Markdown
# Sex Bomba TG Bot
|
||
|
||
Телеграм‑бот, который:
|
||
- вписывает текст шрифтом Impact (белый с чёрной обводкой) в макеты (`/maket`);
|
||
- делает мемы из присланных фото (`/gen_mem Up:... Down:...`);
|
||
- подсказывает, сколько минут до перекура по заданному расписанию (`/break`);
|
||
- показывает расписание, текущую и следующую пару (`/schedule`, можно с днём недели);
|
||
- умеет базарить (`/talk`) с контекстом 100 сообщений;
|
||
- авто-ответы в чате (10% шанс + триггер-слова);
|
||
- миниигра `/penis` + `/top_penis`;
|
||
- казино на размер (`/penis_casino`);
|
||
- гадание на фене с мемом (`/gadanie`);
|
||
- ставки на матчи CS2, Dota 2, футбол с реальными коэффициентами (`/matches`, `/bet`).
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
docker compose up --build -d
|
||
```
|
||
|
||
Логи:
|
||
|
||
```bash
|
||
docker compose logs -f bot
|
||
```
|
||
|
||
Остановка:
|
||
|
||
```bash
|
||
docker compose down
|
||
```
|
||
|
||
Переменные окружения: задайте `BOT_TOKEN` в `.env`.
|
||
Для ИИ-фич нужен `LLAMA_API_URL`.
|
||
Для ставок нужен `ODDS_API_KEY` (бесплатно на https://the-odds-api.com).
|
||
|
||
Контейнер хранит состояние в `./db`:
|
||
- `penis_stats.sqlite3`
|
||
- `chat_history.sqlite3`
|
||
- `polychaetsi_stats.json`
|
||
- `bets.sqlite3`
|
||
|
||
## Команды
|
||
|
||
- `/start` — отвечает кратко.
|
||
- `/help` — выводит подсказки и список макетов.
|
||
- `/maket <id> <текст>` — вписать текст в макет. Доступные: `1 — Владимир Владимирович Путин самый лучший президент` (737x414, точка 104,240).
|
||
- `/gen_mem Up:верх Down:низ` — прислать с фото (подпись) или ответом на фото. Можно указывать только Up или только Down.
|
||
- `/break` — показывает, сколько минут до ближайшего перекура/идёт ли перекур.
|
||
- `/schedule [пн|mon]` — показывает расписание на ближайший указанный день недели; без аргумента показывает сегодня, текущую и следующую пару.
|
||
- `/talk <сообщение>` — побазарить с ИИ (контекст 100 сообщений).
|
||
- `/penis` — миниигра, 1 раз в 24 часа.
|
||
- `/top_penis` — топ по длине.
|
||
- `/polychaetsi` — топ по слову «получается».
|
||
- `/penis_casino <ставка>` — казино на размер (макс 1 см, казино всегда в выигрыше).
|
||
- `/gadanie <тема>` — ИИ-гадание на фене + авто-мем.
|
||
- `/ebalnik` — вкл/выкл авто-ответы бота в чате.
|
||
- `/matches [cs|dota|football]` — ближайшие матчи с коэффициентами.
|
||
- `/bet [спорт] <номер> <исход> <ставка>` — поставить см на матч.
|
||
- `/mybets` — мои активные ставки.
|
||
- `/svodka` — сводка СВО.
|
||
- `/uwu [теги]` — поиск случайной пикчи/гифки на e621 (по умолчанию sfw, можно указать свои теги).
|
||
|
||
## Макеты и шрифт
|
||
|
||
- Шрифт `impact.ttf` лежит в корне.
|
||
- Макеты в `maket/`, сейчас есть `1.png`. Добавляйте новые, прописав их в словаре `TEMPLATES` в `main.py`.
|
||
|
||
## Технологии
|
||
|
||
- Python 3.11, aiogram 3, Pillow.
|
||
- llama.cpp для ИИ-фич.
|
||
- Dockerfile + docker-compose для развёртывания.
|
||
|
||
## Docker Notes
|
||
|
||
- Образ ставит `tzdata`, поэтому `ZoneInfo("Europe/Moscow")` нормально работает в контейнере.
|
||
- В образ копируется весь проект, а runtime-данные исключены через `.dockerignore`.
|
||
- Если меняешь код или картинки, достаточно пересобрать: `docker compose up --build -d`.
|
||
|
||
## Кратко о логике
|
||
|
||
- `/maket` подбирает размер текста, чтобы уместить его в область макета.
|
||
- `/gen_mem` центрирует текст по ширине, масштабирует под изображение, рисует белый текст с чёрной обводкой.
|
||
- `/break` считает по расписанию в `config.py` и показывает следующую пару.
|
||
- Названия пар и верхняя/нижняя неделя лежат в `config.py` в `LESSON_SCHEDULE`.
|
||
- `/talk` шлёт запрос к llama.cpp серверу с контекстом 100 сообщений (хранятся в SQLite).
|
||
- `/penis_casino` — слоты с множителем x1.2–x3 (`games/casino.py`).
|
||
- `/gadanie` — ИИ-гадание + авто-мем через `generate_meme` (`games/fortune.py`).
|
||
- `/matches` + `/bet` — ставки на реальные матчи, коэффициенты через The-Odds-API (`games/betting.py`). После `/matches cs|dota|football` можно короче: `/bet <номер> <исход> <ставка>`.
|
||
|
||
## ИИ-модуль (`AI/talk_handler.py`)
|
||
|
||
Подключается к llama.cpp серверу через OpenAI-совместимый API (`/v1/chat/completions`). Хранит контекст 100 сообщений в SQLite.
|
||
|
||
Настройка сервера:
|
||
1. Скачать модель: `wget https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF/resolve/main/qwen2.5-1.5b-instruct-q4_k_m.gguf`
|
||
2. Запустить: `./llama-server -m model.gguf --host 0.0.0.0 --port 8080 -c 2048`
|
||
3. Прописать URL в `.env`: `LLAMA_API_URL=http://адрес:8080`
|