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 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)
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
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"),)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user