浏览代码

Update read receipt handling to support receiving EDUs directly

Tulir Asokan 4 年之前
父节点
当前提交
2a0ca533d4
共有 2 个文件被更改,包括 21 次插入22 次删除
  1. 18 22
      mautrix_signal/matrix.py
  2. 3 0
      mautrix_signal/user.py

+ 18 - 22
mautrix_signal/matrix.py

@@ -86,28 +86,24 @@ class MatrixHandler(BaseMatrixHandler):
                                             content.relates_to.key)
 
     async def handle_receipt(self, evt: ReceiptEvent) -> None:
-        # These events come from custom puppet syncing, so there's always only one user.
-        try:
-            event_id, receipts = evt.content.popitem()
-            user_id, data = receipts[ReceiptType.READ].popitem()
-        except KeyError:
-            return
-
-        user = await u.User.get_by_mxid(user_id, create=False)
-        if not user or not user.username:
-            return
-
-        portal = await po.Portal.get_by_mxid(evt.room_id)
-        if not portal:
-            return
-
-        message = await DBMessage.get_by_mxid(event_id, portal.mxid)
-        if not message:
-            return
-
-        user.log.trace(f"Sending read receipt for {message.timestamp} to {message.sender}")
-        await self.signal.send_receipt(user.username, Address(uuid=message.sender),
-                                       timestamps=[message.timestamp], when=data.ts, read=True)
+        for event_id, receipts in evt.content.items():
+            for user_id, data in receipts[ReceiptType.READ].items():
+                user = await u.User.get_by_mxid(user_id, create=False)
+                if not user or not user.username:
+                    continue
+
+                portal = await po.Portal.get_by_mxid(evt.room_id)
+                if not portal:
+                    continue
+
+                message = await DBMessage.get_by_mxid(event_id, portal.mxid)
+                if not message:
+                    continue
+
+                user.log.trace(f"Sending read receipt for {message.timestamp} to {message.sender}")
+                await self.signal.send_receipt(user.username, Address(uuid=message.sender),
+                                               timestamps=[message.timestamp], when=data.ts,
+                                               read=True)
 
     async def handle_typing(self, room_id: RoomID, typing: List[UserID]) -> None:
         pass

+ 3 - 0
mautrix_signal/user.py

@@ -128,6 +128,9 @@ class User(DBUser, BaseUser):
 
     @classmethod
     async def get_by_mxid(cls, mxid: UserID, create: bool = True) -> Optional['User']:
+        # Never allow ghosts to be users
+        if pu.Puppet.get_id_from_mxid(mxid):
+            return None
         try:
             return cls.by_mxid[mxid]
         except KeyError: