Files
Solo_bot/middlewares/admin.py
T
2025-07-11 19:27:36 +03:00

57 lines
2.0 KiB
Python

from collections.abc import Awaitable, Callable
from typing import Any
from aiogram import BaseMiddleware
from aiogram.types import CallbackQuery, Message, TelegramObject
from sqlalchemy import select
from config import ADMIN_ID
from database.models import Admin
class AdminMiddleware(BaseMiddleware):
"""Middleware для проверки прав администратора.
Добавляет в data['admin'] = True/False в зависимости от того,
является ли пользователь администратором.
"""
_admin_ids: set[int] = (
set(ADMIN_ID) if isinstance(ADMIN_ID, list | tuple) else {ADMIN_ID}
)
async def __call__(
self,
handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: dict[str, Any],
) -> Any:
"""Обрабатывает событие и добавляет флаг администратора в data."""
data["admin"] = await self._check_admin_access(event, data.get("session"))
return await handler(event, data)
async def _check_admin_access(self, event: TelegramObject, session) -> bool:
"""Проверяет, имеет ли пользователь права администратора."""
try:
user_id = None
if isinstance(event, Message):
user_id = event.from_user.id if event.from_user else None
elif isinstance(event, CallbackQuery):
user_id = event.from_user.id if event.from_user else None
else:
user_id = getattr(getattr(event, "from_user", None), "id", None)
if not user_id:
return False
if user_id in self._admin_ids:
return True
if session:
result = await session.execute(select(Admin).where(Admin.tg_id == user_id))
return result.scalar_one_or_none() is not None
return False
except Exception:
return False