Add join/leave notifications for unauthenticated users. Fixes #81

This commit is contained in:
Tulir Asokan
2018-02-24 11:44:49 +02:00
parent 9e5cb84140
commit 566a2b3892
3 changed files with 28 additions and 12 deletions
+9 -8
View File
@@ -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":
+18 -4
View File
@@ -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"])
+1
View File
@@ -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