~cytrogen/evi-run

ref: b4084f5eac89c4d164c014e297cff02678b07125 evi-run/bot/middlewares/translator_hub.py -rw-r--r-- 1.8 KiB
b4084f5e — Bendy Merge branch 'main' of https://github.com/pipedude/evi-run 5 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
42
43
44
45
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)