~cytrogen/evi-run

ref: bec77f28c7e477435ca5db8dd5437c63f48aaaa9 evi-run/bot/middlewares/translator_hub.py -rw-r--r-- 1.6 KiB
bec77f28 — Bendy Simplify configuration examples in README 6 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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, CREDITS_USER_DAILY, ADMIN_ID


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 else CREDITS_USER_DAILY
        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)