Esempio n. 1
0
    def _parse(client, message: Union[raw.types.Message,
                                      raw.types.MessageService], users: dict,
               chats: dict, is_chat: bool) -> Optional["Chat"]:
        from_id = utils.get_raw_peer_id(message.from_id)
        peer_id = utils.get_raw_peer_id(message.peer_id)
        chat_id = (peer_id or from_id) if is_chat else (from_id or peer_id)

        if isinstance(message.peer_id, raw.types.PeerUser):
            return Chat._parse_user_chat(client, users.get(chat_id, None))

        if isinstance(message.peer_id, raw.types.PeerChat):
            return Chat._parse_chat_chat(client, chats.get(chat_id, None))

        return Chat._parse_channel_chat(client, chats.get(chat_id, None))
Esempio n. 2
0
    def _parse(client, message: raw.types.Message or raw.types.MessageService,
               users: dict, chats: dict) -> "Chat":
        if isinstance(message.peer_id, raw.types.PeerUser):
            return Chat._parse_user_chat(
                client, users[message.peer_id.user_id if message.
                              out else utils.get_raw_peer_id(message.from_id)])

        if isinstance(message.peer_id, raw.types.PeerChat):
            return Chat._parse_chat_chat(client,
                                         chats[message.peer_id.chat_id])

        return Chat._parse_channel_chat(client,
                                        chats[message.peer_id.channel_id])
Esempio n. 3
0
    def _parse(client: "pyrogram.Client",
               update: "raw.types.UpdateBotChatInviteRequester",
               users: Dict[int, "raw.types.User"],
               chats: Dict[int, "raw.types.Chat"]) -> "ChatJoinRequest":
        chat_id = utils.get_raw_peer_id(update.peer)

        return ChatJoinRequest(
            chat=types.Chat._parse_chat(client, chats[chat_id]),
            from_user=types.User._parse(client, users[update.user_id]),
            date=update.date,
            bio=update.about,
            invite_link=types.ChatInviteLink._parse(client, update.invite,
                                                    users),
            client=client)
    async def _parse(client,
                     message: raw.types.Message,
                     users: dict,
                     chats: dict,
                     is_scheduled: bool = False):
        if message is None:
            return None

        entities = [
            types.MessageEntity._parse(client, entity, users)
            for entity in message.entities
        ]
        entities = types.List(filter(lambda x: x is not None, entities))

        user = utils.get_raw_peer_id(message.from_id) or utils.get_raw_peer_id(
            message.peer_id)
        from_user = types.User._parse(client, users.get(user, None))
        sender_chat = await types.Chat._parse(client, message, users,
                                              chats) if not from_user else None

        reply_markup = message.reply_markup

        if reply_markup:
            if isinstance(reply_markup, raw.types.ReplyKeyboardForceReply):
                reply_markup = types.ForceReply.read(reply_markup)
            elif isinstance(reply_markup, raw.types.ReplyKeyboardMarkup):
                reply_markup = types.ReplyKeyboardMarkup.read(reply_markup)
            elif isinstance(reply_markup, raw.types.ReplyInlineMarkup):
                reply_markup = types.InlineKeyboardMarkup.read(reply_markup)
            elif isinstance(reply_markup, raw.types.ReplyKeyboardHide):
                reply_markup = types.ReplyKeyboardRemove.read(reply_markup)
            else:
                reply_markup = None

        raw_media = message.media
        media = None
        media_type = None
        if raw_media:
            if isinstance(raw_media, raw.types.MessageMediaPhoto):
                media = types.Photo._parse(client, raw_media.photo,
                                           raw_media.ttl_seconds)
                media_type = 'photo'

            elif isinstance(raw_media, raw.types.MessageMediaGeo):
                media = types.Geo._parse(client, raw_media)
                media_type = 'location'

            elif isinstance(raw_media, raw.types.MessageMediaContact):
                media = types.Contact._parse(client, raw_media)
                media_type = 'contact'

            elif isinstance(raw_media, raw.types.MessageMediaDocument):
                doc = raw_media.document

                if isinstance(doc, raw.types.Document):
                    attributes = {type(i): i for i in doc.attributes}

                    file_name = getattr(
                        attributes.get(raw.types.DocumentAttributeFilename,
                                       None), "file_name", None)

                    if raw.types.DocumentAttributeAudio in attributes:
                        audio_attributes = attributes[
                            raw.types.DocumentAttributeAudio]

                        if audio_attributes.voice:
                            media = types.Voice._parse(client, doc,
                                                       audio_attributes)
                            media_type = 'voice'
                        else:
                            media = types.Audio._parse(client, doc,
                                                       audio_attributes,
                                                       file_name)
                            media_type = 'audio'
                    elif raw.types.DocumentAttributeAnimated in attributes:
                        video_attributes = attributes.get(
                            raw.types.DocumentAttributeVideo, None)

                        media = types.Animation._parse(client, doc,
                                                       video_attributes,
                                                       file_name)
                        media_type = 'animation'
                    elif raw.types.DocumentAttributeVideo in attributes:
                        video_attributes = attributes[
                            raw.types.DocumentAttributeVideo]

                        if video_attributes.round_message:
                            media = types.VideoNote._parse(
                                client, doc, video_attributes)
                            media_type = 'video_note'
                        else:
                            media = types.Video._parse(client, doc,
                                                       video_attributes,
                                                       file_name,
                                                       raw_media.ttl_seconds)
                            media_type = 'video'
                    elif raw.types.DocumentAttributeSticker in attributes:
                        media = await types.Sticker._parse(
                            client, doc,
                            attributes.get(
                                raw.types.DocumentAttributeImageSize, None),
                            attributes[raw.types.DocumentAttributeSticker],
                            file_name)
                        media_type = 'sticker'
                    else:
                        media = types.Document._parse(client, doc, file_name)
                        media_type = 'document'

            elif isinstance(raw_media, raw.types.MessageMediaWebPage):
                if isinstance(raw_media.webpage, raw.types.WebPage):
                    media = types.WebPage._parse(client, raw_media.webpage)
                    media_type = 'webpage'
                else:
                    media = None

            elif isinstance(raw_media, raw.types.MessageMediaVenue):
                media = types.Venue._parse(client, raw_media)
                media_type = 'venue'

            elif isinstance(raw_media, raw.types.MessageMediaGame):
                media = types.Game._parse(client, message)
                media_type = 'game'

            elif isinstance(raw_media, raw.types.MessageMediaInvoice):
                media = types.Invoice._parse(client, raw_media)
                media_type = 'invoice'

            elif isinstance(raw_media, raw.types.MessageMediaGeoLive):
                media = types.GeoLive._parse(client, raw_media)
                media_type = 'live_location'

            elif isinstance(raw_media, raw.types.MessageMediaPoll):
                media = types.Poll._parse(client, raw_media)
                media_type = 'poll'

            elif isinstance(raw_media, raw.types.MessageMediaDice):
                media = types.Dice._parse(client, raw_media)
                media_type = 'dice'

            else:
                media = None

        return MessageNormal(
            client=client,
            edit_date=getattr(message, 'edit_date', None),
            is_outgoing=getattr(message, 'out', None),
            mentioned=getattr(message, 'mentioned', None),
            media_unread=getattr(message, 'media_unread', None),
            is_silent=getattr(message, 'silent', None),
            is_post=getattr(message, 'post', None),
            from_scheduled=getattr(message, 'from_scheduled', None),
            is_scheduled=is_scheduled,
            legacy=getattr(message, 'legacy', None),
            edit_hide=getattr(message, 'edit_hide', None),
            is_pinned=getattr(message, 'pinned', None),
            media_group_id=getattr(message, 'grouped_id', None),
            from_user=from_user,
            sender_chat=sender_chat,
            forward_header=await types.MessageForwardHeader._parse(
                client, getattr(message, 'fwd_from', None), users, chats),
            via_bot=users.get(message.via_bot_id, None) if getattr(
                message, 'via_bot_id', None) else None,
            reply_header=types.MessageReplyHeader._parse(
                client, getattr(message, 'reply_to', None), users, chats),
            text=types.Str(message.message).init(entities) or None,
            media=media,
            media_type=media_type,
            reply_markup=reply_markup,
            entities=entities,
            views=await
            types.MessageViews._parse_from_message(client, message.id, message,
                                                   users, chats),
            restrictions=types.List([
                types.Restriction._parse(restriction)
                for restriction in getattr(message, 'restrictions', [])
            ]) or None,
        )
Esempio n. 5
0
 def _parse_action(client, service: raw.types.MessageService, users: dict):
     return GameHighScore(user=types.User._parse(
         client, users[utils.get_raw_peer_id(service.from_id
                                             or service.peer_id)]),
                          score=service.action.score,
                          client=client)
Esempio n. 6
0
    async def get_dialogs(
        self,
        offset_date: int = 0,
        limit: int = 100,
        pinned_only: bool = False
    ) -> List["types.Dialog"]:
        """Get a chunk of the user's dialogs.

        You can get up to 100 dialogs at once.
        For a more convenient way of getting a user's dialogs see :meth:`~pyrogram.Client.iter_dialogs`.

        Parameters:
            offset_date (``int``):
                The offset date in Unix time taken from the top message of a :obj:`~pyrogram.types.Dialog`.
                Defaults to 0. Valid for non-pinned dialogs only.

            limit (``str``, *optional*):
                Limits the number of dialogs to be retrieved.
                Defaults to 100. Valid for non-pinned dialogs only.

            pinned_only (``bool``, *optional*):
                Pass True if you want to get only pinned dialogs.
                Defaults to False.

        Returns:
            List of :obj:`~pyrogram.types.Dialog`: On success, a list of dialogs is returned.

        Example:
            .. code-block:: python

                # Get first 100 dialogs
                app.get_dialogs()

                # Get pinned dialogs
                app.get_dialogs(pinned_only=True)
        """

        if pinned_only:
            r = await self.send(
                raw.functions.messages.GetPinnedDialogs(folder_id=0),
                sleep_threshold=60
            )
        else:
            r = await self.send(
                raw.functions.messages.GetDialogs(
                    offset_date=offset_date,
                    offset_id=0,
                    offset_peer=raw.types.InputPeerEmpty(),
                    limit=limit,
                    hash=0,
                    exclude_pinned=True
                ),
                sleep_threshold=60
            )

        users = {i.id: i for i in r.users}
        chats = {i.id: i for i in r.chats}

        messages = {}

        for message in r.messages:
            peer_id = message.peer_id

            if isinstance(peer_id, raw.types.PeerUser):
                if message.out:
                    chat_id = peer_id.user_id
                else:
                    chat_id = utils.get_raw_peer_id(message.from_id)
            else:
                chat_id = utils.get_peer_id(peer_id)

            messages[chat_id] = await types.Message._parse(self, message, users, chats)

        parsed_dialogs = []

        for dialog in r.dialogs:
            if not isinstance(dialog, raw.types.Dialog):
                continue

            parsed_dialogs.append(types.Dialog._parse(self, dialog, messages, users, chats))

        return types.List(parsed_dialogs)
Esempio n. 7
0
    def _parse(
        client: "pyrogram.Client",
        member: Union["raw.base.ChatParticipant", "raw.base.ChannelParticipant"],
        users: Dict[int, "raw.base.User"],
        chats: Dict[int, "raw.base.Chat"]
    ) -> "ChatMember":
        # Chat participants
        if isinstance(member, raw.types.ChatParticipant):
            return ChatMember(
                status=enums.ChatMemberStatus.MEMBER,
                user=types.User._parse(client, users[member.user_id]),
                joined_date=utils.timestamp_to_datetime(member.date),
                invited_by=types.User._parse(client, users[member.inviter_id]),
                client=client
            )
        elif isinstance(member, raw.types.ChatParticipantAdmin):
            return ChatMember(
                status=enums.ChatMemberStatus.ADMINISTRATOR,
                user=types.User._parse(client, users[member.user_id]),
                joined_date=utils.timestamp_to_datetime(member.date),
                invited_by=types.User._parse(client, users[member.inviter_id]),
                client=client
            )
        elif isinstance(member, raw.types.ChatParticipantCreator):
            return ChatMember(
                status=enums.ChatMemberStatus.OWNER,
                user=types.User._parse(client, users[member.user_id]),
                client=client
            )

        # Channel participants
        if isinstance(member, raw.types.ChannelParticipant):
            return ChatMember(
                status=enums.ChatMemberStatus.MEMBER,
                user=types.User._parse(client, users[member.user_id]),
                joined_date=utils.timestamp_to_datetime(member.date),
                client=client
            )
        elif isinstance(member, raw.types.ChannelParticipantAdmin):
            return ChatMember(
                status=enums.ChatMemberStatus.ADMINISTRATOR,
                user=types.User._parse(client, users[member.user_id]),
                joined_date=utils.timestamp_to_datetime(member.date),
                promoted_by=types.User._parse(client, users[member.promoted_by]),
                invited_by=(
                    types.User._parse(client, users[member.inviter_id])
                    if member.inviter_id else None
                ),
                custom_title=member.rank,
                can_be_edited=member.can_edit,
                privileges=types.ChatPrivileges._parse(member.admin_rights),
                client=client
            )
        elif isinstance(member, raw.types.ChannelParticipantBanned):
            peer = member.peer
            peer_id = utils.get_raw_peer_id(peer)

            user = (
                types.User._parse(client, users[peer_id])
                if isinstance(peer, raw.types.PeerUser) else None
            )

            chat = (
                types.Chat._parse_chat(client, chats[peer_id])
                if not isinstance(peer, raw.types.PeerUser) else None
            )

            return ChatMember(
                status=(
                    enums.ChatMemberStatus.BANNED
                    if member.banned_rights.view_messages
                    else enums.ChatMemberStatus.RESTRICTED
                ),
                user=user,
                chat=chat,
                until_date=utils.timestamp_to_datetime(member.banned_rights.until_date),
                joined_date=utils.timestamp_to_datetime(member.date),
                is_member=not member.left,
                restricted_by=types.User._parse(client, users[member.kicked_by]),
                permissions=types.ChatPermissions._parse(member.banned_rights),
                client=client
            )
        elif isinstance(member, raw.types.ChannelParticipantCreator):
            return ChatMember(
                status=enums.ChatMemberStatus.OWNER,
                user=types.User._parse(client, users[member.user_id]),
                custom_title=member.rank,
                privileges=types.ChatPrivileges._parse(member.admin_rights),
                client=client
            )
        elif isinstance(member, raw.types.ChannelParticipantLeft):
            peer = member.peer
            peer_id = utils.get_raw_peer_id(peer)

            user = (
                types.User._parse(client, users[peer_id])
                if isinstance(peer, raw.types.PeerUser) else None
            )

            chat = (
                types.Chat._parse_chat(client, chats[peer_id])
                if not isinstance(peer, raw.types.PeerUser) else None
            )

            return ChatMember(
                status=enums.ChatMemberStatus.LEFT,
                user=user,
                chat=chat,
                client=client
            )
        elif isinstance(member, raw.types.ChannelParticipantSelf):
            return ChatMember(
                status=enums.ChatMemberStatus.MEMBER,
                user=types.User._parse(client, users[member.user_id]),
                joined_date=utils.timestamp_to_datetime(member.date),
                invited_by=types.User._parse(client, users[member.inviter_id]),
                client=client
            )