from typing import Callable, Dict, Any, Awaitable from aiogram import BaseMiddleware from aiogram.types import Message from repos.user_repo import UsersRepo, UserStatus from keyboards import get_request_kb class AuthMiddleware(BaseMiddleware): def __init__(self, repo: UsersRepo, admin_id: int): self.repo = repo self.admin_id = admin_id async def __call__( self, handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], event: Message, data: Dict[str, Any] ) -> Any: user = event.from_user # Админа пускаем всегда # if user.id == self.admin_id: # return await handler(event, data) # Получаем данные из БД db_user = await self.repo.get_user(user.id) status = db_user.get("status") if db_user else UserStatus.NONE # 1. Если доступ уже разрешен — пропускаем к боту if status == UserStatus.ALLOWED: return await handler(event, data) # 2. Если статус PENDING (ждет решения) if status == UserStatus.PENDING: await event.answer("⏳ Ваша заявка находится на рассмотрении администратора.") return # 3. Если нет в базе или ЗАПРЕЩЕН — проверяем тайминг 24 часа can_request = await self.repo.can_request_access(user.id) if can_request: await event.answer( "⛔️ У вас нет доступа к этому боту.\nВы можете отправить запрос администратору.", reply_markup=get_request_kb() ) else: # Если 24 часа еще не прошло await event.answer("⛔️ Доступ запрещен.\nПовторный запрос можно отправить через 24 часа.") return # Прерываем обработку, хендлеры бота не сработают