Enhance admin handlers with improved logging and error handling

- Added detailed logging for user ban processing in `process_ban_target` and `process_ban_reason` functions, including user data and error messages.
- Improved error handling for user input validation and database interactions.
- Updated `return_to_admin_menu` function to log user return actions.
- Enhanced media group handling in `PostPublishService` with better error logging and author ID retrieval.
- Added new button options in voice handlers and updated keyboard layouts for improved user interaction.
- Refactored album middleware to better handle media group messages and added documentation for clarity.
This commit is contained in:
2025-09-02 22:20:34 +03:00
parent 1c6a37bc12
commit 1ab427a7ba
12 changed files with 340 additions and 232 deletions

View File

@@ -1,61 +1,82 @@
import asyncio
from typing import Any, Dict, Union
from typing import Any, Dict, Union, List
from aiogram import BaseMiddleware
from aiogram.types import Message
class AlbumMiddleware(BaseMiddleware):
def __init__(self, latency: Union[int, float] = 0.01): # Уменьшено с 0.1 до 0.01
# Initialize latency and album_data dictionary
"""
Middleware для обработки медиа групп в Telegram.
Собирает все сообщения одной медиа группы и передает их как album в data.
"""
def __init__(self, latency: Union[int, float] = 0.01):
"""
Инициализация middleware.
Args:
latency: Задержка в секундах для сбора всех сообщений медиа группы
"""
super().__init__()
self.latency = latency
self.album_data = {}
self.album_data: Dict[str, Dict[str, List[Message]]] = {}
#
def collect_album_messages(self, event: Message):
def collect_album_messages(self, event: Message) -> int:
"""
Collect messages of the same media group.
Собирает сообщения одной медиа группы.
Args:
event: Сообщение для обработки
Returns:
Количество сообщений в текущей медиа группе
"""
# # Check if media_group_id exists in album_data
if not event.media_group_id:
return 0
if event.media_group_id not in self.album_data:
# # Create a new entry for the media group
self.album_data[event.media_group_id] = {"messages": []}
#
# # Append the new message to the media group
self.album_data[event.media_group_id]["messages"].append(event)
#
# # Return the total number of messages in the current media group
return len(self.album_data[event.media_group_id]["messages"])
#
async def __call__(self, handler, event: Message, data: Dict[str, Any]) -> Any:
"""
Main middleware logic.
Основная логика middleware.
Args:
handler: Обработчик события
event: Событие (сообщение)
data: Данные для передачи в обработчик
Returns:
Результат выполнения обработчика
"""
# # If the event has no media_group_id, pass it to the handler immediately
# Если у события нет media_group_id, передаем его обработчику сразу
if not event.media_group_id:
return await handler(event, data)
#
# # Collect messages of the same media group
# Собираем сообщения одной медиа группы
total_before = self.collect_album_messages(event)
#
# # Wait for a specified latency period
# Ждем указанный период для сбора всех сообщений
await asyncio.sleep(self.latency)
#
# # Check the total number of messages after the latency
# Проверяем количество сообщений после задержки
total_after = len(self.album_data[event.media_group_id]["messages"])
#
# # 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
# Сортируем сообщения по message_id и добавляем в data
album_messages = self.album_data[event.media_group_id]["messages"]
album_messages.sort(key=lambda x: x.message_id)
data["album"] = album_messages
#
# # Remove the media group from tracking to free up memory
# Удаляем медиа группу из отслеживания для освобождения памяти
del self.album_data[event.media_group_id]
# # Call the original event handler
# Вызываем оригинальный обработчик события
return await handler(event, data)
#