From 9722a1ce6f6400ca976cd1a6161830ed148ece68 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 27 Jan 2018 17:27:44 +0200 Subject: [PATCH] Implement Matrix->Telegram redactions --- README.md | 2 +- mautrix_telegram/db.py | 2 +- mautrix_telegram/matrix.py | 8 ++++++++ mautrix_telegram/portal.py | 8 ++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4368d23f..8fe9c980 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ does not do this automatically. * [ ] Locations (not implemented in Riot) * [x] Images * [x] Files - * [ ] Message redactions + * [x] Message redactions * [ ] Presence (currently always shown as online on Telegram) * [ ] Typing notifications (may not be possible) * [ ] Pinning messages diff --git a/mautrix_telegram/db.py b/mautrix_telegram/db.py index 60ef1369..71f04d9e 100644 --- a/mautrix_telegram/db.py +++ b/mautrix_telegram/db.py @@ -41,7 +41,7 @@ class Message(Base): tgid = Column(Integer, primary_key=True) user = Column(Integer, ForeignKey("user.tgid"), primary_key=True) - __table_args__ = (UniqueConstraint('mxid', 'mx_room', name='_mx_id_room'), ) + __table_args__ = (UniqueConstraint('mxid', 'mx_room', 'user', name='_mx_id_room'), ) class User(Base): diff --git a/mautrix_telegram/matrix.py b/mautrix_telegram/matrix.py index 93c1e5bd..430273ad 100644 --- a/mautrix_telegram/matrix.py +++ b/mautrix_telegram/matrix.py @@ -87,6 +87,12 @@ class MatrixHandler: self.commands.handle(room, sender, command, args, is_management, is_portal=portal is not None) + def handle_redaction(self, room, sender, event_id): + portal = Portal.get_by_mxid(room) + sender = User.get_by_mxid(sender) + if portal: + portal.handle_matrix_deletion(sender, event_id) + def filter_matrix_event(self, event): return event["sender"] == self.az.bot_mxid or self.is_puppet(event["sender"]) @@ -106,3 +112,5 @@ class MatrixHandler: pass elif type == "m.room.message": self.handle_message(evt["room_id"], evt["sender"], content, evt["event_id"]) + elif type == "m.room.redaction": + self.handle_redaction(evt["room_id"], evt["sender"], evt["redacts"]) diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index 5eb7abf7..0216dcf3 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -229,6 +229,14 @@ class Portal: DBMessage(tgid=response.id, mx_room=self.mxid, mxid=event_id, user=sender.tgid)) self.db.commit() + def handle_matrix_deletion(self, deleter, event_id): + message = DBMessage.query.filter(DBMessage.mxid == event_id and + DBMessage.user == deleter.tgid and + DBMessage.mx_room == self.mxid).one_or_none() + if not message: + return + deleter.client.delete_messages(self.peer, [message.tgid]) + # endregion # region Telegram event handling