From 566a2b3892145ab2e592334b601aef876bacf9a6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 24 Feb 2018 11:44:49 +0200 Subject: [PATCH] Add join/leave notifications for unauthenticated users. Fixes #81 --- mautrix_telegram/matrix.py | 17 +++++++++-------- mautrix_telegram/portal.py | 22 ++++++++++++++++++---- mautrix_telegram/puppet.py | 1 + 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/mautrix_telegram/matrix.py b/mautrix_telegram/matrix.py index 24ef73b5..819ab690 100644 --- a/mautrix_telegram/matrix.py +++ b/mautrix_telegram/matrix.py @@ -112,7 +112,7 @@ class MatrixHandler: # The rest can probably be ignored self.log.debug(f"{inviter} invited {user} to {room}") - async def handle_join(self, room, user): + async def handle_join(self, room, user, event_id): user = await User.get_by_mxid(user).ensure_started() portal = Portal.get_by_mxid(room) @@ -130,10 +130,10 @@ class MatrixHandler: return self.log.debug(f"{user} joined {room}") - if user.logged_in: - await portal.join_matrix(user) + if user.logged_in or portal.has_bot: + await portal.join_matrix(user, event_id) - async def handle_part(self, room, user, sender): + async def handle_part(self, room, user, sender, event_id): self.log.debug(f"{user} left {room}") sender = User.get_by_mxid(sender, create=False) @@ -153,8 +153,8 @@ class MatrixHandler: if not user: return await user.ensure_started() - if user.logged_in: - await portal.leave_matrix(user, sender) + if user.logged_in or portal.has_bot: + await portal.leave_matrix(user, sender, event_id) def is_command(self, message): text = message.get("body", "") @@ -238,9 +238,10 @@ class MatrixHandler: if membership == "invite": await self.handle_invite(evt["room_id"], evt["state_key"], evt["sender"]) elif membership == "leave": - await self.handle_part(evt["room_id"], evt["state_key"], evt["sender"]) + await self.handle_part(evt["room_id"], evt["state_key"], evt["sender"], + evt["event_id"]) elif membership == "join": - await self.handle_join(evt["room_id"], evt["state_key"]) + await self.handle_join(evt["room_id"], evt["state_key"], evt["event_id"]) elif type == "m.room.message": await self.handle_message(evt["room_id"], evt["sender"], content, evt["event_id"]) elif type == "m.room.redaction": diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index c43070c1..c702db99 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -511,7 +511,14 @@ class Portal: file_name = f"matrix_upload{mimetypes.guess_extension(mime)}" return file_name, None if file_name == body else body - async def leave_matrix(self, user, source): + async def leave_matrix(self, user, source, event_id): + if not user.logged_in: + response = await self.bot.client.send_message_super( + self.peer, f"__{user.displayname} left the room.__") + space = self.tgid if self.peer_type == "channel" else self.bot.tgid + self.is_duplicate(response, (event_id, space)) + return + if self.peer_type == "user": await self.main_intent.leave_room(self.mxid) self.delete() @@ -535,7 +542,14 @@ class Portal: channel = await self.get_input_entity(user) await user.client(LeaveChannelRequest(channel=channel)) - async def join_matrix(self, user): + async def join_matrix(self, user, event_id): + if not user.logged_in: + response = await self.bot.client.send_message_super( + self.peer, f"__{user.displayname} joined the room.__") + space = self.tgid if self.peer_type == "channel" else self.bot.tgid + self.is_duplicate(response, (event_id, space)) + return + if self.peer_type == "channel": await user.client(JoinChannelRequest(channel=await self.get_input_entity(user))) else: @@ -560,10 +574,10 @@ class Portal: if "format" in message and message["format"] == "org.matrix.custom.html": message, entities = formatter.matrix_to_telegram(message["formatted_body"]) return client.send_message(self.peer, message, entities=entities, - reply_to=reply_to) + reply_to=reply_to) else: return client.send_message(self.peer, message["body"], - reply_to=reply_to) + reply_to=reply_to) async def _handle_matrix_file(self, client, message, reply_to): file = await self.main_intent.download_file(message["url"]) diff --git a/mautrix_telegram/puppet.py b/mautrix_telegram/puppet.py index 980c365d..64e2d9c6 100644 --- a/mautrix_telegram/puppet.py +++ b/mautrix_telegram/puppet.py @@ -46,6 +46,7 @@ class Puppet: self._db_instance = db_instance self.intent = self.az.intent.user(self.mxid) + self.logged_in = True self.cache[id] = self