diff --git a/mautrix_telegram/matrix.py b/mautrix_telegram/matrix.py index 3d04e531..3c6b1997 100644 --- a/mautrix_telegram/matrix.py +++ b/mautrix_telegram/matrix.py @@ -196,9 +196,10 @@ class MatrixHandler: return puppet = pu.Puppet.get_by_mxid(user_id) - if sender and puppet: - # TODO: Puppet should probably be an AbstractUser - await portal.leave_matrix(puppet, sender, event_id) + if puppet: + if sender: + await portal.kick_matrix(puppet, sender) + return user = u.User.get_by_mxid(user_id, create=False) if not user: diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index 1b145f8f..7fbbdec4 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -792,8 +792,24 @@ class Portal: else: await user.client(ReadMessageHistoryRequest(peer=self.peer, max_id=message.tgid)) - async def leave_matrix(self, user: 'u.User', source: 'u.User', event_id: MatrixEventID - ) -> None: + async def kick_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User') -> None: + if user.tgid == source.tgid: + return + if await user.needs_relaybot(self): + user = self.bot + if not user: + return + if self.peer_type == "chat": + await source.client(DeleteChatUserRequest(chat_id=self.tgid, user_id=user.tgid)) + elif self.peer_type == "channel": + channel = await self.get_input_entity(source) + rights = ChannelBannedRights(datetime.fromtimestamp(0), True) + await source.client(EditBannedRequest(channel=channel, + user_id=user.tgid, + banned_rights=rights)) + + async def leave_matrix(self, user: 'u.User', source: 'u.User', + event_id: MatrixEventID) -> None: if await user.needs_relaybot(self): async with self.require_send_lock(self.bot.tgid): message = await self._get_state_change_message("leave", user) @@ -815,14 +831,7 @@ class Portal: except KeyError: pass elif source and source.tgid != user.tgid: - if self.peer_type == "chat": - await source.client(DeleteChatUserRequest(chat_id=self.tgid, user_id=user.tgid)) - else: - channel = await self.get_input_entity(source) - rights = ChannelBannedRights(datetime.fromtimestamp(0), True) - await source.client(EditBannedRequest(channel=channel, - user_id=user.tgid, - banned_rights=rights)) + await self.kick_matrix(user, source) elif self.peer_type == "chat": await user.client(DeleteChatUserRequest(chat_id=self.tgid, user_id=InputUserSelf())) elif self.peer_type == "channel":