瀏覽代碼

Add support for Matrix->Signal redactions

Tulir Asokan 3 年之前
父節點
當前提交
86d05fa837
共有 3 個文件被更改,包括 22 次插入5 次删除
  1. 1 1
      ROADMAP.md
  2. 11 3
      mausignald/signald.py
  3. 10 1
      mautrix_signal/portal.py

+ 1 - 1
ROADMAP.md

@@ -13,7 +13,7 @@
       * [ ] Locations
       * [ ] Stickers
   * [x] Message reactions
-  * [ ] Message redactions
+  * [x] Message redactions
   * [x] Group info changes
     * [x] Name
     * [x] Avatar

+ 11 - 3
mausignald/signald.py

@@ -118,17 +118,25 @@ class SignaldClient(SignaldRPCClient):
         return Account.deserialize(resp)
 
     @staticmethod
-    def _recipient_to_args(recipient: Union[Address, GroupID]) -> Dict[str, Any]:
+    def _recipient_to_args(recipient: Union[Address, GroupID], simple_name: bool = False
+                           ) -> Dict[str, Any]:
         if isinstance(recipient, Address):
-            return {"recipientAddress": recipient.serialize()}
+            recipient = recipient.serialize()
+            field_name = "address" if simple_name else "recipientAddress"
         else:
-            return {"recipientGroupId": recipient}
+            field_name = "group" if simple_name else "recipientGroupId"
+        return {field_name: recipient}
 
     async def react(self, username: str, recipient: Union[Address, GroupID],
                     reaction: Reaction) -> None:
         await self.request_v1("react", username=username, reaction=reaction.serialize(),
                               **self._recipient_to_args(recipient))
 
+    async def remote_delete(self, username: str, recipient: Union[Address, GroupID], timestamp: int
+                            ) -> None:
+        await self.request_v1("remote_delete", account=username, timestamp=timestamp,
+                              **self._recipient_to_args(recipient, simple_name=True))
+
     async def send(self, username: str, recipient: Union[Address, GroupID], body: str,
                    quote: Optional[Quote] = None, attachments: Optional[List[Attachment]] = None,
                    mentions: Optional[List[Mention]] = None, timestamp: Optional[int] = None

+ 10 - 1
mautrix_signal/portal.py

@@ -338,7 +338,16 @@ class Portal(DBPortal, BasePortal):
         if not self.mxid or not await sender.is_logged_in():
             return
 
-        # TODO message redactions after https://gitlab.com/signald/signald/-/issues/37
+        message = await DBMessage.get_by_mxid(event_id, self.mxid)
+        if message:
+            try:
+                await message.delete()
+                await self.signal.remote_delete(sender.username, recipient=self.chat_id,
+                                                timestamp=message.timestamp)
+                await self._send_delivery_receipt(redaction_event_id)
+                self.log.trace(f"Removed {message} after Matrix redaction")
+            except Exception:
+                self.log.exception("Removing message failed")
 
         reaction = await DBReaction.get_by_mxid(event_id, self.mxid)
         if reaction: