Files
new_lottery_bot/docs/COMMAND_FIX.md
2025-11-16 12:36:02 +09:00

4.3 KiB
Raw Blame History

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

## Проблема
Бот не реагировал на команды `/start` и `/admin`, потому что обработчик `detect_account_input` перехватывал ВСЕ текстовые сообщения, включая команды.

## Решение

### 1. Добавлена проверка команд в `account_handlers.py`

```python
@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()`

```python
@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` → команда, не счет

✅ **Проверка прав:**
- Только администраторы видят меню действий со счетами
- Обычные пользователи получают обычные ответы

## Порядок обработки обновлений

```python
# В 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
```

### Обычный текст (должен игнорироваться):
```
Привет, как дела?
Когда будет розыгрыш?
```

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