| from __future__ import annotations |
| from typing import TYPE_CHECKING, Any, Callable |
|
|
| from aiogram import BaseMiddleware |
| from loguru import logger |
|
|
| if TYPE_CHECKING: |
| from collections.abc import Awaitable |
|
|
| from aiogram.types import CallbackQuery, ChatMemberUpdated, InlineQuery, Message, PreCheckoutQuery, TelegramObject |
|
|
|
|
| class LoggingMiddleware(BaseMiddleware): |
| def __init__(self) -> None: |
| self.logger = logger |
| super().__init__() |
|
|
| def process_message(self, message: Message) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = {"chat_type": message.chat.type} |
|
|
| if message.from_user: |
| print_attrs["user_id"] = message.from_user.id |
| if message.text: |
| print_attrs["text"] = message.text |
| if message.video: |
| print_attrs["caption"] = message.caption |
| print_attrs["caption_entities"] = message.caption_entities |
| print_attrs["video_id"] = message.video.file_id |
| print_attrs["video_unique_id"] = message.video.file_unique_id |
| if message.audio: |
| print_attrs["duration"] = message.audio.duration |
| print_attrs["file_size"] = message.audio.file_size |
| if message.photo: |
| print_attrs["caption"] = message.caption |
| print_attrs["caption_entities"] = message.caption_entities |
| print_attrs["photo_id"] = message.photo[-1].file_id |
| print_attrs["photo_unique_id"] = message.photo[-1].file_unique_id |
|
|
| return print_attrs |
|
|
| def process_callback_query(self, callback_query: CallbackQuery) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = { |
| "query_id": callback_query.id, |
| "data": callback_query.data, |
| "user_id": callback_query.from_user.id, |
| "inline_message_id": callback_query.inline_message_id, |
| } |
|
|
| if callback_query.message: |
| print_attrs["message_id"] = callback_query.message.message_id |
| print_attrs["chat_type"] = callback_query.message.chat.type |
| print_attrs["chat_id"] = callback_query.message.chat.id |
|
|
| return print_attrs |
|
|
| def process_inline_query(self, inline_query: InlineQuery) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = { |
| "query_id": inline_query.id, |
| "user_id": inline_query.from_user.id, |
| "query": inline_query.query, |
| "offset": inline_query.offset, |
| "chat_type": inline_query.chat_type, |
| "location": inline_query.location, |
| } |
|
|
| return print_attrs |
|
|
| def process_pre_checkout_query(self, pre_checkout_query: PreCheckoutQuery) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = { |
| "query_id": pre_checkout_query.id, |
| "user_id": pre_checkout_query.from_user.id, |
| "currency": pre_checkout_query.currency, |
| "amount": pre_checkout_query.total_amount, |
| "payload": pre_checkout_query.invoice_payload, |
| "option": pre_checkout_query.shipping_option_id, |
| } |
|
|
| return print_attrs |
|
|
| def process_my_chat_member(self, my_chat_member: ChatMemberUpdated) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = { |
| "user_id": my_chat_member.from_user.id, |
| "chat_id": my_chat_member.chat.id, |
| } |
|
|
| return print_attrs |
|
|
| def process_chat_member(self, chat_member: ChatMemberUpdated) -> dict[str, Any]: |
| print_attrs: dict[str, Any] = { |
| "user_id": chat_member.from_user.id, |
| "chat_id": chat_member.chat.id, |
| "old_state": chat_member.old_chat_member, |
| "new_state": chat_member.new_chat_member, |
| } |
|
|
| return print_attrs |
|
|
| async def __call__( |
| self, |
| handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]], |
| event: TelegramObject, |
| data: dict[str, Any], |
| ) -> Any: |
| print_attrs: dict[str, Any] = {} |
| message: Message | None = getattr(event, "message", None) |
| callback_query: CallbackQuery | None = getattr(event, "callback_query", None) |
| inline_query: InlineQuery | None = getattr(event, "inline_query", None) |
| pre_checkout_query: PreCheckoutQuery | None = getattr(event, "pre_checkout_query", None) |
| my_chat_member: ChatMemberUpdated | None = getattr(event, "my_chat_member", None) |
| chat_member: ChatMemberUpdated | None = getattr(event, "chat_member", None) |
|
|
| if message: |
| print_attrs = self.process_message(message) |
|
|
| logger_msg = ( |
| "received message | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
| elif callback_query: |
| print_attrs = self.process_callback_query(callback_query) |
|
|
| logger_msg = ( |
| "received callback query | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
| elif inline_query: |
| print_attrs = self.process_inline_query(inline_query) |
|
|
| logger_msg = ( |
| "received inline query | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
| elif pre_checkout_query: |
| print_attrs = self.process_pre_checkout_query(pre_checkout_query) |
|
|
| logger_msg = ( |
| "received pre-checkout query | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
| elif my_chat_member: |
| print_attrs = self.process_my_chat_member(my_chat_member) |
|
|
| logger_msg = ( |
| "received my chat member update | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
| elif chat_member: |
| print_attrs = self.process_chat_member(chat_member) |
|
|
| logger_msg = ( |
| "received chat member update | " |
| + " | ".join(f"{key}: {value}" for key, value in print_attrs.items() if value is not None), |
| ) |
| self.logger.info(*logger_msg) |
|
|
| return await handler(event, data) |
|
|