From b2ed6caff44d805ef824245592aa4f4b4a86f41d Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Sun, 3 Jun 2018 13:00:07 +0200 Subject: [PATCH] Fix setattr for events.NewMessage/custom.Message --- telethon/events/newmessage.py | 8 +++++++- telethon/tl/custom/message.py | 15 ++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/telethon/events/newmessage.py b/telethon/events/newmessage.py index 2d15e3ac..39717eba 100644 --- a/telethon/events/newmessage.py +++ b/telethon/events/newmessage.py @@ -129,6 +129,8 @@ class NewMessage(EventBuilder): available members and methods. """ def __init__(self, message): + # Having to override __setattr__ makes things... complicated + self.__dict__['_init'] = False if not message.out and isinstance(message.to_id, types.PeerUser): # Incoming message (e.g. from a bot) has to_id=us, and # from_id=bot (the actual "chat" from an user's perspective). @@ -145,9 +147,13 @@ class NewMessage(EventBuilder): super()._set_client(client) self.message = custom.Message( client, self.message, self._entities, None) + self._init = True def __getattr__(self, item): return getattr(self.message, item) def __setattr__(self, name, value): - return setattr(self.original_message, name, value) + if self._init: + setattr(self.__dict__['message'], name, value) + else: + super().__setattr__(name, value) diff --git a/telethon/tl/custom/message.py b/telethon/tl/custom/message.py index 58015e46..33093255 100644 --- a/telethon/tl/custom/message.py +++ b/telethon/tl/custom/message.py @@ -19,7 +19,10 @@ class Message: in the original :tl:`Message`. """ def __init__(self, client, original, entities, input_chat): - self.__dict__['_init'] = False + # Share the original dictionary. Modifications to this + # object should also be reflected in the original one. + # This way there's no need to worry about get/setattr. + self.__dict__ = original.__dict__ self.original_message = original self.stringify = self.original_message.stringify self.to_dict = self.original_message.to_dict @@ -43,7 +46,6 @@ class Message: elif fwd.channel_id: self._fwd_from_entity = entities.get(get_peer_id( types.PeerChannel(fwd.channel_id))) - self._init = True def __new__(cls, client, original, entities, input_chat): if isinstance(original, types.Message): @@ -53,15 +55,6 @@ class Message: else: return cls - def __getattr__(self, item): - return getattr(self.original_message, item) - - def __setattr__(self, name, value): - if not self._init or name in self.__dict__: - self.__dict__[name] = value - else: - setattr(self.original_message, name, value) - def __str__(self): return str(self.original_message)