mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-04 09:57:29 +03:00 
			
		
		
		
	(Try to) fix infinite recursion in custom.Message again
This commit is contained in:
		
							parent
							
								
									bc03c29216
								
							
						
					
					
						commit
						5df46f9ed8
					
				| 
						 | 
					@ -33,8 +33,8 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        # This way there's no need to worry about get/setattr.
 | 
					        # This way there's no need to worry about get/setattr.
 | 
				
			||||||
        self.__dict__ = original.__dict__
 | 
					        self.__dict__ = original.__dict__
 | 
				
			||||||
        self.original_message = original
 | 
					        self.original_message = original
 | 
				
			||||||
        self.stringify = self.original_message.stringify
 | 
					        self.stringify = original.stringify
 | 
				
			||||||
        self.to_dict = self.original_message.to_dict
 | 
					        self.to_dict = original.to_dict
 | 
				
			||||||
        self._client = client
 | 
					        self._client = client
 | 
				
			||||||
        self._text = None
 | 
					        self._text = None
 | 
				
			||||||
        self._reply_message = None
 | 
					        self._reply_message = None
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        self._buttons_flat = None
 | 
					        self._buttons_flat = None
 | 
				
			||||||
        self._buttons_count = None
 | 
					        self._buttons_count = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._sender_id = self.original_message.from_id
 | 
					        self._sender_id = original.from_id
 | 
				
			||||||
        self._sender = entities.get(self._sender_id)
 | 
					        self._sender = entities.get(self._sender_id)
 | 
				
			||||||
        if self._sender:
 | 
					        if self._sender:
 | 
				
			||||||
            self._input_sender = get_input_peer(self._sender)
 | 
					            self._input_sender = get_input_peer(self._sender)
 | 
				
			||||||
| 
						 | 
					@ -53,13 +53,12 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Determine the right chat where the message
 | 
					        # Determine the right chat where the message
 | 
				
			||||||
        # was sent, not *to which ID* it was sent.
 | 
					        # was sent, not *to which ID* it was sent.
 | 
				
			||||||
        if not self.original_message.out \
 | 
					        if not original.out and isinstance(original.to_id, types.PeerUser):
 | 
				
			||||||
                and isinstance(self.original_message.to_id, types.PeerUser):
 | 
					 | 
				
			||||||
            self._chat_peer = types.PeerUser(self._sender_id)
 | 
					            self._chat_peer = types.PeerUser(self._sender_id)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self._chat_peer = self.original_message.to_id
 | 
					            self._chat_peer = original.to_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._broadcast = bool(self.original_message.post)
 | 
					        self._broadcast = bool(original.post)
 | 
				
			||||||
        self._chat = entities.get(self.chat_id)
 | 
					        self._chat = entities.get(self.chat_id)
 | 
				
			||||||
        self._input_chat = input_chat
 | 
					        self._input_chat = input_chat
 | 
				
			||||||
        if not self._input_chat and self._chat:
 | 
					        if not self._input_chat and self._chat:
 | 
				
			||||||
| 
						 | 
					@ -70,9 +69,8 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
                # are still valid so default to getting "True" on not found
 | 
					                # are still valid so default to getting "True" on not found
 | 
				
			||||||
                self._input_chat = None
 | 
					                self._input_chat = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if getattr(self.original_message, 'fwd_from', None):
 | 
					        if getattr(original, 'fwd_from', None):
 | 
				
			||||||
            self._forward = Forward(
 | 
					            self._forward = Forward(self._client, original.fwd_from, entities)
 | 
				
			||||||
                self._client, self.original_message.fwd_from, entities)
 | 
					 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self._forward = None
 | 
					            self._forward = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,7 +120,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            msg, ent = value, []
 | 
					            msg, ent = value, []
 | 
				
			||||||
        self.__dict__['message'] = msg
 | 
					        self.__dict__['message'] = msg
 | 
				
			||||||
        self.__dict__['entities'] = ent
 | 
					        self.entities = ent
 | 
				
			||||||
        self._text = value
 | 
					        self._text = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
| 
						 | 
					@ -136,7 +134,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
    @raw_text.setter
 | 
					    @raw_text.setter
 | 
				
			||||||
    def raw_text(self, value):
 | 
					    def raw_text(self, value):
 | 
				
			||||||
        self.__dict__['message'] = value
 | 
					        self.__dict__['message'] = value
 | 
				
			||||||
        self.__dict__['entities'] = []
 | 
					        self.entities = []
 | 
				
			||||||
        self._text = None
 | 
					        self._text = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
| 
						 | 
					@ -157,8 +155,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        The :tl:`MessageAction` for the :tl:`MessageService`.
 | 
					        The :tl:`MessageAction` for the :tl:`MessageService`.
 | 
				
			||||||
        Will be ``None`` for :tl:`Message`.
 | 
					        Will be ``None`` for :tl:`Message`.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if isinstance(self.original_message, types.MessageService):
 | 
					        return self.__dict__.get('action')
 | 
				
			||||||
            return self.original_message.action
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO Make a property for via_bot and via_input_bot, as well as get_*
 | 
					    # TODO Make a property for via_bot and via_input_bot, as well as get_*
 | 
				
			||||||
    async def _reload_message(self):
 | 
					    async def _reload_message(self):
 | 
				
			||||||
| 
						 | 
					@ -168,8 +165,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            chat = await self.get_input_chat() if self.is_channel else None
 | 
					            chat = await self.get_input_chat() if self.is_channel else None
 | 
				
			||||||
            msg = await self._client.get_messages(
 | 
					            msg = await self._client.get_messages(chat, ids=self.id)
 | 
				
			||||||
                chat, ids=self.original_message.id)
 | 
					 | 
				
			||||||
        except ValueError:
 | 
					        except ValueError:
 | 
				
			||||||
            return  # We may not have the input chat/get message failed
 | 
					            return  # We may not have the input chat/get message failed
 | 
				
			||||||
        if not msg:
 | 
					        if not msg:
 | 
				
			||||||
| 
						 | 
					@ -186,7 +182,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def is_reply(self):
 | 
					    def is_reply(self):
 | 
				
			||||||
        """True if the message is a reply to some other or not."""
 | 
					        """True if the message is a reply to some other or not."""
 | 
				
			||||||
        return bool(self.original_message.reply_to_msg_id)
 | 
					        return bool(self.reply_to_msg_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def forward(self):
 | 
					    def forward(self):
 | 
				
			||||||
| 
						 | 
					@ -200,13 +196,12 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Helper methods to set the buttons given the input sender and chat.
 | 
					        Helper methods to set the buttons given the input sender and chat.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if isinstance(self.original_message.reply_markup, (
 | 
					        if isinstance(self.reply_markup, (
 | 
				
			||||||
                types.ReplyInlineMarkup, types.ReplyKeyboardMarkup)):
 | 
					                types.ReplyInlineMarkup, types.ReplyKeyboardMarkup)):
 | 
				
			||||||
            self._buttons = [[
 | 
					            self._buttons = [[
 | 
				
			||||||
                MessageButton(self._client, button, chat, bot,
 | 
					                MessageButton(self._client, button, chat, bot, self.id)
 | 
				
			||||||
                              self.original_message.id)
 | 
					 | 
				
			||||||
                for button in row.buttons
 | 
					                for button in row.buttons
 | 
				
			||||||
            ] for row in self.original_message.reply_markup.rows]
 | 
					            ] for row in self.reply_markup.rows]
 | 
				
			||||||
            self._buttons_flat = [x for row in self._buttons for x in row]
 | 
					            self._buttons_flat = [x for row in self._buttons for x in row]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _needed_markup_bot(self):
 | 
					    def _needed_markup_bot(self):
 | 
				
			||||||
| 
						 | 
					@ -217,7 +212,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        to know what bot we want to start. Raises ``ValueError`` if the bot
 | 
					        to know what bot we want to start. Raises ``ValueError`` if the bot
 | 
				
			||||||
        cannot be found but is needed. Returns ``None`` if it's not needed.
 | 
					        cannot be found but is needed. Returns ``None`` if it's not needed.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        for row in self.original_message.reply_markup.rows:
 | 
					        for row in self.reply_markup.rows:
 | 
				
			||||||
            for button in row.buttons:
 | 
					            for button in row.buttons:
 | 
				
			||||||
                if isinstance(button, types.KeyboardButtonSwitchInline):
 | 
					                if isinstance(button, types.KeyboardButtonSwitchInline):
 | 
				
			||||||
                    if button.same_peer:
 | 
					                    if button.same_peer:
 | 
				
			||||||
| 
						 | 
					@ -226,7 +221,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
                            raise ValueError('No input sender')
 | 
					                            raise ValueError('No input sender')
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        return self._client.session.get_input_entity(
 | 
					                        return self._client.session.get_input_entity(
 | 
				
			||||||
                            self.original_message.via_bot_id)
 | 
					                            self.via_bot_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def buttons(self):
 | 
					    def buttons(self):
 | 
				
			||||||
| 
						 | 
					@ -237,7 +232,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        if not isinstance(self.original_message, types.Message):
 | 
					        if not isinstance(self.original_message, types.Message):
 | 
				
			||||||
            return  # MessageService and MessageEmpty have no markup
 | 
					            return  # MessageService and MessageEmpty have no markup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self._buttons is None and self.original_message.reply_markup:
 | 
					        if self._buttons is None and self.reply_markup:
 | 
				
			||||||
            if not self.input_chat:
 | 
					            if not self.input_chat:
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
| 
						 | 
					@ -278,12 +273,12 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
            return 0
 | 
					            return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self._buttons_count is None and isinstance(
 | 
					        if self._buttons_count is None and isinstance(
 | 
				
			||||||
                self.original_message.reply_markup, (
 | 
					                self.reply_markup, (
 | 
				
			||||||
                        types.ReplyInlineMarkup, types.ReplyKeyboardMarkup
 | 
					                        types.ReplyInlineMarkup, types.ReplyKeyboardMarkup
 | 
				
			||||||
                )):
 | 
					                )):
 | 
				
			||||||
            self._buttons_count = sum(
 | 
					            self._buttons_count = sum(
 | 
				
			||||||
                1
 | 
					                1
 | 
				
			||||||
                for row in self.original_message.reply_markup.rows
 | 
					                for row in self.reply_markup.rows
 | 
				
			||||||
                for _ in row.buttons
 | 
					                for _ in row.buttons
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -295,9 +290,9 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        Returns the media of the message.
 | 
					        Returns the media of the message.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if isinstance(self.original_message, types.Message):
 | 
					        if isinstance(self.original_message, types.Message):
 | 
				
			||||||
            return self.original_message.media
 | 
					            return self.__dict__['media']
 | 
				
			||||||
        elif isinstance(self.original_message, types.MessageService):
 | 
					        elif isinstance(self.original_message, types.MessageService):
 | 
				
			||||||
            action = self.original_message.action
 | 
					            action = self.__dict__['action']
 | 
				
			||||||
            if isinstance(action, types.MessageActionChatEditPhoto):
 | 
					            if isinstance(action, types.MessageActionChatEditPhoto):
 | 
				
			||||||
                return types.MessageMediaPhoto(action.photo)
 | 
					                return types.MessageMediaPhoto(action.photo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -407,11 +402,11 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        will later be cached.
 | 
					        will later be cached.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if self._reply_message is None:
 | 
					        if self._reply_message is None:
 | 
				
			||||||
            if not self.original_message.reply_to_msg_id:
 | 
					            if not self.reply_to_msg_id:
 | 
				
			||||||
                return None
 | 
					                return None
 | 
				
			||||||
            self._reply_message = await self._client.get_messages(
 | 
					            self._reply_message = await self._client.get_messages(
 | 
				
			||||||
                await self.get_input_chat() if self.is_channel else None,
 | 
					                await self.get_input_chat() if self.is_channel else None,
 | 
				
			||||||
                ids=self.original_message.reply_to_msg_id
 | 
					                ids=self.reply_to_msg_id
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return self._reply_message
 | 
					        return self._reply_message
 | 
				
			||||||
| 
						 | 
					@ -431,7 +426,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        `telethon.telegram_client.TelegramClient.send_message` with
 | 
					        `telethon.telegram_client.TelegramClient.send_message` with
 | 
				
			||||||
        both ``entity`` and ``reply_to`` already set.
 | 
					        both ``entity`` and ``reply_to`` already set.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        kwargs['reply_to'] = self.original_message.id
 | 
					        kwargs['reply_to'] = self.id
 | 
				
			||||||
        return await self._client.send_message(
 | 
					        return await self._client.send_message(
 | 
				
			||||||
            await self.get_input_chat(), *args, **kwargs)
 | 
					            await self.get_input_chat(), *args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -445,7 +440,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        this `forward_to` method. Use a
 | 
					        this `forward_to` method. Use a
 | 
				
			||||||
        `telethon.telegram_client.TelegramClient` instance directly.
 | 
					        `telethon.telegram_client.TelegramClient` instance directly.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        kwargs['messages'] = self.original_message.id
 | 
					        kwargs['messages'] = self.id
 | 
				
			||||||
        kwargs['from_peer'] = await self.get_input_chat()
 | 
					        kwargs['from_peer'] = await self.get_input_chat()
 | 
				
			||||||
        return await self._client.forward_messages(*args, **kwargs)
 | 
					        return await self._client.forward_messages(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -458,9 +453,9 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
        Returns ``None`` if the message was incoming, or the edited
 | 
					        Returns ``None`` if the message was incoming, or the edited
 | 
				
			||||||
        :tl:`Message` otherwise.
 | 
					        :tl:`Message` otherwise.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if self.original_message.fwd_from:
 | 
					        if self.fwd_from:
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
        if not self.original_message.out:
 | 
					        if not self.__dict__['out']:
 | 
				
			||||||
            if not isinstance(self._chat_peer, types.PeerUser):
 | 
					            if not isinstance(self._chat_peer, types.PeerUser):
 | 
				
			||||||
                return None
 | 
					                return None
 | 
				
			||||||
            me = await self._client.get_me(input_peer=True)
 | 
					            me = await self._client.get_me(input_peer=True)
 | 
				
			||||||
| 
						 | 
					@ -581,7 +576,7 @@ class Message(ChatGetter, SenderGetter):
 | 
				
			||||||
                return await self._client(
 | 
					                return await self._client(
 | 
				
			||||||
                    functions.messages.GetBotCallbackAnswerRequest(
 | 
					                    functions.messages.GetBotCallbackAnswerRequest(
 | 
				
			||||||
                        peer=self._input_chat,
 | 
					                        peer=self._input_chat,
 | 
				
			||||||
                        msg_id=self.original_message.id,
 | 
					                        msg_id=self.id,
 | 
				
			||||||
                        data=data
 | 
					                        data=data
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user