(Try to) fix infinite recursion in custom.Message again

This commit is contained in:
Lonami Exo 2018-07-22 12:27:08 +02:00
parent bc03c29216
commit 5df46f9ed8

View File

@ -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
) )
) )