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 }, )