127 lines
4.2 KiB
Markdown
127 lines
4.2 KiB
Markdown
# Исправления системы обнаружения счетов
|
||
|
||
## Проблема
|
||
Бот не реагировал на команды `/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
|
||
```
|
||
|
||
### Обычный текст (должен игнорироваться):
|
||
```
|
||
Привет, как дела?
|
||
Когда будет розыгрыш?
|
||
```
|
||
|
||
Все должно работать корректно!
|