from dataclasses import dataclass from pyrogram import Client, raw from pyrogram.types import Chat, User @dataclass(frozen=True) class ProfileFields: first_name: str | None = None last_name: str | None = None username: str | None = None phone: str | None = None photo_unique_id: str | None = None is_deleted_account: bool = False def active_username(usernames: list[raw.types.Username]) -> str | None: for username in usernames: if getattr(username, "active", False): return username.username return usernames[0].username if usernames else None def snapshot_from_user( client: Client, raw_user: raw.types.User ) -> tuple[ProfileFields, str | None, str | None]: user = User._parse(client, raw_user) # noqa: SLF001 photo = user.photo if user else None photo_unique_id = photo.big_photo_unique_id if photo else None photo_file_id = photo.big_file_id if photo else None fields = ProfileFields( first_name=user.first_name if user else None, last_name=user.last_name if user else None, username=user.username if user else None, phone=user.phone_number if user else None, photo_unique_id=photo_unique_id, is_deleted_account=bool(getattr(raw_user, "deleted", False)), ) return fields, photo_file_id, photo_unique_id def snapshot_from_high_level( user: User, ) -> tuple[ProfileFields, str | None, str | None]: photo = user.photo photo_unique_id = photo.big_photo_unique_id if photo else None photo_file_id = photo.big_file_id if photo else None fields = ProfileFields( first_name=user.first_name, last_name=user.last_name, username=user.username, phone=user.phone_number, photo_unique_id=photo_unique_id, is_deleted_account=bool(user.is_deleted), ) return fields, photo_file_id, photo_unique_id def snapshot_from_chat(chat: Chat) -> tuple[ProfileFields, str | None, str | None]: photo = chat.photo photo_unique_id = photo.big_photo_unique_id if photo else None photo_file_id = photo.big_file_id if photo else None fields = ProfileFields( first_name=chat.first_name, last_name=chat.last_name, username=chat.username, phone=None, photo_unique_id=photo_unique_id, is_deleted_account=False, ) return fields, photo_file_id, photo_unique_id