from typing import Any, Awaitable, Callable, Dict, Optional
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject, CallbackQuery
from fluentogram import TranslatorHub
from config import CREDITS_ADMIN_DAILY, START_BALANCE, ADMIN_ID, ADMINS_LIST
class TranslatorRunnerMiddleware(BaseMiddleware):
def __init__(
self,
translator_hub_alias: str = '_translator_hub',
translator_runner_alias: str = 'i18n',
):
self.translator_hub_alias = translator_hub_alias
self.translator_runner_alias = translator_runner_alias
async def __call__(
self,
event_handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
event: TelegramObject,
ctx_data: Dict[str, Any],
) -> None:
message = getattr(event, 'message', None)
callback_query = getattr(event, 'callback_query', None)
from_user = message.from_user if message else callback_query.from_user if callback_query else None
translator_hub: Optional[TranslatorHub] = ctx_data.get(self.translator_hub_alias)
if from_user is None or translator_hub is None:
return await event_handler(event, ctx_data)
user_repo = ctx_data['user_repo']
sum_credits = (CREDITS_ADMIN_DAILY
if from_user.id == ADMIN_ID or from_user.id in ADMINS_LIST
else START_BALANCE
)
user = await user_repo.create_if_not_exists(telegram_id=from_user.id, balance_credits=sum_credits)
lang = user.language if user.language else 'en'
ctx_data[self.translator_runner_alias] = translator_hub.get_translator_by_locale(lang)
ctx_data['user'] = user
await event_handler(event, ctx_data)