Files
umb/README.md
T

105 lines
5.6 KiB
Markdown

# UMB — Telegram Bot
Бот для модерации стикеров/GIF, восстановления раскладки, погоды и AI-ассистента "Астра".
## Функции
- **Модерация стикеров и GIF** — если пользователь отправляет 25+ стикеров/GIF за 60 секунд, бот удаляет все последующие стикеры и GIF от этого пользователя в течение 5 минут. Текстовые сообщения не затрагиваются.
- **Восстановление раскладки (`/res`)** — ответьте командой `/res` на сообщение с текстом в неправильной раскладке, и бот переведёт его (например, `gbdj``пиво`).
- **Погода (`/weather`)** — покажет подробную погоду в указанном городе через OpenWeatherMap API.
- **AI-ассистент "Астра" (`/ai`)** — перешлите сообщение или ответьте на него командой `/ai`, и Astra проанализирует его с учётом контекста последних 10 сообщений.
- **Управление AI (`/aino`, `/aiyes`)** — владелец чата может заблокировать/разблокировать пользователя от AI.
- **Поддержка SOCKS5 прокси** — настраивается через `.env`.
## Структура проекта
```
umb/
├── .env # настройки: токен, прокси, API ключи
├── .gitignore
├── requirements.txt
├── main.py # точка входа
├── config.py # конфигурация
└── bot/
├── __init__.py
├── bot.py # инициализация бота и сессии
├── routers/
│ ├── __init__.py
│ ├── moderation.py # роутер модерации стикеров/GIF
│ ├── layout.py # роутер /start, /res
│ ├── weather.py # роутер /weather
│ └── ai.py # роутер /ai, /aino, /aiyes
├── utils/
│ ├── __init__.py
│ ├── layout_converter.py # конвертер раскладки en→ru
│ ├── weather.py # функция получения погоды
│ ├── ai_client.py # OpenRouter AI клиент
│ ├── database.py # SQLAlchemy модели и функции БД
│ └── moderation.py # логика модерации (устарел, теперь в database.py)
└── data/
└── umb.db # SQLite база данных
```
## Установка
```bash
cd umb
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
## Настройка
Откройте `.env` и укажите необходимые ключи:
```env
BOT_TOKEN=your_bot_token_here
PROXY_ENABLED=false
PROXY_URL=socks5://user:pass@host:port
API_WEATHER=your_openweather_api_key
OPENROUTER_API_KEY=your_openrouter_api_key
ROUTERAI_API_KEY=your_routerai_api_key
ROUTERAI_BASE_URL=https://routerai.ru/api/v1
```
Для включения прокси установите `PROXY_ENABLED=true` и укажите корректный `PROXY_URL`.
## Запуск
```bash
source .venv/bin/activate
python main.py
```
## Команды
| Команда | Описание |
|---------|----------|
| `/start` | Приветствие и информация о боте |
| `/res` | Восстановить раскладку (ответить на сообщение) |
| `/weather <город>` | Погода в указанном городе |
| `/ai` | AI-анализ пересланного/ответного сообщения |
| `/aino @username` | Заблокировать пользователя от AI (только creator, 24ч) |
| `/aiyes @username` | Разблокировать пользователя от AI (только creator) |
## Настройки модерации
Изменяются в `config.py`:
- `MODERATION_LIMIT = 25` — количество стикеров/GIF за окно
- `MODERATION_WINDOW = 60` — окно подсчёта в секундах
- `MODERATION_BAN_DURATION = 300` — длительность бана в секундах
## AI-ассистент "Астра"
- **Бесплатные модели** (OpenRouter): пробует по очереди все, при rate-limit переключается на следующую
- `deepseek/deepseek-v4-flash:free`
- `google/gemma-4-26b-a4b-it:free`
- `minimax/minimax-m2.5:free`
- `qwen/qwen3-next-80b-a3b-instruct:free`
- **Платный fallback** (RouterAI): если все бесплатные модели вернули 429, используется `deepseek/deepseek-v4-flash` через `routerai.ru`. В ответе добавляется уведомление `⚡ Обработано через платный API`.
- **Контекст**: хранит последние 10 сообщений каждого пользователя в SQLite
- **Стиль**: отвечает кратко и по делу, если не просят развёрнуто
- **Потеря контекста**: говорит что-то милое ("я потеряла мысль", "смотри, какая птичка!")