Files
remnawave-bedolaga-telegram…/app/middlewares/maintenance.py
T
2025-08-30 14:35:38 +03:00

52 lines
2.1 KiB
Python

import logging
from typing import Callable, Dict, Any, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import Message, CallbackQuery, TelegramObject, User as TgUser
from app.config import settings
from app.services.maintenance_service import maintenance_service
logger = logging.getLogger(__name__)
class MaintenanceMiddleware(BaseMiddleware):
"""
Middleware для блокировки пользователей во время техработ.
Админы могут использовать бота в любое время.
"""
async def __call__(
self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any]
) -> Any:
user: TgUser = None
if isinstance(event, (Message, CallbackQuery)):
user = event.from_user
if not user or user.is_bot:
return await handler(event, data)
# Проверяем, включен ли режим техработ
if not maintenance_service.is_maintenance_active():
return await handler(event, data)
# Админы могут работать с ботом всегда
if settings.is_admin(user.id):
return await handler(event, data)
# Блокируем обычных пользователей
maintenance_message = maintenance_service.get_maintenance_message()
try:
if isinstance(event, Message):
await event.answer(maintenance_message, parse_mode="HTML")
elif isinstance(event, CallbackQuery):
await event.answer(maintenance_message, show_alert=True)
except Exception as e:
logger.error(f"Ошибка отправки сообщения о техработах пользователю {user.id}: {e}")
logger.info(f"🔧 Пользователь {user.id} заблокирован во время техработ")
return # Прерываем выполнение хендлера