from __future__ import annotations from typing import TYPE_CHECKING, Any from aiogram import BaseMiddleware from aiogram.types import Message from loguru import logger from bot.services.users import add_user, user_exists from bot.utils.command import find_command_argument if TYPE_CHECKING: from collections.abc import Awaitable, Callable from aiogram.types import TelegramObject from sqlalchemy.ext.asyncio import AsyncSession class AuthMiddleware(BaseMiddleware): async def __call__( self, handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: dict[str, Any], ) -> Any: if not isinstance(event, Message): return await handler(event, data) session: AsyncSession = data["session"] message: Message = event user = message.from_user if not user: return await handler(event, data) if await user_exists(session, user.id): return await handler(event, data) referrer = find_command_argument(message.text) logger.info(f"new user registration | user_id: {user.id} | message: {message.text}") await add_user(session=session, user=user, referrer=referrer) return await handler(event, data)