Browse Source

read receipts: send to latest message before receipt ts if eventID is not a message

Signed-off-by: Sumner Evans <sumner@beeper.com>
Sumner Evans 2 years ago
parent
commit
960b58994f
2 changed files with 17 additions and 1 deletions
  1. 13 0
      mautrix_signal/db/message.py
  2. 4 1
      mautrix_signal/matrix.py

+ 13 - 0
mautrix_signal/db/message.py

@@ -138,3 +138,16 @@ class Message:
         if not row:
             return None
         return cls._from_row(row)
+
+    @classmethod
+    async def get_first_before(cls, mx_room: RoomID, timestamp: int) -> Message | None:
+        q = """
+        SELECT mxid, mx_room, sender, timestamp, signal_chat_id, signal_receiver FROM message
+        WHERE mx_room=$1 AND timestamp <= $2
+        ORDER BY timestamp DESC
+        LIMIT 1
+        """
+        row = await cls.db.fetchrow(q, mx_room, timestamp)
+        if not row:
+            return None
+        return cls._from_row(row)

+ 4 - 1
mautrix_signal/matrix.py

@@ -194,8 +194,11 @@ class MatrixHandler(BaseMatrixHandler):
         event_id: EventID,
         data: SingleReceiptEventContent,
     ) -> None:
-        message = await DBMessage.get_by_mxid(event_id, portal.mxid)
+        message = await DBMessage.get_by_mxid(
+            event_id, portal.mxid
+        ) or await DBMessage.get_first_before(portal.mxid, data.ts)
         if not message:
+            user.log.warning("Skipping sending read receipt for event ID: %s", event_id)
             return
 
         user.log.trace(f"Sending read receipt for {message.timestamp} to {message.sender}")