diff --git a/.bot.pid b/.bot.pid new file mode 100644 index 0000000..bd0f1c1 --- /dev/null +++ b/.bot.pid @@ -0,0 +1 @@ +788605 diff --git a/ADMIN_PANEL_STRUCTURE.md b/ADMIN_PANEL_STRUCTURE.md new file mode 100644 index 0000000..388c15b --- /dev/null +++ b/ADMIN_PANEL_STRUCTURE.md @@ -0,0 +1,148 @@ +# Структура Админ Панели + +## Главное меню бота + +### Для всех пользователей: +- **🎲 Активные розыгрыши** (`active_lotteries`) - Просмотр всех активных розыгрышей +- **📝 Зарегистрироваться** (`start_registration`) - Регистрация в системе (скрывается для зарегистрированных и админов) + +### Для администраторов: +- **⚙️ Админ панель** (`admin_panel`) - Вход в админ панель +- **➕ Создать розыгрыш** (`create_lottery`) - Быстрое создание розыгрыша + +--- + +## Админ панель (`admin_panel`) + +### Основные разделы: + +#### 1. 🎲 Управление розыгрышами (`admin_lotteries`) +Раздел для полного управления розыгрышами. + +**Доступные действия:** +- **➕ Создать розыгрыш** (`admin_create_lottery`) - Создание нового розыгрыша (пошаговый процесс) +- **📝 Редактировать розыгрыш** (`admin_edit_lottery`) - Редактирование существующих розыгрышей +- **🎭 Настройка отображения победителей** (`admin_winner_display_settings`) - Настройка способа отображения победителей (номер счета/имя) +- **📋 Список всех розыгрышей** (`admin_list_all_lotteries`) - Просмотр всех розыгрышей (активные и завершенные) +- **🏁 Завершить розыгрыш** (`admin_finish_lottery`) - Принудительное завершение розыгрыша +- **🗑️ Удалить розыгрыш** (`admin_delete_lottery`) - Удаление розыгрыша из системы + +**Состояния (FSM):** +- `lottery_title` - Ввод названия розыгрыша +- `lottery_description` - Ввод описания +- `lottery_prizes` - Ввод списка призов +- `lottery_confirm` - Подтверждение создания + +--- + +#### 2. 👥 Управление участниками (`admin_participants`) +Раздел для управления участниками розыгрышей. + +**Доступные действия:** +- **➕ Добавить участника** (`admin_add_participant`) - Добавление одного участника вручную +- **📥 Массовое добавление (ID)** (`admin_bulk_add_participant`) - Массовое добавление по Telegram ID +- **🏦 Массовое добавление (счета)** (`admin_bulk_add_accounts`) - Массовое добавление по номерам счетов +- **➖ Удалить участника** (`admin_remove_participant`) - Удаление одного участника +- **📤 Массовое удаление (ID)** (`admin_bulk_remove_participant`) - Массовое удаление по Telegram ID +- **🏦 Массовое удаление (счета)** (`admin_bulk_remove_accounts`) - Массовое удаление по номерам счетов +- **👥 Все участники** (`admin_list_all_participants`) - Список всех зарегистрированных участников +- **🔍 Поиск участников** (`admin_search_participants`) - Поиск участников по критериям +- **📊 Участники по розыгрышам** (`admin_participants_by_lottery`) - Просмотр участников конкретного розыгрыша +- **📈 Отчет по участникам** (`admin_participants_report`) - Детальный отчет об участии + +**Состояния (FSM):** +- `add_participant_lottery` - Выбор розыгрыша для добавления +- `add_participant_user` - Выбор пользователя +- `add_participant_bulk` - Массовый ввод ID +- `add_participant_bulk_accounts` - Массовый ввод счетов +- `remove_participant_lottery` - Выбор розыгрыша для удаления +- `remove_participant_user` - Выбор пользователя для удаления +- `participant_search` - Поиск участников + +--- + +#### 3. 👑 Управление победителями (`admin_winners`) +Раздел для управления победителями розыгрышей. + +**Доступные действия:** +- **👑 Установить победителя** (`admin_set_manual_winner`) - Ручная установка победителя (без розыгрыша) +- **📝 Изменить победителя** (`admin_edit_winner`) - Изменение данных победителя +- **❌ Удалить победителя** (`admin_remove_winner`) - Удаление победителя +- **📋 Список победителей** (`admin_list_winners`) - Просмотр всех победителей +- **🎲 Провести розыгрыш** (`admin_conduct_draw`) - Автоматическое проведение розыгрыша + +**Состояния (FSM):** +- `set_winner_lottery` - Выбор розыгрыша для установки победителя +- `set_winner_place` - Выбор места (1, 2, 3...) +- `set_winner_user` - Выбор пользователя-победителя + +--- + +#### 4. 📊 Статистика (`admin_stats`) +Раздел с общей статистикой системы. + +**Показывает:** +- Количество пользователей +- Количество зарегистрированных пользователей +- Общее количество розыгрышей +- Количество активных розыгрышей +- Количество завершенных розыгрышей +- Общее количество участий + +**Кнопки:** +- **🔄 Обновить** (`admin_stats`) - Обновление статистики +- **🔙 Назад** (`admin_panel`) - Возврат в главное меню админ панели + +--- + +#### 5. ⚙️ Настройки (`admin_settings`) +Раздел с настройками системы и утилитами. + +**Доступные действия:** +- Настройки отображения +- Управление базой данных +- Экспорт данных +- Системные настройки + +--- + +## Навигация + +### Кнопки возврата: +- **🔙 Назад** (`admin_panel`) - Возврат в главное меню админ панели +- **🔙 Назад** (`back_to_main`) - Возврат в главное меню бота + +### Кнопки отмены: +- **❌ Отмена** - Отмена текущей операции и возврат в предыдущее меню + +--- + +## Обработка callback'ов + +### Главный роутер (`main.py`): +- `admin_panel` - Открытие админ панели (через контроллер) +- `back_to_main` - Возврат в главное меню + +### Админ роутер (`admin_panel.py`): +- Все callback'и начинающиеся с `admin_*` +- Вся логика управления розыгрышами, участниками, победителями +- FSM состояния для многошаговых операций + +### Порядок подключения роутеров: +1. **router** (main) - команды `/start`, `/help`, основные callback'и +2. **admin_router** - все админские операции +3. **registration_router** - регистрация пользователей +4. **chat_router** (ПОСЛЕДНИЙ) - обработка всех необработанных сообщений + +--- + +## Проверка прав доступа + +Все админские handler'ы проверяют права доступа: +```python +if not is_admin(callback.from_user.id): + await callback.answer("❌ Недостаточно прав", show_alert=True) + return +``` + +ID администраторов хранятся в `src/core/config.py` в переменной `ADMIN_IDS`. diff --git a/ADMIN_PANEL_TESTING.md b/ADMIN_PANEL_TESTING.md new file mode 100644 index 0000000..4e62ffa --- /dev/null +++ b/ADMIN_PANEL_TESTING.md @@ -0,0 +1,331 @@ +# Тестирование Админ Панели + +## Контрольный список для проверки кнопок + +### ✅ Главное меню (для обычных пользователей) +- [ ] 🎲 Активные розыгрыши - показывает список активных розыгрышей +- [ ] 📝 Зарегистрироваться - открывает форму регистрации (только для незарегистрированных) +- [ ] Кнопка регистрации СКРЫТА для зарегистрированных пользователей +- [ ] Кнопка регистрации СКРЫТА для администраторов + +### ✅ Главное меню (для администраторов) +- [ ] 🎲 Активные розыгрыши - показывает список активных розыгрышей +- [ ] ⚙️ Админ панель - открывает админ панель +- [ ] ➕ Создать розыгрыш - быстрое создание розыгрыша + +--- + +## ✅ Админ панель - Главное меню + +### Проверка открытия админ панели: +- [ ] Показывается краткая статистика (пользователи, розыгрыши, участия) +- [ ] Все 6 кнопок отображаются корректно + +### Основные кнопки: +- [ ] 🎲 Управление розыгрышами (`admin_lotteries`) +- [ ] 👥 Управление участниками (`admin_participants`) +- [ ] 👑 Управление победителями (`admin_winners`) +- [ ] 📊 Статистика (`admin_stats`) +- [ ] ⚙️ Настройки (`admin_settings`) +- [ ] 🔙 Назад - возврат в главное меню бота + +--- + +## ✅ Раздел: Управление розыгрышами + +### Открытие раздела: +- [ ] Нажать "🎲 Управление розыгрышами" в админ панели +- [ ] Проверить отображение всех 7 кнопок + +### Кнопки раздела: +- [ ] ➕ Создать розыгрыш + - [ ] Запускается процесс создания (FSM) + - [ ] Шаг 1: Ввод названия + - [ ] Шаг 2: Ввод описания + - [ ] Шаг 3: Ввод призов (через запятую) + - [ ] Шаг 4: Подтверждение + - [ ] Розыгрыш создается в БД + - [ ] Кнопка "❌ Отмена" работает на каждом шаге + +- [ ] 📝 Редактировать розыгрыш + - [ ] Показывает список всех розыгрышей + - [ ] Выбор розыгрыша открывает меню редактирования + - [ ] Можно изменить название, описание, призы + - [ ] Изменения сохраняются в БД + +- [ ] 🎭 Настройка отображения победителей + - [ ] Показывает список розыгрышей + - [ ] Для каждого розыгрыша можно выбрать тип отображения: + - [ ] По номеру счета + - [ ] По имени пользователя + - [ ] Настройка сохраняется + +- [ ] 📋 Список всех розыгрышей + - [ ] Показывает все розыгрыши (активные и завершенные) + - [ ] Для каждого розыгрыша показывается: + - [ ] Название + - [ ] Статус (активный/завершенный) + - [ ] Количество участников + - [ ] Дата создания + +- [ ] 🏁 Завершить розыгрыш + - [ ] Показывает список активных розыгрышей + - [ ] Выбор розыгрыша завершает его + - [ ] Запрос подтверждения + - [ ] Статус меняется в БД + +- [ ] 🗑️ Удалить розыгрыш + - [ ] Показывает список всех розыгрышей + - [ ] Выбор розыгрыша запрашивает подтверждение + - [ ] Розыгрыш удаляется из БД + +- [ ] 🔙 Назад - возврат в главное меню админ панели + +--- + +## ✅ Раздел: Управление участниками + +### Открытие раздела: +- [ ] Нажать "👥 Управление участниками" в админ панели +- [ ] Проверить отображение всех 9 кнопок + +### Кнопки раздела: +- [ ] ➕ Добавить участника + - [ ] Выбор розыгрыша + - [ ] Выбор пользователя (по ID или имени) + - [ ] Участник добавляется в розыгрыш + - [ ] Проверка дубликатов + +- [ ] 📥 Массовое добавление (ID) + - [ ] Выбор розыгрыша + - [ ] Ввод списка Telegram ID (через запятую или построчно) + - [ ] Массовое добавление участников + - [ ] Отчет об успешных/неудачных добавлениях + +- [ ] 🏦 Массовое добавление (счета) + - [ ] Выбор розыгрыша + - [ ] Ввод списка номеров счетов + - [ ] Участники добавляются по номерам счетов + - [ ] Отчет об операции + +- [ ] ➖ Удалить участника + - [ ] Выбор розыгрыша + - [ ] Выбор участника + - [ ] Участник удаляется + - [ ] Подтверждение удаления + +- [ ] 📤 Массовое удаление (ID) + - [ ] Выбор розыгрыша + - [ ] Ввод списка ID для удаления + - [ ] Массовое удаление + - [ ] Отчет об операции + +- [ ] 🏦 Массовое удаление (счета) + - [ ] Выбор розыгрыша + - [ ] Ввод списка номеров счетов + - [ ] Удаление по счетам + - [ ] Отчет об операции + +- [ ] 👥 Все участники + - [ ] Показывает список всех зарегистрированных пользователей + - [ ] Пагинация (если много) + - [ ] Показывает ID, имя, статус регистрации + +- [ ] 🔍 Поиск участников + - [ ] Поиск по имени + - [ ] Поиск по Telegram ID + - [ ] Поиск по номеру счета + - [ ] Показывает результаты поиска + +- [ ] 📊 Участники по розыгрышам + - [ ] Выбор розыгрыша + - [ ] Показывает всех участников розыгрыша + - [ ] Количество участников + - [ ] Список с именами/ID/счетами + +- [ ] 📈 Отчет по участникам + - [ ] Детальная статистика по участиям + - [ ] Топ участников (по количеству участий) + - [ ] Распределение по розыгрышам + +- [ ] 🔙 Назад - возврат в главное меню админ панели + +--- + +## ✅ Раздел: Управление победителями + +### Открытие раздела: +- [ ] Нажать "👑 Управление победителями" в админ панели +- [ ] Проверить отображение всех 6 кнопок + +### Кнопки раздела: +- [ ] 👑 Установить победителя + - [ ] Выбор розыгрыша + - [ ] Выбор места (1, 2, 3...) + - [ ] Выбор пользователя вручную + - [ ] Победитель сохраняется в БД + +- [ ] 📝 Изменить победителя + - [ ] Показывает список розыгрышей с победителями + - [ ] Выбор победителя для изменения + - [ ] Возможность изменить место или пользователя + - [ ] Изменения сохраняются + +- [ ] ❌ Удалить победителя + - [ ] Показывает список победителей + - [ ] Выбор победителя + - [ ] Подтверждение удаления + - [ ] Победитель удаляется из БД + +- [ ] 📋 Список победителей + - [ ] Показывает всех победителей всех розыгрышей + - [ ] Группировка по розыгрышам + - [ ] Место, имя/счет, приз + +- [ ] 🎲 Провести розыгрыш + - [ ] Выбор розыгрыша + - [ ] Автоматическое определение победителей + - [ ] Случайный выбор из участников + - [ ] Сохранение результатов + - [ ] Уведомление победителей + +- [ ] 🔙 Назад - возврат в главное меню админ панели + +--- + +## ✅ Раздел: Статистика + +### Открытие раздела: +- [ ] Нажать "📊 Статистика" в админ панели +- [ ] Проверить отображение статистики + +### Показываемые данные: +- [ ] 👥 Всего пользователей: [число] +- [ ] ✅ Зарегистрированных: [число] +- [ ] 🎲 Всего розыгрышей: [число] +- [ ] 🟢 Активных: [число] +- [ ] ✅ Завершенных: [число] +- [ ] 🎫 Участий: [число] + +### Кнопки: +- [ ] 🔄 Обновить - обновляет статистику +- [ ] 🔙 Назад - возврат в админ панель + +--- + +## ✅ Раздел: Настройки + +### Открытие раздела: +- [ ] Нажать "⚙️ Настройки" в админ панели +- [ ] Проверить доступность настроек + +### Возможности (зависит от реализации): +- [ ] Настройки уведомлений +- [ ] Экспорт данных +- [ ] Очистка старых данных +- [ ] Управление администраторами +- [ ] Системные настройки + +- [ ] 🔙 Назад - возврат в админ панель + +--- + +## ✅ Проверка прав доступа + +### Для обычных пользователей: +- [ ] Кнопка "Админ панель" НЕ показывается +- [ ] Попытка прямого вызова admin callback'ов возвращает "❌ Недостаточно прав" + +### Для администраторов: +- [ ] Все разделы доступны +- [ ] Все операции выполняются +- [ ] Статистика отображается корректно + +--- + +## ✅ Проверка навигации + +### Возврат назад: +- [ ] Из каждого подраздела можно вернуться в админ панель +- [ ] Из админ панели можно вернуться в главное меню +- [ ] Кнопки отмены работают во всех FSM состояниях + +### Breadcrumbs (последовательность): +1. Главное меню бота +2. → Админ панель +3. → → Конкретный раздел (розыгрыши/участники/победители) +4. → → → Подменю раздела (если есть) + +--- + +## 🐛 Известные проблемы и их решения + +### Проблема: Кнопка не реагирует +**Решение:** +1. Проверить логи бота: `tail -f /tmp/bot_single.log` +2. Убедиться, что callback_data зарегистрирован в роутере +3. Проверить порядок подключения роутеров + +### Проблема: FSM не сохраняет состояние +**Решение:** +1. Убедиться, что storage настроен (MemoryStorage) +2. Проверить вызов `state.set_state()` +3. Проверить StateFilter в handler'ах + +### Проблема: "Недостаточно прав" для админа +**Решение:** +1. Проверить, что ID админа в `ADMIN_IDS` (config.py) +2. Проверить формат ID (должен быть int) + +--- + +## 📝 Инструкция по тестированию + +### Шаг 1: Подготовка +1. Запустить бота: `make bot-start` +2. Открыть чат с ботом в Telegram +3. Убедиться, что у вас админские права + +### Шаг 2: Тестирование главного меню +1. Отправить `/start` +2. Проверить все кнопки главного меню +3. Проверить кнопку "Админ панель" + +### Шаг 3: Тестирование админ панели +1. Открыть админ панель +2. Последовательно зайти в каждый раздел +3. Проверить все кнопки в каждом разделе +4. Отметить работающие кнопки в чеклисте + +### Шаг 4: Тестирование FSM процессов +1. Создать новый розыгрыш (полный цикл) +2. Добавить участников (разными способами) +3. Провести розыгрыш +4. Проверить результаты + +### Шаг 5: Проверка навигации +1. Из каждого меню вернуться назад +2. Проверить корректность возврата +3. Убедиться, что нет "мертвых" кнопок + +### Шаг 6: Логи +1. Во время тестирования следить за логами +2. Фиксировать все ошибки +3. Проверять успешное выполнение операций + +--- + +## ✅ Результат тестирования + +**Дата:** [Указать дату] +**Тестировщик:** [Указать имя] +**Версия бота:** [Указать commit hash] + +### Статистика: +- Всего проверено кнопок: ____ / ____ +- Работает корректно: ____ +- Требует исправления: ____ +- Критические ошибки: ____ + +### Замечания: +[Описать найденные проблемы и рекомендации] diff --git a/QUICK_START.txt b/QUICK_START.txt new file mode 100644 index 0000000..4cb628f --- /dev/null +++ b/QUICK_START.txt @@ -0,0 +1,46 @@ +╔════════════════════════════════════════════════════════════════╗ +║ 🤖 УПРАВЛЕНИЕ БОТОМ - ШПАРГАЛКА ║ +╚════════════════════════════════════════════════════════════════╝ + +⚡ БЫСТРЫЕ КОМАНДЫ: + + make bot-start → Запустить бота + make bot-stop → Остановить бота + make bot-restart → Перезапустить бота + make bot-status → Проверить состояние + make bot-logs → Смотреть логи (Ctrl+C для выхода) + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +⚠️ ПРОБЛЕМА: Бот не реагирует на команды? + + ПРИЧИНА: Запущено несколько экземпляров бота одновременно + + РЕШЕНИЕ: + 1. make bot-restart (перезапустит правильно) + 2. make bot-status (проверит что запущен только один) + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +🔍 ДИАГНОСТИКА: + + Проверить процессы: + ps aux | grep "python main.py" | grep -v grep + + (Должна быть ОДНА строка!) + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +📁 ФАЙЛЫ: + + Логи: /tmp/bot_single.log + PID: .bot.pid + Скрипт: ./bot_control.sh + Документ: BOT_MANAGEMENT.md + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +❌ НИКОГДА НЕ ИСПОЛЬЗУЙ: make run (для продакшена) +✅ ВСЕГДА ИСПОЛЬЗУЙ: make bot-start + +╚════════════════════════════════════════════════════════════════╝ diff --git a/main.py b/main.py index 6c363f7..89048b4 100644 --- a/main.py +++ b/main.py @@ -92,7 +92,7 @@ async def admin_panel_handler(callback: CallbackQuery): @router.callback_query(F.data == "lottery_management") async def lottery_management_handler(callback: CallbackQuery): - """Обработчик управления розыгрышами""" + """Обработчик управления розыгрышами (старый callback)""" async with get_controller() as controller: await controller.handle_lottery_management(callback) diff --git a/src/components/ui.py b/src/components/ui.py index 6a69182..e237706 100644 --- a/src/components/ui.py +++ b/src/components/ui.py @@ -8,14 +8,16 @@ from src.core.models import Lottery, Winner class KeyboardBuilderImpl(IKeyboardBuilder): """Реализация построителя клавиатур""" - def get_main_keyboard(self, is_admin: bool = False): + def get_main_keyboard(self, is_admin: bool = False, is_registered: bool = False): """Получить главную клавиатуру""" buttons = [ - [InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="active_lotteries")], - [InlineKeyboardButton(text="📝 Зарегистрироваться", callback_data="start_registration")], - [InlineKeyboardButton(text="🧪 ТЕСТ КОЛБЭК", callback_data="test_callback")] + [InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="active_lotteries")] ] + # Показываем кнопку регистрации только незарегистрированным пользователям (не админам) + if not is_admin and not is_registered: + buttons.append([InlineKeyboardButton(text="📝 Зарегистрироваться", callback_data="start_registration")]) + if is_admin: buttons.extend([ [InlineKeyboardButton(text="⚙️ Админ панель", callback_data="admin_panel")], @@ -27,18 +29,11 @@ class KeyboardBuilderImpl(IKeyboardBuilder): def get_admin_keyboard(self): """Получить админскую клавиатуру""" buttons = [ - [ - InlineKeyboardButton(text="👥 Пользователи", callback_data="user_management"), - InlineKeyboardButton(text="💳 Счета", callback_data="account_management") - ], - [ - InlineKeyboardButton(text="🎯 Розыгрыши", callback_data="lottery_management"), - InlineKeyboardButton(text="💬 Чат", callback_data="chat_management") - ], - [ - InlineKeyboardButton(text="📊 Статистика", callback_data="stats"), - InlineKeyboardButton(text="⚙️ Настройки", callback_data="settings") - ], + [InlineKeyboardButton(text="🎲 Управление розыгрышами", callback_data="admin_lotteries")], + [InlineKeyboardButton(text="� Управление участниками", callback_data="admin_participants")], + [InlineKeyboardButton(text="👑 Управление победителями", callback_data="admin_winners")], + [InlineKeyboardButton(text="📊 Статистика", callback_data="admin_stats")], + [InlineKeyboardButton(text="⚙️ Настройки", callback_data="admin_settings")], [InlineKeyboardButton(text="🔙 Назад", callback_data="back_to_main")] ] return InlineKeyboardMarkup(inline_keyboard=buttons) @@ -46,18 +41,12 @@ class KeyboardBuilderImpl(IKeyboardBuilder): def get_lottery_management_keyboard(self): """Получить клавиатуру управления розыгрышами""" buttons = [ - [ - InlineKeyboardButton(text="📋 Все розыгрыши", callback_data="all_lotteries"), - InlineKeyboardButton(text="🎲 Активные", callback_data="active_lotteries_admin") - ], - [ - InlineKeyboardButton(text="✅ Завершенные", callback_data="completed_lotteries"), - InlineKeyboardButton(text="➕ Создать", callback_data="create_lottery") - ], - [ - InlineKeyboardButton(text="🎯 Провести розыгрыш", callback_data="conduct_lottery_admin"), - InlineKeyboardButton(text="🔄 Переросыгрыш", callback_data="admin_redraw") - ], + [InlineKeyboardButton(text="➕ Создать розыгрыш", callback_data="admin_create_lottery")], + [InlineKeyboardButton(text="📝 Редактировать розыгрыш", callback_data="admin_edit_lottery")], + [InlineKeyboardButton(text="🎭 Настройка отображения победителей", callback_data="admin_winner_display_settings")], + [InlineKeyboardButton(text="📋 Список всех розыгрышей", callback_data="admin_list_all_lotteries")], + [InlineKeyboardButton(text="� Завершить розыгрыш", callback_data="admin_finish_lottery")], + [InlineKeyboardButton(text="�️ Удалить розыгрыш", callback_data="admin_delete_lottery")], [InlineKeyboardButton(text="🔙 Назад", callback_data="admin_panel")] ] return InlineKeyboardMarkup(inline_keyboard=buttons) diff --git a/src/controllers/bot_controller.py b/src/controllers/bot_controller.py index 4cbafde..4bc6259 100644 --- a/src/controllers/bot_controller.py +++ b/src/controllers/bot_controller.py @@ -49,7 +49,10 @@ class BotController(IBotController): else: welcome_text += "📝 Для участия в розыгрышах необходимо зарегистрироваться." - keyboard = self.keyboard_builder.get_main_keyboard(self.is_admin(message.from_user.id)) + keyboard = self.keyboard_builder.get_main_keyboard( + is_admin=self.is_admin(message.from_user.id), + is_registered=user.is_registered + ) await message.answer( welcome_text, @@ -119,7 +122,7 @@ class BotController(IBotController): async def handle_active_lotteries(self, callback: CallbackQuery): """Показать активные розыгрыши""" - lotteries = await self.lottery_service.get_active_lotteries() + lotteries = await self.lottery_repo.get_active() if not lotteries: await callback.answer("❌ Нет активных розыгрышей", show_alert=True) @@ -132,7 +135,18 @@ class BotController(IBotController): lottery_info = self.message_formatter.format_lottery_info(lottery, participants_count) text += lottery_info + "\n" + "="*30 + "\n\n" - keyboard = self.keyboard_builder.get_main_keyboard(self.is_admin(callback.from_user.id)) + # Получаем информацию о регистрации пользователя + user = await self.user_service.get_or_create_user( + telegram_id=callback.from_user.id, + username=callback.from_user.username, + first_name=callback.from_user.first_name, + last_name=callback.from_user.last_name + ) + + keyboard = self.keyboard_builder.get_main_keyboard( + is_admin=self.is_admin(callback.from_user.id), + is_registered=user.is_registered + ) await callback.message.edit_text( text, diff --git a/src/interfaces/base.py b/src/interfaces/base.py index cc5ebb4..49ff5c1 100644 --- a/src/interfaces/base.py +++ b/src/interfaces/base.py @@ -134,6 +134,26 @@ class IBotController(ABC): async def handle_admin_panel(self, callback): """Обработать admin panel""" pass + + @abstractmethod + async def handle_lottery_management(self, callback): + """Обработать управление розыгрышами""" + pass + + @abstractmethod + async def handle_conduct_lottery_admin(self, callback): + """Обработать выбор розыгрыша для проведения""" + pass + + @abstractmethod + async def handle_active_lotteries(self, callback): + """Обработать показ активных розыгрышей""" + pass + + @abstractmethod + async def handle_conduct_lottery(self, callback): + """Обработать проведение конкретного розыгрыша""" + pass class IMessageFormatter(ABC): @@ -154,7 +174,7 @@ class IKeyboardBuilder(ABC): """Интерфейс создания клавиатур""" @abstractmethod - def get_main_keyboard(self, is_admin: bool): + def get_main_keyboard(self, is_admin: bool, is_registered: bool = False): """Получить главную клавиатуру""" pass