Implement Matrix->Telegram redactions
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user