main functions fix
This commit is contained in:
126
COMMAND_FIX.md
Normal file
126
COMMAND_FIX.md
Normal file
@@ -0,0 +1,126 @@
|
||||
# Исправления системы обнаружения счетов
|
||||
|
||||
## Проблема
|
||||
Бот не реагировал на команды `/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
|
||||
```
|
||||
|
||||
### Обычный текст (должен игнорироваться):
|
||||
```
|
||||
Привет, как дела?
|
||||
Когда будет розыгрыш?
|
||||
```
|
||||
|
||||
Все должно работать корректно!
|
||||
Reference in New Issue
Block a user