production-taskbar / backend / tgbot / handlers / utils / info.py
info.py
Raw
from typing import Any, Dict

from telegram import Update


def extract_user_data_from_update(update: Update) -> Dict[str, Any]:

    if update.message is not None:
        user = update.message.from_user.to_dict()
    elif update.edited_message is not None:    # type: ignore
        user = update.edited_message.from_user.to_dict()
    elif update.inline_query is not None:
        user = update.inline_query.from_user.to_dict()
    elif update.chosen_inline_result is not None:
        user = update.chosen_inline_result.from_user.to_dict()
    elif update.callback_query is not None and update.callback_query.from_user is not None:
        user = update.callback_query.from_user.to_dict()
    elif update.callback_query is not None and update.callback_query.message is not None:
        user = update.callback_query.message.chat.to_dict()
    else:
        raise RuntimeError(f"Can't extract user data from update: {update}")

    return dict(
        user_id=user['id'],
        is_blocked_bot=False,
        **{
            k: user[k]
            for k in ['username', 'first_name', 'last_name', 'language_code']
            if k in user and user[k] is not None
        },
    )