# 🛡️ PrimoGuard Bot

**Умный бот-модератор для Telegram** с системой фильтрации спама, банвордов и защитой от флуда.

[
[
[

***

## 📑 Содержание

- [Возможности](#-возможности)
- [Быстрый старт](#-быстрый-старт)
- [Конфигурация](#-конфигурация)
- [Команды](#-команды)
- [Система фильтрации](#-система-фильтрации)
- [Middleware](#️-middleware)
- [Примеры использования](#-примеры-использования)
- [Troubleshooting](#-troubleshooting)
- [FAQ](#-faq)

***

## 🎯 Возможности

### Основные функции

✅ **Многоуровневая система фильтрации:**
- 🔤 **Substring** — фильтрация по подстрокам (например: `хуй`)
- 📖 **Lemma** — фильтрация по лемматизации (например: `пидорас` → `пидор`, `пидорасом`, `пидораса`)
- 🧩 **Part** — фильтрация по частям слов без спецсимволов (например: `@Astrixkeepbot` → заблокирует `astrix` и `bot`)

✅ **Временные правила:**
- ⏰ Банворды с истечением срока действия
- 🔄 Автоматическая очистка истёкших правил

✅ **Режимы модерации:**
- 🔇 **Silence Mode** — удаление всех сообщений (режим тишины)
- ⚔️ **Conflict Mode** — блокировка конфликтных слов (для предотвращения споров)
- ✅ **Whitelist** — исключения для разрешённых слов

✅ **Умный антиспам:**
- 🤖 Адаптивные лимиты (текст, пересылки, медиа, callback)
- 🧠 Детекция спам-паттернов (идентичные сообщения, спам кнопок)
- ⭐ Система репутации пользователей (0.5x - 2.0x к лимитам)
- 🚫 Прогрессивные блокировки (1 мин → 2 мин → 5 мин → 15 мин → 1 час)

✅ **Статистика и аналитика:**
- 📊 Топ-10 самых частых срабатываний
- 👥 Статистика по пользователям
- 📈 Общее количество удалённых сообщений

✅ **Администрирование:**
- 👨‍💼 Многоуровневая система администраторов
- 🔔 Уведомления админов о спаме
- 🎛️ Удобное управление через команды и callback-кнопки

***

## 🚀 Быстрый старт

### 1. Клонируйте репозиторий

```bash
git clone https://github.com/yourusername/primo_guard_bot.git
cd primo_guard_bot
```

### 2. Создайте файл `.env`

```bash
cp .env.example .env
nano .env
```

**Минимальная конфигурация:**

```env
# === BOT SETTINGS ===
BOT_TOKEN=YOUR_BOT_TOKEN_FROM_BOTFATHER

# === ADMIN IDS ===
OWNER_ID=[123456789,987654321]
ADMIN_CHAT_ID=-1001234567890

# === WEBHOOK (если используете) ===
WEBHOOK=true
WEBHOOK_URL=https://yourdomain.com/webhook
SECRET_TOKEN=your_random_secret_32_chars_here

# === SERVER ===
WEBAPP_HOST=0.0.0.0
WEBAPP_PORT=3131
```

### 3. Запустите через Docker Compose

```bash
docker compose up -d
```

### 4. Проверьте логи

```bash
docker compose logs -f
```

### 5. Добавьте бота в группу

1. Добавьте бота в вашу группу
2. Выдайте права администратора (удаление сообщений)
3. Отправьте `/start` в группе

***

## ⚙️ Конфигурация

### Полный `.env` файл

```env
# ═══════════════════════════════════════════════════════════════════════════
#                         🤖 BOT TOKEN
# ═══════════════════════════════════════════════════════════════════════════

# [ОБЯЗАТЕЛЬНО] Токен бота от @BotFather
BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz

# ═══════════════════════════════════════════════════════════════════════════
#                         👤 АДМИНИСТРАТОРЫ И ID
# ═══════════════════════════════════════════════════════════════════════════

# [ОБЯЗАТЕЛЬНО] ID владельцев бота (список через запятую)
OWNER_ID=[123456789,987654321]

# [ОБЯЗАТЕЛЬНО] ID чата для уведомлений админов
ADMIN_CHAT_ID=-1001234567890

# Дополнительные админы (необязательно)
ADMIN_ID=[111111111,222222222]

# ═══════════════════════════════════════════════════════════════════════════
#                         ⚙️ ОСНОВНЫЕ НАСТРОЙКИ БОТА
# ═══════════════════════════════════════════════════════════════════════════

# Имя бота
BOT_NAME=PrimoGuard Bot

# Описание бота (до 512 символов)
BOT_DESCRIPTION=Бот-модератор для защиты чата от спама и нецензурных слов

# Короткое описание (до 120 символов)
BOT_SHORT_DESCRIPTION=Тех.поддержка: @yourusername

# Автоматически обновлять настройки бота при запуске
BOT_EDIT=false

# ═══════════════════════════════════════════════════════════════════════════
#                         🌐 WEBHOOK SETTINGS
# ═══════════════════════════════════════════════════════════════════════════

# Использовать webhook вместо long polling
# false = long polling (для локальной разработки)
# true = webhook (для продакшена, требует HTTPS)
WEBHOOK=true

# URL вебхука (обязателен если WEBHOOK=true)
WEBHOOK_URL=https://yourdomain.com/webhook

# Секретный токен для вебхука (генерируется автоматически если не указан)
SECRET_TOKEN=vK8mP2nQ7xR4wJ9sL6fY3tB5hN0cV1zA

# Хост для сервера (обычно 0.0.0.0)
WEBAPP_HOST=0.0.0.0

# Порт для сервера
WEBAPP_PORT=3131

# Уровень логов (debug, info, warning, error, critical)
LOG_LEVEL=info

# Включить access log
ACCES_LOG=false

# ═══════════════════════════════════════════════════════════════════════════
#                         📊 DATABASE
# ═══════════════════════════════════════════════════════════════════════════

# Путь к базе данных SQLite
DATABASE_PATH=banwords.db

# ═══════════════════════════════════════════════════════════════════════════
#                         🔧 ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ
# ═══════════════════════════════════════════════════════════════════════════

# Префикс команд
PREFIX=/

# Таймаут между сообщениями (антиспам, секунды)
TIMEOUT=3
```

### Docker Compose

Ваш `docker-compose.yml` уже настроен оптимально:

```yaml
services:
  primoguard:
    image: whyverum/primo_guard_bot:latest
    container_name: primoguard-bot
    restart: unless-stopped
    
    env_file:
      - .env
    
    volumes:
      - ./banwords.db:/app/banwords.db
      - ./Logs:/app/Logs
    
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M
    
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    
    stop_grace_period: 30s
    
    networks:
      - proxy

networks:
  proxy:
    external: true
```

***

## 📝 Команды

### Основные команды

| Команда | Описание | Доступ |
|---------|----------|--------|
| `/start` | Запуск бота и главное меню | Все |
| `/help` | Помощь по командам | Все |
| `/stats` | Статистика модерации | Админы |
| `/id` | Информация о вашем аккаунте | Все |
| `/chatid` | ID текущего чата | Все |

### Управление банвордами (постоянные)

| Команда | Пример | Описание |
|---------|--------|----------|
| `/addword` | `/addword хуй` | Добавить подстроку |
| `/addlemma` | `/addlemma пидорас` | Добавить лемму |
| `/addpart` | `/addpart astrix` | Добавить часть слова |
| `/remword` | `/remword хуй` | Удалить подстроку |
| `/remlemma` | `/remlemma пидорас` | Удалить лемму |
| `/rempart` | `/rempart astrix` | Удалить часть |

### Временные банворды

| Команда | Пример | Описание |
|---------|--------|----------|
| `/addtempword` | `/addtempword спам 24h` | Добавить временную подстроку (24 часа) |
| `/addtemplemma` | `/addtemplemma флудить 12h` | Добавить временную лемму (12 часов) |
| `/remtempword` | `/remtempword спам` | Удалить временную подстроку |

**Форматы времени:** `1h`, `24h`, `7d`, `30d`

### Исключения (whitelist)

| Команда | Пример | Описание |
|---------|--------|----------|
| `/addexcept` | `/addexcept психология` | Добавить в whitelist |
| `/remexcept` | `/remexcept психология` | Удалить из whitelist |

### Конфликтные слова

| Команда | Пример | Описание |
|---------|--------|----------|
| `/addconflictword` | `/addconflictword политика` | Добавить конфликтное слово |
| `/stopconflict` | `/stopconflict` | Включить режим антиконфликта |
| `/unstopconflict` | `/unstopconflict` | Выключить режим |
| `/conflictstatus` | `/conflictstatus` | Проверить статус режима |

### Режим тишины

| Команда | Описание |
|---------|----------|
| `/silence 30m` | Включить тишину на 30 минут |
| `/unsilence` | Выключить режим тишины |
| `/silencestatus` | Проверить статус |
| `/extend_silence 1h` | Продлить тишину на 1 час |

### Администрирование

| Команда | Пример | Описание |
|---------|--------|----------|
| `/addadmin` | `/addadmin @username` | Добавить администратора |
| `/remadmin` | `/remadmin @username` | Удалить администратора |
| `/listadmins` | `/listadmins` | Список администраторов |
| `/checkadmin` | `/checkadmin @username` | Проверить статус |

### Статистика

| Команда | Описание |
|---------|----------|
| `/userstats` | Статистика по пользователю |
| `/resetstats confirm` | Сбросить всю статистику |

### Просмотр правил

| Команда | Описание |
|---------|----------|
| `/listwords` | Список всех подстрок |
| `/listlemmas` | Список всех лемм |
| `/listparts` | Список всех частей |
| `/listexcept` | Список исключений |
| `/listconflict` | Список конфликтных слов |

### Утилиты

| Команда | Описание |
|---------|----------|
| `/emoji текст` | Извлечь все эмодзи из текста |
| `/ping` | Проверить отклик бота |
| `/checkwebhook` | Проверить статус webhook (админы) |

***

## 🔍 Система фильтрации

### 1. Substring (Подстроки)

**Как работает:** Простой поиск подстроки в тексте.

```
Правило: "хуй"
✅ Заблокирует: "хуй", "хуйня", "похуй", "нахуй"
❌ Не заблокирует: "психология" (хотя содержит "хуй", но это безобидное слово)
```

**Когда использовать:** Для коротких и однозначных матов.

### 2. Lemma (Лемматизация)

**Как работает:** Приводит слова к нормальной форме и сравнивает.

```
Правило: "пидорас" (лемма: "пидор")
✅ Заблокирует: "пидорас", "пидораса", "пидорасом", "пидорасы"
❌ Не заблокирует: "пидор123" (не является словом)
```

**Когда использовать:** Для блокировки всех форм слова.

### 3. Part (Части слов)

**Как работает:** Удаляет ВСЕ спецсимволы и ищет часть.

```
Правило: "astrix"
✅ Заблокирует: "@Astrixkeepbot", "astrix.bot", "a-s-t-r-i-x"
❌ Не заблокирует: "astronomy" (не содержит точную последовательность)
```

**Когда использовать:** Для блокировки упоминаний ботов/каналов со спецсимволами.

### 4. Whitelist (Исключения)

**Как работает:** Проверяется ПЕРВЫМ, до всех фильтров.

```
Whitelist: "психология"
✅ Пропустит: "я изучаю психологию"
✅ Пропустит: "психолог"
```

**Когда использовать:** Для безобидных слов, содержащих мат.

### 5. Временные правила

**Как работает:** Автоматически удаляются после истечения срока.

```
Команда: /addtempword флуд 24h
Результат: Слово "флуд" будет блокироваться 24 часа
```

**Когда использовать:** Для временных мер (события, рейды).

***

## 🛡️ Middleware

### 1. BanWordsMiddleware (Основная защита)

**Приоритет:** Высокий  
**Применяется к:** Все текстовые сообщения

**Функции:**
- Проверка на substring, lemma, part
- Проверка временных банвордов
- Проверка whitelist
- Режим тишины
- Режим антиконфликта

**Pipeline проверки:**
```
1. Пропуск админов
2. Проверка whitelist → ПРОПУСТИТЬ
3. Silence Mode → УДАЛИТЬ
4. Conflict Mode + конфликтные слова → УДАЛИТЬ
5. Substring → УДАЛИТЬ
6. Part → УДАЛИТЬ
7. Lemma → УДАЛИТЬ
8. Временные банворды → УДАЛИТЬ
9. ✅ Пропустить сообщение
```

***

### 2. AntiSpamMiddleware (Умный антиспам)

**Приоритет:** Средний  
**Применяется к:** Все сообщения и callback

**Функции:**
- ⚡ Адаптивные лимиты по типам сообщений
- 🧠 Детекция спам-паттернов
- ⭐ Система репутации (0.5x - 2.0x)
- 🚫 Прогрессивные блокировки

**Лимиты по умолчанию:**

| Тип | Лимит | Окно | Описание |
|-----|-------|------|----------|
| 📝 Текст | 8 сообщений | 10 сек | Обычные текстовые сообщения |
| ↗️ Пересылки | 20 сообщений | 10 сек | Можно массово пересылать! |
| 🔘 Callback | 10 нажатий | 10 сек | Нажатия на кнопки |
| 📷 Медиа | 10 файлов | 10 сек | Фото, видео, документы |
| ⚡ Команды | ∞ | - | Не ограничены |

**Умная детекция:**
- ❌ 5 одинаковых текстов подряд → немедленная блокировка
- ❌ 8 нажатий одной кнопки → блокировка
- ❌ 7+ медиа подряд → предупреждение

**Система репутации:**
```
Новый пользователь: 1.0x (стандартные лимиты)
Хорошее поведение: до 2.0x (лимиты удваиваются!)
Плохое поведение: до 0.5x (лимиты снижаются вдвое)
```

**Прогрессивные блокировки:**
```
1 предупреждение → 2 мин блокировка
2 предупреждения → 4 мин
3 предупреждения → 8 мин
4 предупреждения → 16 мин
5+ предупреждений → 1 час (максимум)
```

***

### 3. LoggingMiddleware (Логирование)

**Приоритет:** Низкий  
**Применяется к:** Все события

**Функции:**
- 📝 Логирование всех команд
- 📊 Логирование всех событий
- 🔍 Детальная информация для отладки

***

### 4. ErrorHandlingMiddleware (Обработка ошибок)

**Приоритет:** Последний  
**Применяется к:** Все события

**Функции:**
- ❌ Перехват всех исключений
- 📧 Уведомления админов об ошибках
- 🔄 Graceful recovery

***

### 5. TimingMiddleware (Замер времени)

**Приоритет:** Первый  
**Применяется к:** Все события

**Функции:**
- ⏱️ Замер времени выполнения
- 📊 Профилирование производительности

***

## 💡 Примеры использования

### Сценарий 1: Настройка для чата с матами

```bash
# 1. Добавляем основные маты
/addword хуй
/addword блять
/addlemma пидорас
/addlemma ебать

# 2. Добавляем исключения
/addexcept психология
/addexcept архитектура

# 3. Проверяем правила
/listwords
```

### Сценарий 2: Блокировка упоминаний ботов

```bash
# 1. Добавляем части названий ботов
/addpart astrix
/addpart keepbot
/addpart spambot

# 2. Проверяем
# ✅ Заблокируется: "@Astrixkeepbot", "astrix_bot"
```

### Сценарий 3: Временная блокировка темы

```bash
# Событие: выборы, запрещаем политику на 3 дня
/addtempword политика 3d
/addtempword выборы 3d
/addtemplemma голосовать 3d

# Через 3 дня слова автоматически разблокируются
```

### Сценарий 4: Режим тишины во время рейда

```bash
# 1. Включаем тишину на 1 час
/silence 1h

# Все сообщения от не-админов удаляются

# 2. Если рейд продолжается, продлеваем
/extend_silence 30m

# 3. Отключаем вручную
/unsilence
```

### Сценарий 5: Антиконфликтный режим

```bash
# 1. Добавляем конфликтные темы
/addconflictword политика
/addconflictword религия
/addconflictlemma спорить

# 2. Включаем режим
/stopconflict

# Теперь сообщения с этими словами удаляются

# 3. Выключаем после события
/unstopconflict
```

***

## 🔧 Troubleshooting

### Бот не отвечает в группе

**Решение:**
```bash
# 1. Проверьте права администратора
# Бот ДОЛЖЕН иметь право "Удаление сообщений"

# 2. Проверьте webhook
docker exec primoguard-bot python -c "
from configs import settings
import requests
url = f'https://api.telegram.org/bot{settings.BOT_TOKEN}/getWebhookInfo'
print(requests.get(url).json())
"

# 3. Проверьте логи
docker compose logs -f

# 4. Перезапустите
docker compose restart
```

### Ошибка 401 Unauthorized (Webhook)

**Причина:** Несовпадение SECRET_TOKEN

**Решение:**
```bash
# 1. Удалите webhook
curl "https://api.telegram.org/botYOUR_TOKEN/deleteWebhook?drop_pending_updates=true"

# 2. Проверьте .env файл
cat .env | grep SECRET_TOKEN

# 3. Перезапустите
docker compose down
docker compose up -d
```

### База данных заблокирована (database is locked)

**Решение:**
```bash
# 1. Остановите все контейнеры
docker compose down

# 2. Проверьте права
sudo chown -R $USER:$USER banwords.db

# 3. Запустите
docker compose up -d
```

### Бот не удаляет сообщения

**Проверьте:**
1. ✅ Бот — администратор группы
2. ✅ Есть право "Удаление сообщений"
3. ✅ Правила банвордов добавлены (`/listwords`)
4. ✅ Пользователь не в списке админов (`/listadmins`)

***

## ❓ FAQ

### Как узнать свой ID?

Отправьте `/id` боту или используйте @userinfobot

### Как узнать ID группы?

1. Добавьте бота в группу
2. Отправьте `/chatid` в группе

### Можно ли использовать без webhook?

Да! Установите в `.env`:
```env
WEBHOOK=false
```

### Как добавить несколько админов?

```env
OWNER_ID=[123456789,987654321,555666777]
ADMIN_ID=[111222333,444555666]
```

### Сколько правил можно добавить?

Ограничений нет, но рекомендуется до 1000 слов для оптимальной производительности.

### Работает ли на русском и английском?

Да! Поддерживаются все языки с Unicode.

### Как сделать backup базы данных?

```bash
# Создайте backup
cp banwords.db banwords_backup_$(date +%Y%m%d).db

# Или через Docker
docker cp primoguard-bot:/app/banwords.db ./backup/
```

### Как обновить бота?

```bash
# 1. Остановите
docker compose down

# 2. Обновите образ
docker pull whyverum/primo_guard_bot:latest

# 3. Запустите
docker compose up -d
```

### Влияет ли на производительность группы?

Нет! Бот обрабатывает сообщения за ~10-50мс. Для пользователей задержка незаметна.

***

## 📊 Мониторинг

### Просмотр логов

```bash
# Все логи
docker compose logs -f

# Только ошибки
docker compose logs -f | grep ERROR

# Последние 100 строк
docker compose logs --tail=100

# Логи за сегодня
docker compose logs --since $(date +%Y-%m-%d)
```

### Статистика Docker

```bash
# Использование ресурсов
docker stats primoguard-bot

# Информация о контейнере
docker inspect primoguard-bot

# Размер логов
docker logs primoguard-bot 2>&1 | wc -l
```

## 📄 Лицензия

MIT License - см. [LICENSE](LICENSE)

***

## 🙏 Благодарности

- [aiogram](https://github.com/aiogram/aiogram) - асинхронный фреймворк для Telegram Bot API
- [pymorphy2](https://github.com/pymorphy2/pymorphy2) - морфологический анализатор для русского языка
- [SQLAlchemy](https://www.sqlalchemy.org/) - ORM для работы с базой данных

***

**⭐ Если бот помог вам, поставьте звезду на GitHub!**
