4.2 KiB
4.2 KiB
Исправления системы обнаружения счетов
Проблема
Бот не реагировал на команды /start и /admin, потому что обработчик detect_account_input перехватывал ВСЕ текстовые сообщения, включая команды.
Решение
1. Добавлена проверка команд в account_handlers.py
@account_router.message(F.text, StateFilter(None))
async def detect_account_input(message: Message, state: FSMContext):
"""
Обнаружение ввода счетов в сообщении
Активируется только для администраторов
"""
if not is_admin(message.from_user.id):
return
# Игнорируем команды (начинаются с /)
if message.text.startswith('/'):
return # ✅ НОВАЯ ПРОВЕРКА
# Парсим счета из сообщения
accounts = parse_accounts_from_message(message.text)
if not accounts:
return # Счета не обнаружены, пропускаем
2. Добавлен параметр limit в LotteryService.get_all_lotteries()
@staticmethod
async def get_all_lotteries(session: AsyncSession, limit: Optional[int] = None) -> List[Lottery]:
"""Получить список всех розыгрышей"""
query = select(Lottery).order_by(Lottery.created_at.desc())
if limit:
query = query.limit(limit) # ✅ ПОДДЕРЖКА ЛИМИТА
result = await session.execute(query)
return result.scalars().all()
Логика обработки сообщений
Теперь обработчик работает так:
Входящее сообщение
↓
Проверка: админ?
↓ НЕТ → игнорировать
↓ ДА
Проверка: команда (начинается с /)?
↓ ДА → пропустить дальше (к обработчикам команд)
↓ НЕТ
Парсинг счетов из текста
↓
Счета найдены?
↓ НЕТ → игнорировать
↓ ДА
Показать inline-меню с действиями
Что теперь работает
✅ Команды обрабатываются корректно:
/start→ приветствие/admin→ админ-панель/help→ справка
✅ Обнаружение счетов работает только для текста без /:
11-22-33-44-55-66-77-88→ обнаружен счетВот счета: 11-22-33-44-55-66-77-88→ обнаружен счет/start→ команда, не счет
✅ Проверка прав:
- Только администраторы видят меню действий со счетами
- Обычные пользователи получают обычные ответы
Порядок обработки обновлений
# В main.py
dp.include_router(account_router) # 1. Приоритет - счета (только если не команда)
dp.include_router(router) # 2. Команды пользователя (/start, /join, etc)
dp.include_router(admin_router) # 3. Админ-команды (/admin, etc)
Это гарантирует, что:
- Счета обнаруживаются первыми (но пропускают команды)
- Команды обрабатываются вторыми
- Админ-команды обрабатываются последними
Тестирование
Попробуйте отправить боту:
Команды (должны работать):
/start
/admin
/help
Счета (должны обнаружиться):
11-22-33-44-55-66-77-88
Текст со счетами:
Вот мои счета для розыгрыша:
11-22-33-44-55-66-77-88
22-33-44-55-66-77-88-99
Обычный текст (должен игнорироваться):
Привет, как дела?
Когда будет розыгрыш?
Все должно работать корректно!