From ce92cd31bfeae1d2502052a69c4b7b141f78f5fb Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 15 May 2019 20:05:25 +0300 Subject: [PATCH] Fix updating user info from entities attached to updates Also made it trust info from users who don't have the puppet's phone number. --- mautrix_telegram/abstract_user.py | 2 +- mautrix_telegram/puppet.py | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/mautrix_telegram/abstract_user.py b/mautrix_telegram/abstract_user.py index c188874f..6244999e 100644 --- a/mautrix_telegram/abstract_user.py +++ b/mautrix_telegram/abstract_user.py @@ -281,7 +281,7 @@ class AbstractUser(ABC): async def _handle_entity_updates(self, entities: Dict[int, Union[User, Chat, Channel]]) -> None: try: - users = (entity for entity in entities.items() if isinstance(entity, User)) + users = (entity for entity in entities.values() if isinstance(entity, User)) puppets = ((pu.Puppet.get(TelegramID(user.id)), user) for user in users) await asyncio.gather(*[puppet.update_info(self, info) for puppet, info in puppets if puppet]) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index cb7d144b..4b2a5937 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -359,19 +359,25 @@ class Puppet: ) -> bool: if self.disable_updates: return False - ignore_source = (not source.is_relaybot - and self.displayname_source is not None - and self.displayname_source != source.tgid) - if ignore_source: + is_main_source = (source.is_relaybot or (self.displayname_source is not None + and self.displayname_source != source.tgid)) + # No phone -> not in contact list -> can't set custom name -> name is trustworthy + is_trustworthy_source = isinstance(info, User) and info.phone is None + if not is_main_source and not is_trustworthy_source: return False - if isinstance(info, UpdateUserName): + elif isinstance(info, UpdateUserName): info = await source.client.get_entity(PeerUser(self.tgid)) displayname = self.get_displayname(info) if displayname != self.displayname: - await self.default_mxid_intent.set_display_name(displayname) self.displayname = displayname self.displayname_source = source.tgid + try: + await self.default_mxid_intent.set_display_name(displayname) + except MatrixRequestError: + self.log.exception("Failed to set displayname") + self.displayname = "" + self.displayname_source = None return True elif source.is_relaybot or self.displayname_source is None: self.displayname_source = source.tgid @@ -386,8 +392,12 @@ class Puppet: file = await util.transfer_file_to_matrix(source.client, self.default_mxid_intent, photo) if file: - await self.default_mxid_intent.set_avatar(file.mxc) self.photo_id = photo_id + try: + await self.default_mxid_intent.set_avatar(file.mxc) + except MatrixRequestError: + self.log.exception("Failed to set avatar") + self.photo_id = "" return True return False