From 6f4faf7a580c554c7d50267734f7a875e49267fb Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 19 Dec 2020 12:48:08 +0200 Subject: [PATCH] Store Matrix redaction state and ignore deletions of redacted messages --- ..._add_matrix_redaction_state_to_message_.py | 25 +++++++++++++++++++ mautrix_telegram/abstract_user.py | 4 +++ mautrix_telegram/db/message.py | 4 ++- mautrix_telegram/portal/matrix.py | 14 ++++++++--- 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 alembic/versions/7de69cf5809e_add_matrix_redaction_state_to_message_.py diff --git a/alembic/versions/7de69cf5809e_add_matrix_redaction_state_to_message_.py b/alembic/versions/7de69cf5809e_add_matrix_redaction_state_to_message_.py new file mode 100644 index 00000000..15d2ecb0 --- /dev/null +++ b/alembic/versions/7de69cf5809e_add_matrix_redaction_state_to_message_.py @@ -0,0 +1,25 @@ +"""Add Matrix redaction state to message table + +Revision ID: 7de69cf5809e +Revises: 888275d58e57 +Create Date: 2020-12-19 12:39:57.368568 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '7de69cf5809e' +down_revision = '888275d58e57' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.batch_alter_table('message', schema=None) as batch_op: + batch_op.add_column(sa.Column('redacted', sa.Boolean(), server_default=sa.false(), nullable=True)) + + +def downgrade(): + with op.batch_alter_table('message', schema=None) as batch_op: + batch_op.drop_column('redacted') diff --git a/mautrix_telegram/abstract_user.py b/mautrix_telegram/abstract_user.py index 7d8a3e32..dbe71487 100644 --- a/mautrix_telegram/abstract_user.py +++ b/mautrix_telegram/abstract_user.py @@ -420,6 +420,8 @@ class AbstractUser(ABC): for message_id in update.messages: for message in DBMessage.get_all_by_tgid(TelegramID(message_id), self.tgid): + if message.redacted: + continue message.delete() number_left = DBMessage.count_spaces_by_mxid(message.mxid, message.mx_room) if number_left == 0: @@ -433,6 +435,8 @@ class AbstractUser(ABC): for message_id in update.messages: for message in DBMessage.get_all_by_tgid(TelegramID(message_id), channel_id): + if message.redacted: + continue message.delete() await self._try_redact(message) diff --git a/mautrix_telegram/db/message.py b/mautrix_telegram/db/message.py index e39f2a72..a765650a 100644 --- a/mautrix_telegram/db/message.py +++ b/mautrix_telegram/db/message.py @@ -15,7 +15,8 @@ # along with this program. If not, see . from typing import Optional, Iterator, List -from sqlalchemy import Column, UniqueConstraint, Integer, String, and_, func, desc, select +from sqlalchemy import (Column, UniqueConstraint, Integer, String, Boolean, and_, func, desc, + select, false) from mautrix.types import RoomID, EventID from mautrix.util.db import Base @@ -31,6 +32,7 @@ class Message(Base): tgid: TelegramID = Column(Integer, primary_key=True) tg_space: TelegramID = Column(Integer, primary_key=True) edit_index: int = Column(Integer, primary_key=True) + redacted: bool = Column(Boolean, server_default=false()) __table_args__ = (UniqueConstraint("mxid", "mx_room", "tg_space", name="_mx_id_room_2"),) diff --git a/mautrix_telegram/portal/matrix.py b/mautrix_telegram/portal/matrix.py index 2bdccafb..e1276454 100644 --- a/mautrix_telegram/portal/matrix.py +++ b/mautrix_telegram/portal/matrix.py @@ -435,12 +435,18 @@ class PortalMatrix(BasePortal, ABC): space = self.tgid if self.peer_type == "channel" else real_deleter.tgid message = DBMessage.get_by_mxid(event_id, self.mxid, space) if not message: - return - if message.edit_index == 0: + self.log.trace(f"Ignoring Matrix redaction of unknown event {event_id}") + elif message.redacted: + self.log.debug("Ignoring Matrix redaction of already redacted event " + f"{message.mxid} in {message.mx_room}") + elif message.edit_index != 0: + message.edit(redacted=True) + self.log.debug("Ignoring Matrix redaction of edit event " + f"{message.mxid} in {message.mx_room}") + else: + message.edit(redacted=True) await real_deleter.client.delete_messages(self.peer, [message.tgid]) await self._send_delivery_receipt(redaction_event_id) - else: - self.log.debug(f"Ignoring deletion of edit event {message.mxid} in {message.mx_room}") async def _update_telegram_power_level(self, sender: 'u.User', user_id: TelegramID, level: int) -> None: