Добавлен функционал для работы с медиагруппами и улучшена обработка сообщений
- Реализованы методы для добавления связи между постами и сообщениями в `PostRepository` и `AsyncBotDB`. - Обновлены обработчики публикации постов для корректной работы с медиагруппами, включая удаление и уведомление авторов. - Улучшена логика обработки сообщений в `AlbumMiddleware` для более эффективного сбора медиагрупп. - Обновлены тесты для проверки нового функционала и обработки ошибок.
This commit is contained in:
@@ -11,7 +11,7 @@ class AlbumMiddleware(BaseMiddleware):
|
||||
Собирает все сообщения одной медиа группы и передает их как album в data.
|
||||
"""
|
||||
|
||||
def __init__(self, latency: Union[int, float] = 0.01):
|
||||
def __init__(self, latency: Union[int, float] = 5.0):
|
||||
"""
|
||||
Инициализация middleware.
|
||||
|
||||
@@ -45,38 +45,43 @@ class AlbumMiddleware(BaseMiddleware):
|
||||
"""
|
||||
Основная логика middleware.
|
||||
|
||||
Собирает все сообщения медиагруппы и обрабатывает только последнее сообщение
|
||||
после завершения сбора всех сообщений.
|
||||
|
||||
Args:
|
||||
handler: Обработчик события
|
||||
event: Событие (сообщение)
|
||||
data: Данные для передачи в обработчик
|
||||
|
||||
|
||||
Returns:
|
||||
Результат выполнения обработчика
|
||||
"""
|
||||
# Если у события нет media_group_id, передаем его обработчику сразу
|
||||
if not event.media_group_id:
|
||||
return await handler(event, data)
|
||||
|
||||
# Собираем сообщения одной медиа группы
|
||||
total_before = self.collect_album_messages(event)
|
||||
media_group_id = event.media_group_id
|
||||
message_id = event.message_id
|
||||
|
||||
if media_group_id not in self.album_data:
|
||||
self.album_data[media_group_id] = {"messages": []}
|
||||
|
||||
self.album_data[media_group_id]["messages"].append(event)
|
||||
count_before = len(self.album_data[media_group_id]["messages"])
|
||||
|
||||
# Ждем указанный период для сбора всех сообщений
|
||||
await asyncio.sleep(self.latency)
|
||||
|
||||
# Проверяем количество сообщений после задержки
|
||||
total_after = len(self.album_data[event.media_group_id]["messages"])
|
||||
|
||||
# Если за время задержки добавились новые сообщения, выходим
|
||||
if total_before != total_after:
|
||||
count_after = len(self.album_data[media_group_id]["messages"])
|
||||
if count_before != count_after:
|
||||
return
|
||||
|
||||
# Сортируем сообщения по message_id и добавляем в data
|
||||
album_messages = self.album_data[event.media_group_id]["messages"]
|
||||
album_messages = self.album_data[media_group_id]["messages"]
|
||||
album_messages.sort(key=lambda x: x.message_id)
|
||||
last_message_id = album_messages[-1].message_id
|
||||
|
||||
if message_id != last_message_id:
|
||||
return
|
||||
|
||||
data["album"] = album_messages
|
||||
del self.album_data[media_group_id]
|
||||
|
||||
# Удаляем медиа группу из отслеживания для освобождения памяти
|
||||
del self.album_data[event.media_group_id]
|
||||
|
||||
# Вызываем оригинальный обработчик события
|
||||
return await handler(event, data)
|
||||
|
||||
Reference in New Issue
Block a user