39 lines
1.6 KiB
Python
39 lines
1.6 KiB
Python
"""Keep sensitive dialogs private and report unexpected failures safely."""
|
||
import logging
|
||
|
||
from aiogram import BaseMiddleware
|
||
from aiogram.types import CallbackQuery, Message
|
||
from aiogram.exceptions import TelegramBadRequest
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class PrivateDialogMiddleware(BaseMiddleware):
|
||
async def __call__(self, handler, event, data):
|
||
message = event if isinstance(event, Message) else getattr(event, "message", None)
|
||
if message and message.chat.type != "private":
|
||
if isinstance(event, CallbackQuery):
|
||
await event.answer("Откройте личный диалог с ботом", show_alert=True)
|
||
return
|
||
return await handler(event, data)
|
||
|
||
|
||
class ErrorMiddleware(BaseMiddleware):
|
||
async def __call__(self, handler, event, data):
|
||
try:
|
||
return await handler(event, data)
|
||
except TelegramBadRequest as error:
|
||
if "message is not modified" in str(error):
|
||
if isinstance(event, CallbackQuery):
|
||
await event.answer()
|
||
return
|
||
logger.exception("Telegram rejected a bot response")
|
||
except Exception:
|
||
logger.exception("Update handler failed")
|
||
message = event.message if isinstance(event, CallbackQuery) else event
|
||
if message:
|
||
try:
|
||
await message.answer("Не удалось выполнить действие. Попробуйте ещё раз или отправьте /cancel.")
|
||
except Exception:
|
||
logger.warning("Failed to deliver error response")
|