import asyncio from collections import defaultdict from typing import Any, Dict, Union from aiogram import BaseMiddleware from aiogram.types import Message class BulkTextMiddleware(BaseMiddleware): def __init__(self, latency: Union[int, float] = 0.1): # Initialize latency and album_data dictionary self.latency = latency self.texts = defaultdict(list) async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any: """ Main middleware logic. """ # # If the event has no media_group_id, pass it to the handler immediately key = (event.chat.id, event.from_user.id) if not event.text: return await handler(event, data) self.texts[key].append(event) total_before = len(self.texts[key]) # # Wait for a specified latency period await asyncio.sleep(self.latency) # # # Check the total number of messages after the latency total_after = len(self.texts[key]) # # # If new messages were added during the latency, exit if total_before != total_after: return # # # Sort the album messages by message_id and add to data msg_texts = self.texts[key] msg_texts.sort(key=lambda x: x.message_id) data["texts"] = ''.join([msg.text for msg in msg_texts]) # # Remove the media group from tracking to free up memory del self.texts[key] # # Call the original event handler return await handler(event, data)