Store Matrix redaction state and ignore deletions of redacted messages
This commit is contained in:
@@ -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')
|
||||||
@@ -420,6 +420,8 @@ class AbstractUser(ABC):
|
|||||||
|
|
||||||
for message_id in update.messages:
|
for message_id in update.messages:
|
||||||
for message in DBMessage.get_all_by_tgid(TelegramID(message_id), self.tgid):
|
for message in DBMessage.get_all_by_tgid(TelegramID(message_id), self.tgid):
|
||||||
|
if message.redacted:
|
||||||
|
continue
|
||||||
message.delete()
|
message.delete()
|
||||||
number_left = DBMessage.count_spaces_by_mxid(message.mxid, message.mx_room)
|
number_left = DBMessage.count_spaces_by_mxid(message.mxid, message.mx_room)
|
||||||
if number_left == 0:
|
if number_left == 0:
|
||||||
@@ -433,6 +435,8 @@ class AbstractUser(ABC):
|
|||||||
|
|
||||||
for message_id in update.messages:
|
for message_id in update.messages:
|
||||||
for message in DBMessage.get_all_by_tgid(TelegramID(message_id), channel_id):
|
for message in DBMessage.get_all_by_tgid(TelegramID(message_id), channel_id):
|
||||||
|
if message.redacted:
|
||||||
|
continue
|
||||||
message.delete()
|
message.delete()
|
||||||
await self._try_redact(message)
|
await self._try_redact(message)
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
from typing import Optional, Iterator, List
|
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.types import RoomID, EventID
|
||||||
from mautrix.util.db import Base
|
from mautrix.util.db import Base
|
||||||
@@ -31,6 +32,7 @@ class Message(Base):
|
|||||||
tgid: TelegramID = Column(Integer, primary_key=True)
|
tgid: TelegramID = Column(Integer, primary_key=True)
|
||||||
tg_space: TelegramID = Column(Integer, primary_key=True)
|
tg_space: TelegramID = Column(Integer, primary_key=True)
|
||||||
edit_index: int = 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"),)
|
__table_args__ = (UniqueConstraint("mxid", "mx_room", "tg_space", name="_mx_id_room_2"),)
|
||||||
|
|
||||||
|
|||||||
@@ -435,12 +435,18 @@ class PortalMatrix(BasePortal, ABC):
|
|||||||
space = self.tgid if self.peer_type == "channel" else real_deleter.tgid
|
space = self.tgid if self.peer_type == "channel" else real_deleter.tgid
|
||||||
message = DBMessage.get_by_mxid(event_id, self.mxid, space)
|
message = DBMessage.get_by_mxid(event_id, self.mxid, space)
|
||||||
if not message:
|
if not message:
|
||||||
return
|
self.log.trace(f"Ignoring Matrix redaction of unknown event {event_id}")
|
||||||
if message.edit_index == 0:
|
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 real_deleter.client.delete_messages(self.peer, [message.tgid])
|
||||||
await self._send_delivery_receipt(redaction_event_id)
|
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,
|
async def _update_telegram_power_level(self, sender: 'u.User', user_id: TelegramID,
|
||||||
level: int) -> None:
|
level: int) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user