45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
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.01): # Уменьшено с 0.1 до 0.01
|
||
# 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)
|