feature/chat-system #2

Merged
trevor merged 28 commits from feature/chat-system into master 2025-11-17 06:05:49 +00:00
8 changed files with 582 additions and 33 deletions
Showing only changes of commit 0fdf01d1c7 - Show all commits

1
.bot.pid Normal file
View File

@@ -0,0 +1 @@
788605

148
ADMIN_PANEL_STRUCTURE.md Normal file
View 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
View 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
View 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
╚════════════════════════════════════════════════════════════════╝

View File

@@ -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)

View File

@@ -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)

View File

@@ -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,

View File

@@ -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