This commit is contained in:
Alexander Kalinovsky
2025-01-04 12:00:12 +01:00
commit 6dbe0536ca
94 changed files with 3467 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
from .auth import AuthMiddleware
from .i18n import I18nMiddleware
from .reset_state import ResetStateMiddleware

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,40 @@
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject, Message, CallbackQuery
from aiogram.utils.i18n import gettext as _
from babel.support import LazyProxy
from typing import Any, Awaitable, Callable, Dict
from ...model.user import UserBase
class AuthMiddleware(BaseMiddleware):
def __init__[UserType: UserBase](self,
user_class: type[UserType],
not_authenticated_msg: LazyProxy | str = "not authenticated",
not_active_msg: LazyProxy | str = "not active"):
self.user_class = user_class
self.not_authenticated_msg = not_authenticated_msg
self.not_active_msg = not_active_msg
async def __call__(self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any]) -> Any:
user = await self.user_class.get(id = event.from_user.id, session = data["db_session"])
if user and user.is_active:
data["user"] = user
return await handler(event, data)
if type(event) in [Message, CallbackQuery]:
if user and not user.is_active:
return await event.answer(self.not_active_msg)
return await event.answer(self.not_authenticated_msg)

View File

@@ -0,0 +1,28 @@
from typing import Optional, Dict, Any
from aiogram.utils.i18n import I18n, SimpleI18nMiddleware
from aiogram.types import TelegramObject
from ...model.user import UserBase
class I18nMiddleware(SimpleI18nMiddleware):
"""
This middleware stores locale in the FSM storage
"""
def __init__[UserType: UserBase](
self,
user_class: type[UserType],
i18n: I18n,
i18n_key: Optional[str] = "i18n",
middleware_key: str = "i18n_middleware",
) -> None:
self.user_class = user_class
super().__init__(i18n=i18n, i18n_key=i18n_key, middleware_key=middleware_key)
async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str:
db_session = data.get("db_session")
if db_session and event.model_fields.get("from_user"):
user = await self.user_class.get(id = event.from_user.id, session = db_session)
if user and user.lang:
return user.lang
return await super().get_locale(event=event, data=data)

View File

@@ -0,0 +1,30 @@
from typing import Any, Awaitable, Callable, Dict
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject
from aiogram.fsm.context import FSMContext
from aiogram.utils.i18n import gettext as _
from ...bot.handlers.context import ContextData
class ResetStateMiddleware(BaseMiddleware):
async def __call__(self,
handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
data: Dict[str, Any]) -> Any:
save_state = False
callback_data = data.get("callback_data")
if isinstance(callback_data, ContextData):
save_state = callback_data.save_state
if not save_state:
state = data.get("state")
if isinstance(state, FSMContext):
await state.clear()
return await handler(event, data)