from collections.abc import Iterable from typing import Any, Optional, Type, Union from aiogram import Dispatcher from aiogram.dispatcher.middlewares.base import BaseMiddleware from .admin import AdminMiddleware from .loggings import LoggingMiddleware from .message_handler import MessageHandlerMiddleware from .session import SessionMiddleware from .throttling import ThrottlingMiddleware from .user import UserMiddleware def register_middleware( dispatcher: Dispatcher, middlewares: Iterable[BaseMiddleware | type[BaseMiddleware]] | None = None, exclude: Iterable[str] | None = None, ) -> None: """Регистрирует middleware в диспетчере. Args: dispatcher: Экземпляр диспетчера Aiogram middlewares: Опциональный список middleware для регистрации. Если не указан, регистрируются все стандартные middleware. exclude: Опциональный список имен middleware, которые нужно исключить из регистрации. Применяется только если middlewares не указан. """ # Если middleware не указаны, используем стандартный набор if middlewares is None: # Словарь всех доступных middleware available_middlewares = { "admin": AdminMiddleware(), "session": SessionMiddleware(), "logging": LoggingMiddleware(), "throttling": ThrottlingMiddleware(), "user": UserMiddleware(), "message_handler": MessageHandlerMiddleware(), } # Фильтруем middleware по списку исключений exclude_set = set(exclude or []) middlewares = [middleware for name, middleware in available_middlewares.items() if name not in exclude_set] # Регистрируем middleware для всех типов обработчиков handlers = [ dispatcher.message, dispatcher.callback_query, dispatcher.inline_query, # Можно добавить другие типы обработчиков при необходимости ] # Регистрируем каждый middleware для каждого типа обработчика for middleware in middlewares: # Если передан класс, а не экземпляр, создаем экземпляр if isinstance(middleware, type): middleware = middleware() for handler in handlers: handler.outer_middleware(middleware)