init
This commit is contained in:
0
middlewares/__init__.py
Normal file
0
middlewares/__init__.py
Normal file
50
middlewares/auth.py
Normal file
50
middlewares/auth.py
Normal 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 # Прерываем обработку, хендлеры бота не сработают
|
||||
13
middlewares/dao.py
Normal file
13
middlewares/dao.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from aiogram import BaseMiddleware
|
||||
from aiogram.types import TelegramObject
|
||||
|
||||
from repos.dao import DAO
|
||||
|
||||
|
||||
class DaoMiddleware(BaseMiddleware):
|
||||
def __init__(self, dao: DAO):
|
||||
self._dao = dao
|
||||
|
||||
async def __call__(self, handler, event: TelegramObject, data: dict):
|
||||
data["dao"] = self._dao
|
||||
return await handler(event, data)
|
||||
Reference in New Issue
Block a user