Store message sender in database

This commit is contained in:
Tulir Asokan
2022-08-14 13:05:58 +03:00
parent 624c72fa99
commit 89294c57d8
4 changed files with 105 additions and 11 deletions
+22 -4
View File
@@ -20,7 +20,7 @@ from typing import TYPE_CHECKING, ClassVar
from asyncpg import Record
from attr import dataclass
from mautrix.types import EventID, RoomID
from mautrix.types import EventID, RoomID, UserID
from mautrix.util.async_db import Database, Scheme
from ..types import TelegramID
@@ -39,6 +39,8 @@ class Message:
edit_index: int
redacted: bool = False
content_hash: bytes | None = None
sender_mxid: UserID | None = None
sender: TelegramID | None = None
@classmethod
def _from_row(cls, row: Record | None) -> Message | None:
@@ -46,7 +48,19 @@ class Message:
return None
return cls(**row)
columns: ClassVar[str] = "mxid, mx_room, tgid, tg_space, edit_index, redacted, content_hash"
columns: ClassVar[str] = ", ".join(
(
"mxid",
"mx_room",
"tgid",
"tg_space",
"edit_index",
"redacted",
"content_hash",
"sender_mxid",
"sender",
)
)
@classmethod
async def get_all_by_tgid(cls, tgid: TelegramID, tg_space: TelegramID) -> list[Message]:
@@ -158,12 +172,16 @@ class Message:
self.edit_index,
self.redacted,
self.content_hash,
self.sender_mxid,
self.sender,
)
async def insert(self) -> None:
q = """
INSERT INTO message (mxid, mx_room, tgid, tg_space, edit_index, redacted, content_hash)
VALUES ($1, $2, $3, $4, $5, $6, $7)
INSERT INTO message (
mxid, mx_room, tgid, tg_space, edit_index, redacted, content_hash,
sender_mxid, sender
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
"""
await self.db.execute(q, *self._values)
+1
View File
@@ -14,4 +14,5 @@ from . import (
v09_puppet_username_index,
v10_more_backfill_fields,
v11_backfill_queue,
v12_message_sender,
)
@@ -0,0 +1,24 @@
# mautrix-telegram - A Matrix-Telegram puppeting bridge
# Copyright (C) 2022 Tulir Asokan
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from mautrix.util.async_db import Connection
from . import upgrade_table
@upgrade_table.register(description="Store sender in message table")
async def upgrade_v12(conn: Connection) -> None:
await conn.execute("ALTER TABLE message ADD COLUMN sender_mxid TEXT")
await conn.execute("ALTER TABLE message ADD COLUMN sender BIGINT")
+58 -7
View File
@@ -1598,7 +1598,14 @@ class Portal(DBPortal, BasePortal):
link_preview=lp,
)
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, -1, resp, content.msgtype
sender,
sender_id,
EventType.ROOM_MESSAGE,
event_id,
space,
-1,
resp,
content.msgtype,
)
return
response = await client.send_message(
@@ -1609,7 +1616,14 @@ class Portal(DBPortal, BasePortal):
link_preview=lp,
)
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, 0, response, content.msgtype
sender,
sender_id,
EventType.ROOM_MESSAGE,
event_id,
space,
0,
response,
content.msgtype,
)
async def _handle_matrix_file(
@@ -1736,12 +1750,20 @@ class Portal(DBPortal, BasePortal):
raise
else:
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, 0, response, content.msgtype
sender,
sender_id,
EventType.ROOM_MESSAGE,
event_id,
space,
0,
response,
content.msgtype,
)
async def _matrix_document_edit(
self,
sender: u.User,
sender_tgid: TelegramID,
client: MautrixTelegramClient,
content: MessageEventContent,
space: TelegramID,
@@ -1761,7 +1783,14 @@ class Portal(DBPortal, BasePortal):
file=media,
)
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, -1, response, content.msgtype
sender,
sender_tgid,
EventType.ROOM_MESSAGE,
event_id,
space,
-1,
response,
content.msgtype,
)
return True
return False
@@ -1792,7 +1821,7 @@ class Portal(DBPortal, BasePortal):
async with self.send_lock(sender_id):
if await self._matrix_document_edit(
sender, client, content, space, caption, media, event_id
sender, sender_id, client, content, space, caption, entities, media, event_id
):
return
try:
@@ -1803,12 +1832,20 @@ class Portal(DBPortal, BasePortal):
raise
else:
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, 0, response, content.msgtype
sender,
sender_id,
EventType.ROOM_MESSAGE,
event_id,
space,
0,
response,
content.msgtype,
)
async def _mark_matrix_handled(
self,
sender: u.User,
sender_tgid: TelegramID,
event_type: EventType,
event_id: EventID,
space: TelegramID,
@@ -1828,6 +1865,8 @@ class Portal(DBPortal, BasePortal):
mxid=event_id,
edit_index=edit_index,
content_hash=event_hash,
sender_mxid=sender.mxid,
sender=sender_tgid,
).insert()
sender.send_remote_checkpoint(
MessageSendCheckpointStatus.SUCCESS,
@@ -1985,7 +2024,14 @@ class Portal(DBPortal, BasePortal):
return False
else:
await self._mark_matrix_handled(
sender, EventType.ROOM_MESSAGE, event_id, space, 0, response[0], msgtype
sender,
sender.tgid,
EventType.ROOM_MESSAGE,
event_id,
space,
0,
response[0],
msgtype,
)
return True
@@ -2427,6 +2473,7 @@ class Portal(DBPortal, BasePortal):
tgid=TelegramID(evt.id),
edit_index=prev_edit_msg.edit_index + 1,
content_hash=event_hash,
sender=sender.id,
).insert()
return
@@ -2467,6 +2514,7 @@ class Portal(DBPortal, BasePortal):
tgid=TelegramID(evt.id),
edit_index=prev_edit_msg.edit_index + 1,
content_hash=event_hash,
sender=sender.id,
).insert()
await DBMessage.replace_temp_mxid(temporary_identifier, self.mxid, event_id)
@@ -2822,6 +2870,7 @@ class Portal(DBPortal, BasePortal):
tg_space=tg_space,
edit_index=0,
content_hash=event_hash,
sender=sender.id,
).insert()
return
@@ -2899,6 +2948,7 @@ class Portal(DBPortal, BasePortal):
tg_space=tg_space,
edit_index=0,
content_hash=event_hash,
sender=sender.id,
)
await dbm.insert()
await DBMessage.replace_temp_mxid(temporary_identifier, self.mxid, event_id)
@@ -3021,6 +3071,7 @@ class Portal(DBPortal, BasePortal):
mxid=event_id,
tg_space=source.tgid,
edit_index=0,
sender=sender.id,
).insert()
if self.config["bridge.always_read_joined_telegram_notice"]:
double_puppet = await p.Puppet.get_by_tgid(source.tgid)