Files
new_lottery_bot/COMMAND_FIX.md
2025-11-15 20:03:49 +09:00

4.2 KiB
Raw Blame History

Исправления системы обнаружения счетов

Проблема

Бот не реагировал на команды /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)

Это гарантирует, что:

  1. Счета обнаруживаются первыми (но пропускают команды)
  2. Команды обрабатываются вторыми
  3. Админ-команды обрабатываются последними

Тестирование

Попробуйте отправить боту:

Команды (должны работать):

/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

Обычный текст (должен игнорироваться):

Привет, как дела?
Когда будет розыгрыш?

Все должно работать корректно!