@Dejcv2

Как можно исправить эту middleware?

Приветствую! Не так давно написал мидлварь для регистрации обычных пользователей и рефералов, вроде бы всё проверил, но смущает размер кода, от этого ощущение, что я много где накосячил

class RegisterCheck(BaseMiddleware):
    async def __call__(
            self,
            handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
            event: Union[Message, CallbackQuery],
            data: Dict[str, Any]):
        session_maker: sessionmaker = async_session
        async with session_maker() as session:
            async with session.begin():
                start_message = r"https://t.me/[\w]+?\?start=\d+"
                result = await session.execute(select(Users).where(Users.user_id == event.from_user.id))
                user = result.scalar()

                if isinstance(event, Message):
                    if event.chat.type == 'private':
                        if event.text != start_message:
                            if user is not None:
                                pass
                            else:
                                user = Users(
                                    user_id=event.from_user.id,
                                    user_name=event.from_user.username
                                )
                                await session.merge(user)
                        else:
                            if user is not None:
                                pass
                            else:
                                user = Users(
                                    user_id=event.from_user.id,
                                    user_name=event.from_user.username,
                                    referrer=event.text
                                )
                                await session.merge(user)
                else:
                    if user is not None:
                        pass
                    else:
                        user = Users(
                            user_id=event.from_user.id,
                            user_name=event.from_user.username
                        )
                        await session.merge(user)

        return await handler(event, data)


Как можно улучшить этот код? Из первого, что приходит на ум - заменить условные операторы на match/case, но может ещё что-то можно сделать?
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Everything_is_bad
user = result.scalar()

if user is None:
    referrer = None
    if event.chat.type == 'private' and event.text == start_message:
        referrer = event.text 

    user = Users(
        user_id=event.from_user.id,
        user_name=event.from_user.username,
        referrer=referrer
    )
    await session.merge(user)


хотя зачем такое делать в middleware?
@dp.message(CommandStart())
async def cmd_start(message, command):
    # а command.args будет твой referrer
Ответ написан
@Jack444
Если код работает то не парся. По улучшакам вот что заметил:
if user is not None: повторяется несколько раз, можно один раз проверить выше
if user := result.scalar():
и ниже писать остальную логику
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы