From eace9b4ef6d3abdd5b7a9579f1097a966705498a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 2 Aug 2020 00:54:16 +0300 Subject: [PATCH] Unregister old chat when a group is upgraded --- mautrix_telegram/abstract_user.py | 8 +++++--- mautrix_telegram/bot.py | 4 ++-- mautrix_telegram/portal/metadata.py | 4 ++-- mautrix_telegram/user.py | 6 ++++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mautrix_telegram/abstract_user.py b/mautrix_telegram/abstract_user.py index 8e8c0786..d390c244 100644 --- a/mautrix_telegram/abstract_user.py +++ b/mautrix_telegram/abstract_user.py @@ -186,7 +186,7 @@ class AbstractUser(ABC): raise NotImplementedError() @abstractmethod - def unregister_portal(self, portal: po.Portal) -> None: + def unregister_portal(self, tgid: int, tg_receiver: int) -> None: raise NotImplementedError() async def _update_catch(self, update: TypeUpdate) -> None: @@ -459,8 +459,10 @@ class AbstractUser(ABC): if isinstance(update, MessageService): if isinstance(update.action, MessageActionChannelMigrateFrom): - self.log.trace(f"Ignoring action %s to %s by %d", update.action, portal.tgid_log, - sender.id) + self.log.trace(f"Received %s in %s by %d, unregistering portal...", + update.action, portal.tgid_log, sender.id) + self.unregister_portal(update.action.chat_id, update.action.chat_id) + self.register_portal(portal) return self.log.trace("Handling action %s to %s by %d", update.action, portal.tgid_log, sender.id) diff --git a/mautrix_telegram/bot.py b/mautrix_telegram/bot.py index b7645048..9c4e447e 100644 --- a/mautrix_telegram/bot.py +++ b/mautrix_telegram/bot.py @@ -120,8 +120,8 @@ class Bot(AbstractUser): def register_portal(self, portal: po.Portal) -> None: self.add_chat(portal.tgid, portal.peer_type) - def unregister_portal(self, portal: po.Portal) -> None: - self.remove_chat(portal.tgid) + def unregister_portal(self, tgid: int, tg_receiver: int) -> None: + self.remove_chat(tgid) def add_chat(self, chat_id: TelegramID, chat_type: str) -> None: if chat_id not in self.chats: diff --git a/mautrix_telegram/portal/metadata.py b/mautrix_telegram/portal/metadata.py index 8393a71a..4a5ed114 100644 --- a/mautrix_telegram/portal/metadata.py +++ b/mautrix_telegram/portal/metadata.py @@ -587,7 +587,7 @@ class PortalMetadata(BasePortal, ABC): continue mx_user = u.User.get_by_mxid(user_mxid, create=False) if mx_user and mx_user.is_bot and mx_user.tgid not in allowed_tgids: - mx_user.unregister_portal(self) + mx_user.unregister_portal(*self.tgid_full) if mx_user and not self.has_bot and mx_user.tgid not in allowed_tgids: try: @@ -624,7 +624,7 @@ class PortalMetadata(BasePortal, ABC): else: await puppet.intent_for(self).leave_room(self.mxid) if user: - user.unregister_portal(self) + user.unregister_portal(*self.tgid_full) if sender.tgid != puppet.tgid: try: await sender.intent_for(self).kick_user(self.mxid, puppet.mxid) diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py index 63dc0f14..81458355 100644 --- a/mautrix_telegram/user.py +++ b/mautrix_telegram/user.py @@ -372,6 +372,7 @@ class User(AbstractUser, BaseUser): self.log.debug("Dialog syncing complete") def register_portal(self, portal: po.Portal) -> None: + self.log.trace(f"Registering portal {portal.tgid_full}") try: if self.portals[portal.tgid_full] == portal: return @@ -380,9 +381,10 @@ class User(AbstractUser, BaseUser): self.portals[portal.tgid_full] = portal self.save(portals=True) - def unregister_portal(self, portal: po.Portal) -> None: + def unregister_portal(self, tgid: int, tg_receiver: int) -> None: + self.log.trace(f"Unregistering portal {(tgid, tg_receiver)}") try: - del self.portals[portal.tgid_full] + del self.portals[(tgid, tg_receiver)] self.save(portals=True) except KeyError: pass