This commit is contained in:
xds
2026-02-02 16:15:17 +03:00
commit e6aad48e72
21 changed files with 631 additions and 0 deletions

50
middlewares/auth.py Normal file
View File

@@ -0,0 +1,50 @@
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 # Прерываем обработку, хендлеры бота не сработают