فهرست منبع

Check both client_contexts for link messages

Tulir Asokan 3 سال پیش
والد
کامیت
1684bd274f
1فایلهای تغییر یافته به همراه27 افزوده شده و 15 حذف شده
  1. 27 15
      mautrix_instagram/portal.py

+ 27 - 15
mautrix_instagram/portal.py

@@ -474,8 +474,8 @@ class Portal(DBPortal, BasePortal):
                 event_type=EventType.ROOM_MESSAGE,
                 event_type=EventType.ROOM_MESSAGE,
                 message_type=message.msgtype,
                 message_type=message.msgtype,
             )
             )
-            await self._send_delivery_receipt(event_id)
             self._msgid_dedup.appendleft(resp.payload.item_id)
             self._msgid_dedup.appendleft(resp.payload.item_id)
+            await self._send_delivery_receipt(event_id)
             try:
             try:
                 await DBMessage(
                 await DBMessage(
                     mxid=event_id,
                     mxid=event_id,
@@ -1114,43 +1114,52 @@ class Portal(DBPortal, BasePortal):
     async def _handle_instagram_item(
     async def _handle_instagram_item(
         self, source: u.User, sender: p.Puppet, item: ThreadItem, is_backfill: bool = False
         self, source: u.User, sender: p.Puppet, item: ThreadItem, is_backfill: bool = False
     ) -> None:
     ) -> None:
-        if not item.client_context and item.link and item.link.client_context:
-            item.client_context = item.link.client_context
         if not isinstance(item, ThreadItem):
         if not isinstance(item, ThreadItem):
             # Parsing these items failed, they should have been logged already
             # Parsing these items failed, they should have been logged already
             return
             return
 
 
-        if item.client_context in self._reqid_dedup:
+        client_context = item.client_context
+        link_client_context = item.link.client_context if item.link else None
+        cc = client_context
+        if link_client_context:
+            if not client_context:
+                cc = f"link:{link_client_context}"
+            elif client_context != link_client_context:
+                cc = f"{client_context}/link:{link_client_context}"
+        if client_context and client_context in self._reqid_dedup:
             self.log.debug(
             self.log.debug(
-                f"Ignoring message {item.item_id} ({item.client_context}) by "
-                f"{item.user_id} as it was sent by us (client_context in dedup queue)"
+                f"Ignoring message {item.item_id} ({cc}) by {item.user_id}"
+                " as it was sent by us (client_context in dedup queue)"
+            )
+            return
+        elif link_client_context and link_client_context in self._reqid_dedup:
+            self.log.debug(
+                f"Ignoring message {item.item_id} ({cc}) by {item.user_id}"
+                " as it was sent by us (link.client_context in dedup queue)"
             )
             )
             return
             return
 
 
         if item.item_id in self._msgid_dedup:
         if item.item_id in self._msgid_dedup:
             self.log.debug(
             self.log.debug(
-                f"Ignoring message {item.item_id} ({item.client_context}) by "
-                f"{item.user_id} as it was already handled (message.id in dedup queue)"
+                f"Ignoring message {item.item_id} ({cc}) by {item.user_id}"
+                " as it was already handled (message.id in dedup queue)"
             )
             )
             return
             return
         self._msgid_dedup.appendleft(item.item_id)
         self._msgid_dedup.appendleft(item.item_id)
 
 
         if await DBMessage.get_by_item_id(item.item_id, self.receiver) is not None:
         if await DBMessage.get_by_item_id(item.item_id, self.receiver) is not None:
             self.log.debug(
             self.log.debug(
-                f"Ignoring message {item.item_id} ({item.client_context}) by "
-                f"{item.user_id} as it was already handled (message.id in database)"
+                f"Ignoring message {item.item_id} ({cc}) by {item.user_id}"
+                " as it was already handled (message.id in database)"
             )
             )
             return
             return
 
 
+        self.log.debug(f"Starting handling of message {item.item_id} ({cc}) by {item.user_id}")
         await self._handle_deduplicated_instagram_item(source, sender, item, is_backfill)
         await self._handle_deduplicated_instagram_item(source, sender, item, is_backfill)
 
 
     async def _handle_deduplicated_instagram_item(
     async def _handle_deduplicated_instagram_item(
         self, source: u.User, sender: p.Puppet, item: ThreadItem, is_backfill: bool = False
         self, source: u.User, sender: p.Puppet, item: ThreadItem, is_backfill: bool = False
     ) -> None:
     ) -> None:
-        self.log.debug(
-            f"Starting handling of message {item.item_id} ({item.client_context}) "
-            f"by {item.user_id}"
-        )
         if self.backfill_lock.locked and sender.need_backfill_invite(self):
         if self.backfill_lock.locked and sender.need_backfill_invite(self):
             self.log.debug("Adding %s's default puppet to room for backfilling", sender.mxid)
             self.log.debug("Adding %s's default puppet to room for backfilling", sender.mxid)
             if self.is_direct:
             if self.is_direct:
@@ -1195,11 +1204,14 @@ class Portal(DBPortal, BasePortal):
             self.log.debug(f"Unhandled Instagram message {item.item_id}")
             self.log.debug(f"Unhandled Instagram message {item.item_id}")
             event_id = await self._send_instagram_unhandled(intent, item)
             event_id = await self._send_instagram_unhandled(intent, item)
 
 
+        cc = item.client_context
+        if not cc and item.link.client_context:
+            cc = item.link.client_context
         msg = DBMessage(
         msg = DBMessage(
             mxid=event_id,
             mxid=event_id,
             mx_room=self.mxid,
             mx_room=self.mxid,
             item_id=item.item_id,
             item_id=item.item_id,
-            client_context=item.client_context,
+            client_context=cc,
             receiver=self.receiver,
             receiver=self.receiver,
             sender=sender.pk,
             sender=sender.pk,
             ig_timestamp=item.timestamp,
             ig_timestamp=item.timestamp,