968c258029
- Модифицирована функция upsert_user для возврата полных данных пользователя - Обновлен UserMiddleware для сохранения данных пользователя в контексте - Расширена функциональность register_middleware с поддержкой опционального исключения middleware - Добавлена типизация и улучшена обработка middleware
62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
from typing import Any, Iterable, Optional, Type, Union
|
|
|
|
from aiogram import Dispatcher
|
|
from aiogram.dispatcher.middlewares.base import BaseMiddleware
|
|
|
|
from .admin import AdminMiddleware
|
|
from .loggings import LoggingMiddleware
|
|
from .session import SessionMiddleware
|
|
from .throttling import ThrottlingMiddleware
|
|
from .user import UserMiddleware
|
|
|
|
|
|
def register_middleware(
|
|
dispatcher: Dispatcher,
|
|
middlewares: Optional[Iterable[Union[BaseMiddleware, Type[BaseMiddleware]]]] = None,
|
|
exclude: Optional[Iterable[str]] = 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(),
|
|
}
|
|
|
|
# Фильтруем 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)
|