diff --git a/mautrix_telegram/portal/base.py b/mautrix_telegram/portal/base.py index 6dc32b32..086f25be 100644 --- a/mautrix_telegram/portal/base.py +++ b/mautrix_telegram/portal/base.py @@ -136,6 +136,18 @@ class BasePortal(ABC): return str(self.tgid) return f"{self.tg_receiver}<->{self.tgid}" + @property + def alias(self) -> Optional[RoomAlias]: + if not self.username: + return None + return RoomAlias(f"#{self.alias_localpart}:{self.hs_domain}") + + @property + def alias_localpart(self) -> Optional[str]: + if not self.username: + return None + return self.alias_template.format(self.username) + @property def peer(self) -> Union[TypePeer, TypeInputPeer]: if self.peer_type == "user": @@ -261,13 +273,17 @@ class BasePortal(ABC): authenticated.append(user) return authenticated - @staticmethod - async def cleanup_room(intent: IntentAPI, room_id: RoomID, message: str = "Portal deleted", - puppets_only: bool = False) -> None: + async def cleanup_room(self, intent: IntentAPI, room_id: RoomID, + message: str = "Portal deleted", puppets_only: bool = False) -> None: try: members = await intent.get_room_members(room_id) except MatrixRequestError: members = [] + if self.username: + try: + await intent.remove_room_alias(self.alias_localpart) + except (MatrixRequestError, IntentError): + self.log.warning("Failed to remove alias when cleaning up room", exc_info=True) for user in members: puppet = p.Puppet.get_by_mxid(UserID(user), create=False) if user != intent.mxid and (not puppets_only or puppet): @@ -278,7 +294,10 @@ class BasePortal(ABC): await intent.kick_user(room_id, user, message) except (MatrixRequestError, IntentError): pass - await intent.leave_room(room_id) + try: + await intent.leave_room(room_id) + except (MatrixRequestError, IntentError): + self.log.warning("Failed to leave room when cleaning up room", exc_info=True) async def unbridge(self) -> None: await self.cleanup_room(self.main_intent, self.mxid, "Room unbridged", puppets_only=True) diff --git a/mautrix_telegram/portal/metadata.py b/mautrix_telegram/portal/metadata.py index 12e366c0..7c6ef837 100644 --- a/mautrix_telegram/portal/metadata.py +++ b/mautrix_telegram/portal/metadata.py @@ -278,8 +278,8 @@ class PortalMetadata(BasePortal, ABC): if self.peer_type == "channel" and entity.username: preset = RoomCreatePreset.PUBLIC - alias = self._get_alias_localpart(entity.username) self.username = entity.username + alias = self.alias_localpart else: preset = RoomCreatePreset.PRIVATE # TODO invite link alias? @@ -438,18 +438,6 @@ class PortalMetadata(BasePortal, ABC): if self._participants_to_power_levels(participants, levels): await self.main_intent.set_power_levels(self.mxid, levels) - @property - def alias(self) -> Optional[RoomAlias]: - if not self.username: - return None - return RoomAlias(f"#{self._get_alias_localpart()}:{self.hs_domain}") - - def _get_alias_localpart(self, username: Optional[str] = None) -> Optional[str]: - username = username or self.username - if not username: - return None - return self.alias_template.format(username) - def _add_bot_chat(self, bot: User) -> None: if self.bot and bot.id == self.bot.tgid: self.bot.add_chat(self.tgid, self.peer_type) @@ -584,11 +572,10 @@ class PortalMetadata(BasePortal, ABC): return False if self.username: - await self.main_intent.remove_room_alias(self._get_alias_localpart()) + await self.main_intent.remove_room_alias(self.alias_localpart) self.username = username or None if self.username: - await self.main_intent.add_room_alias(self.mxid, self._get_alias_localpart(), - override=True) + await self.main_intent.add_room_alias(self.mxid, self.alias_localpart, override=True) if self.public_portals: await self.main_intent.set_join_rule(self.mxid, "public") else: