reminder-bot/bot/core/middlewares.py

73 lines
2.0 KiB
Python

"""Middlewares for bot."""
from typing import Callable, Dict, Any, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject
from sqlalchemy.ext.asyncio import AsyncSession
from bot.db.base import get_session
from bot.logging_config import get_logger
logger = get_logger(__name__)
class DatabaseSessionMiddleware(BaseMiddleware):
"""Middleware to provide database session to handlers."""
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any],
) -> Any:
"""
Inject database session into handler data.
Args:
handler: Handler function
event: Telegram event
data: Handler data
Returns:
Handler result
"""
async for session in get_session():
data["session"] = session
return await handler(event, data)
class LoggingMiddleware(BaseMiddleware):
"""Middleware for logging incoming updates."""
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any],
) -> Any:
"""
Log incoming updates.
Args:
handler: Handler function
event: Telegram event
data: Handler data
Returns:
Handler result
"""
# Log update
from aiogram.types import Message, CallbackQuery
if isinstance(event, Message):
user_id = event.from_user.id if event.from_user else "unknown"
text = event.text or "[non-text message]"
logger.debug(f"Message from {user_id}: {text[:50]}")
elif isinstance(event, CallbackQuery):
user_id = event.from_user.id if event.from_user else "unknown"
data_str = event.data or "[no data]"
logger.debug(f"Callback from {user_id}: {data_str}")
return await handler(event, data)