feat(telegram_bot): added middlewares folder

This commit is contained in:
ITQ
2025-02-19 14:37:33 +03:00
parent 66698ad7be
commit f6bc671add
3 changed files with 67 additions and 0 deletions
@@ -0,0 +1,43 @@
from collections.abc import Awaitable, Callable
from typing import Any
from aiogram import BaseMiddleware
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from api.client import AdNovaClient
from api.errors import HTTPError
class AuthMiddleware(BaseMiddleware):
def __init__(self) -> None:
pass
async def __call__(
self,
handler: Callable[[Message, dict[str, Any]], Awaitable[Any]],
event: Message,
data: dict[str, Any],
) -> Any:
state: FSMContext = data["state"]
state_data = await state.get_data()
if "advertiser_id" in state_data:
advertiser_id = state_data["advertiser_id"]
async with AdNovaClient() as client:
try:
advertiser = await client.get_advertiser(advertiser_id)
state_data["authenticated"] = True
state_data["advertiser"] = advertiser.model_dump(
mode="json"
)
except HTTPError:
state_data["authenticated"] = False
state_data["advertiser_id"] = None
else:
state_data["authenticated"] = False
state_data["advertiser_id"] = None
await state.set_data(state_data)
return await handler(event, data)
@@ -0,0 +1,24 @@
from collections.abc import Awaitable, Callable
from typing import Any
from aiogram import BaseMiddleware
from aiogram.types import Message
from cachetools import TTLCache
class ThrottlingMiddleware(BaseMiddleware):
def __init__(self, time_limit: float = 2) -> None:
self.limit = TTLCache(maxsize=10_000, ttl=time_limit)
async def __call__(
self,
handler: Callable[[Message, dict[str, Any]], Awaitable[Any]],
event: Message,
data: dict[str, Any],
) -> Any | None:
if event.chat.id in self.limit:
return None
self.limit[event.chat.id] = None
return await handler(event, data)