73 lines
2.0 KiB
Python
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)
|