50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
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 # Прерываем обработку, хендлеры бота не сработают |