| 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) | |