Andrew K. Choi b6c27b7b70
Some checks reported errors
continuous-integration/drone/push Build encountered an error
feat: добавлена система чата с модерацией
Реализована полнофункциональная система чата с двумя режимами работы:

## Режимы работы:
- Broadcast: рассылка сообщений всем пользователям
- Forward: пересылка сообщений в указанную группу/канал

## Функционал:
- Поддержка всех типов сообщений: text, photo, video, document, animation, sticker, voice
- Система банов: личные баны пользователей и глобальный бан чата
- Модерация: удаление сообщений с отслеживанием в БД
- История сообщений с сохранением ID пересланных сообщений

## Структура БД (миграция 005):
- chat_settings: настройки чата (режим, ID канала, глобальный бан)
- banned_users: история банов с причинами и информацией о модераторе
- chat_messages: история сообщений с типами, файлами и картой доставки (JSONB)

## Сервисы:
- ChatSettingsService: управление настройками чата
- BanService: управление банами пользователей
- ChatMessageService: работа с историей сообщений
- ChatPermissionService: проверка прав на отправку сообщений

## Обработчики:
- chat_handlers.py: обработка сообщений пользователей (7 типов контента)
- admin_chat_handlers.py: админские команды управления чатом

## Админские команды:
- /chat_mode - переключение режима (broadcast/forward)
- /set_forward <chat_id> - установка ID канала для пересылки
- /ban <user_id> [причина] - бан пользователя
- /unban <user_id> - разбан пользователя
- /banlist - список забаненных
- /global_ban - включение/выключение глобального бана
- /delete_msg - удаление сообщения (ответ на сообщение)
- /chat_stats - статистика чата

## Документация:
- docs/CHAT_SYSTEM.md: полное описание системы с примерами использования

Изменено файлов: 7 (2 modified, 5 new)
- main.py: подключены chat_router и admin_chat_router
- src/core/models.py: добавлены модели ChatSettings, BannedUser, ChatMessage
- migrations/versions/005_add_chat_system.py: миграция создания таблиц
- src/core/chat_services.py: сервисный слой для чата (267 строк)
- src/handlers/chat_handlers.py: обработчики сообщений (447 строк)
- src/handlers/admin_chat_handlers.py: админские команды (369 строк)
- docs/CHAT_SYSTEM.md: документация (390 строк)
2025-11-16 14:25:09 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-12 20:57:36 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-16 12:36:02 +09:00
2025-11-15 20:03:49 +09:00

# Телеграм-бот для розыгрышей

Телеграм-бот на Python для проведения розыгрышей с возможностью ручной установки победителей.

## Особенности

- 🎲 Создание и управление розыгрышами
- 👑 Ручная установка победителей на любое место
- 🎯 Автоматический розыгрыш с учетом заранее установленных победителей
- 📊 Управление участниками
- 🔧 **Расширенная админ-панель** с полным контролем
- 💾 Поддержка SQLite и PostgreSQL через SQLAlchemy ORM
- 📈 Детальная статистика и отчеты
- 💾 Экспорт данных
- 🧹 Утилиты очистки и обслуживания
- 🐳 **Docker поддержка** для контейнеризации
- 🚀 **CI/CD pipeline** с Drone CI
- 📦 **Модульная архитектура** для легкого расширения

## Технологии

- **Python 3.12+** (рекомендуется Python 3.12.3+)
- **aiogram 3.16** - для работы с Telegram Bot API
- **SQLAlchemy 2.0.36** - ORM для работы с базой данных
- **Alembic 1.14** - миграции базы данных
- **python-dotenv** - управление переменными окружения
- **asyncpg 0.30** - асинхронный драйвер для PostgreSQL
- **aiosqlite 0.20** - асинхронный драйвер для SQLite
- **Docker & Docker Compose** - контейнеризация
- **Prometheus & Grafana** - мониторинг (опционально)

## Архитектура проекта

```
lottery_bot/
├── src/                          # Основной код приложения
│   ├── __init__.py
│   ├── core/                     # Ядро приложения
│   │   ├── __init__.py
│   │   ├── config.py             # Конфигурация
│   │   ├── database.py           # Подключение к БД
│   │   ├── models.py             # Модели SQLAlchemy
│   │   └── services.py           # Бизнес-логика
│   ├── handlers/                 # Обработчики событий
│   │   ├── __init__.py
│   │   ├── account_handlers.py   # Обработка счетов
│   │   ├── account_services.py   # Сервисы счетов
│   │   └── admin_panel.py        # Админ-панель
│   ├── utils/                    # Утилиты
│   │   ├── __init__.py
│   │   ├── account_utils.py      # Работа со счетами
│   │   ├── admin_utils.py        # Админ утилиты
│   │   ├── async_decorators.py   # Асинхронные декораторы
│   │   ├── task_manager.py       # Управление задачами
│   │   └── utils.py              # Общие утилиты
│   └── display/                  # Компоненты отображения
│       ├── __init__.py
│       ├── conduct_draw.py       # Проведение розыгрыша
│       ├── demo_admin.py         # Демонстрация админки
│       ├── simple_draw.py        # Простой розыгрыш
│       └── winner_display.py     # Отображение победителей
├── tests/                        # Тесты
├── docs/                         # Документация
├── scripts/                      # Скрипты
├── data/                         # Данные
├── migrations/                   # Миграции БД
├── monitoring/                   # Конфигурация мониторинга
├── main.py                       # Точка входа
├── requirements.txt              # Python зависимости
├── Dockerfile                    # Docker образ
├── docker-compose.yml            # Docker Compose
├── .drone.yml                    # CI/CD pipeline
└── Makefile                      # Команды сборки
├── 📋 main.py              # Основной файл бота с интерфейсом
├── 🔧 admin_panel.py       # Расширенная админ-панель
├── 🛠️ admin_utils.py       # Утилиты для админки
├── 🔧 config.py            # Настройки и конфигурация
├── 🗄️ database.py          # Подключение к базе данных
├── 📊 models.py            # Модели данных (User, Lottery, etc.)
├── ⚙️ services.py          # Бизнес-логика и API
├── 🛠️ utils.py             # Утилиты для управления
├── 📖 examples.py          # Примеры использования API
├── 🎪 demo_admin.py        # Демонстрация админ-панели
├── 🚀 start.sh             # Скрипт быстрого запуска
├── 📦 requirements.txt     # Зависимости Python
├── ⚙️ Makefile             # Автоматизация команд
├── 📝 .env.example         # Пример конфигурации
├── 🚫 .gitignore           # Игнорируемые файлы
├── 📚 README.md            # Полная документация
├── ⚡ QUICKSTART.md        # Быстрый старт
├── 🏗️ alembic.ini          # Конфигурация миграций
└── 📁 migrations/          # Файлы миграций БД
    ├── env.py              # Настройка миграций
    ├── script.py.mako      # Шаблон миграций
    └── versions/           # Версии миграций
        └── 001_initial_migration.py
```

## Установка и настройка

### 1. Клонирование и установка зависимостей

```bash
# Переход в папку проекта
cd /Users/trevor/Documents/bot

# Создание виртуального окружения
python -m venv venv

# Активация виртуального окружения
# На macOS/Linux:
source venv/bin/activate
# На Windows:
# venv\Scripts\activate

# Установка зависимостей
pip install -r requirements.txt
```

### 2. Настройка переменных окружения

```bash
# Копируйте файл примера
cp .env.example .env

# Отредактируйте .env файл
```

Заполните `.env` файл:

```env
# Получите токен у @BotFather в Telegram
BOT_TOKEN=your_bot_token_here

# Для SQLite (по умолчанию)
DATABASE_URL=sqlite+aiosqlite:///./lottery_bot.db

# Для PostgreSQL (раскомментируйте и настройте)
# DATABASE_URL=postgresql+asyncpg://username:password@localhost/lottery_bot_db

# ID администраторов (ваш Telegram ID)
ADMIN_IDS=123456789

# Уровень логирования
LOG_LEVEL=INFO
```

### 3. Инициализация миграций базы данных

```bash
# Инициализация Alembic
alembic init migrations

# Создание первой миграции
alembic revision --autogenerate -m "Initial migration"

# Применение миграций
alembic upgrade head
```

### 4. Запуск бота

```bash
python main.py
```

## Использование

### Для обычных пользователей:

1. **Запуск бота**: `/start`
2. **Просмотр розыгрышей**: Кнопка "🎲 Активные розыгрыши"
3. **Участие в розыгрыше**: Выбрать розыгрыш → "🎫 Участвовать"
4. **Мои участия**: Кнопка "📝 Мои участия"

### Для администраторов:

1. **🔧 Расширенная админ-панель**: Кнопка "🔧 Админ-панель"
   - 🎲 **Управление розыгрышами**: создание, редактирование, удаление
   - 👥 **Управление участниками**: добавление, удаление, массовые операции
   - 👑 **Управление победителями**: установка предопределенных победителей
   - 📊 **Статистика**: детальная аналитика по всем розыгрышам
   - ⚙️ **Настройки**: системная информация, экспорт, очистка

2. **Создание розыгрыша**: Пошаговый мастер с подтверждением
3. **Установка ручных победителей**: Выбор места и пользователя
4. **Проведение розыгрыша**: Автоматический учет ручных победителей
5. **Экспорт и отчеты**: Полная статистика и экспорт данных

### Ключевая особенность - ручная установка победителей:

1. Используйте "👑 Установить победителя"
2. Выберите розыгрыш
3. Укажите место (1, 2, 3, ...)
4. Введите Telegram ID пользователя
5. При проведении розыгрыша этот пользователь автоматически займет указанное место

## Модели данных

### User (Пользователи)
- `telegram_id` - Telegram ID пользователя
- `username`, `first_name`, `last_name` - Данные пользователя
- `is_admin` - Флаг администратора

### Lottery (Розыгрыши)
- `title` - Название
- `description` - Описание
- `prizes` - Список призов (JSON)
- `manual_winners` - Ручно установленные победители (JSON)
- `is_active`, `is_completed` - Статусы

### Participation (Участие)
- Связь пользователя с розыгрышем

### Winner (Победители)
- Результаты розыгрыша с указанием места и приза

## API методы сервисов

### UserService
- `get_or_create_user()` - Получить или создать пользователя
- `set_admin()` - Установить права администратора

### LotteryService
- `create_lottery()` - Создать розыгрыш
- `set_manual_winner()` - Установить ручного победителя
- `conduct_draw()` - Провести розыгрыш с учетом ручных победителей

### ParticipationService
- `get_participants_count()` - Количество участников

## Переключение базы данных

Благодаря SQLAlchemy ORM, легко переключаться между разными базами данных:

### SQLite (по умолчанию)
```env
DATABASE_URL=sqlite+aiosqlite:///./lottery_bot.db
```

### PostgreSQL
```env
DATABASE_URL=postgresql+asyncpg://username:password@localhost/database_name
```

### MySQL
```env
DATABASE_URL=mysql+aiomysql://username:password@localhost/database_name
```

## Миграции

```bash
# Создать новую миграцию после изменения моделей
alembic revision --autogenerate -m "Description of changes"

# Применить миграции
alembic upgrade head

# Откатить последнюю миграцию
alembic downgrade -1
```

## Логи

Бот ведет логи всех операций. Уровень логирования настраивается через переменную `LOG_LEVEL`.

## Безопасность

- Права администратора контролируются через `ADMIN_IDS` в `.env`
- Все операции с базой данных асинхронные
- Валидация входных данных на всех уровнях

## Развертывание

### Локальное развертывание
Следуйте инструкциям по установке выше.

### Docker (опционально)
```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
```

## Поддержка

Для получения помощи или сообщения об ошибках создайте issue в репозитории проекта.

## Лицензия

MIT License
Description
No description provided
Readme 1.4 MiB
Languages
Python 95.3%
Makefile 2.7%
Shell 1.5%
Dockerfile 0.4%