diff --git a/src/bot/handlers/commands/help.py b/src/bot/handlers/commands/help.py index 3dadc15..d3f4622 100644 --- a/src/bot/handlers/commands/help.py +++ b/src/bot/handlers/commands/help.py @@ -1,8 +1,8 @@ from aiogram.types import Message from bot.handlers import registry -from bot.services.database import check_telegram_user from bot.utils.types import ChatType +from database import TelegramUser @registry.register( @@ -10,12 +10,7 @@ from bot.utils.types import ChatType chat_types=ChatType.PRIVATE, description="Help Command Function Description", ) -async def cmd_help(message: Message, session) -> None: - if message.from_user is None: - return - - user = await check_telegram_user(session, message.from_user.id) - +async def cmd_help(message: Message, user: TelegramUser) -> None: await message.answer( "Help Command Function Answer Text. " f"Your locale is {user.lang}" diff --git a/src/bot/middlewares/__init__.py b/src/bot/middlewares/__init__.py index be444ef..7f2e3d8 100644 --- a/src/bot/middlewares/__init__.py +++ b/src/bot/middlewares/__init__.py @@ -5,12 +5,14 @@ from aiogram import Dispatcher from sqlalchemy.ext.asyncio import async_sessionmaker from .database import DatabaseSessionMiddleware +from .telegram_user import TelegramUserMiddleware def connect_middlewares( dispatcher: Dispatcher, session_maker: async_sessionmaker, ) -> None: - database_middleware = DatabaseSessionMiddleware(session_maker) - - dispatcher.update.middleware(database_middleware) + dispatcher.update.middleware( + DatabaseSessionMiddleware(session_maker), + ) + dispatcher.update.middleware(TelegramUserMiddleware()) diff --git a/src/bot/middlewares/telegram_user.py b/src/bot/middlewares/telegram_user.py new file mode 100644 index 0000000..09ebe89 --- /dev/null +++ b/src/bot/middlewares/telegram_user.py @@ -0,0 +1,33 @@ +from typing import Any, Awaitable, Callable, Dict, Optional + +from aiogram import BaseMiddleware +from aiogram.types import TelegramObject +from aiogram.types import User as AiogramUser + +from bot.services import check_telegram_user + + +class TelegramUserMiddleware(BaseMiddleware): + async def __call__( + self, + handler: Callable[ + [TelegramObject, Dict[str, Any]], Awaitable[Any] + ], + event: TelegramObject, + data: Dict[str, Any], + ) -> Any: + aiogram_user: Optional[AiogramUser] = data.get( + "event_from_user", + ) + + if aiogram_user is None or aiogram_user.is_bot: + return await handler(event, data) + + session = data["session"] + + telegram_user = await check_telegram_user( + session, aiogram_user.id + ) + + data["user"] = telegram_user + return await handler(event, data)