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