feature/chat-system #2
148
ADMIN_PANEL_STRUCTURE.md
Normal file
148
ADMIN_PANEL_STRUCTURE.md
Normal file
@@ -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`.
|
||||
331
ADMIN_PANEL_TESTING.md
Normal file
331
ADMIN_PANEL_TESTING.md
Normal file
@@ -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]
|
||||
|
||||
### Статистика:
|
||||
- Всего проверено кнопок: ____ / ____
|
||||
- Работает корректно: ____
|
||||
- Требует исправления: ____
|
||||
- Критические ошибки: ____
|
||||
|
||||
### Замечания:
|
||||
[Описать найденные проблемы и рекомендации]
|
||||
46
QUICK_START.txt
Normal file
46
QUICK_START.txt
Normal file
@@ -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
|
||||
|
||||
╚════════════════════════════════════════════════════════════════╝
|
||||
2
main.py
2
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)
|
||||
|
||||
|
||||
@@ -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="<EFBFBD> Управление участниками", 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="<EFBFBD> Завершить розыгрыш", callback_data="admin_finish_lottery")],
|
||||
[InlineKeyboardButton(text="<EFBFBD>️ Удалить розыгрыш", callback_data="admin_delete_lottery")],
|
||||
[InlineKeyboardButton(text="🔙 Назад", callback_data="admin_panel")]
|
||||
]
|
||||
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user