瀏覽代碼

Fetch v2 group info when receiving message

Tulir Asokan 4 年之前
父節點
當前提交
79f17909b5
共有 3 個文件被更改,包括 16 次插入8 次删除
  1. 6 0
      mausignald/signald.py
  2. 1 0
      mausignald/types.py
  3. 9 8
      mautrix_signal/signal.py

+ 6 - 0
mausignald/signald.py

@@ -159,6 +159,12 @@ class SignaldClient(SignaldRPCClient):
         return ([Group.deserialize(group) for group in resp["groups"]]
                 + [GroupV2.deserialize(group) for group in resp["groupsv2"]])
 
+    async def get_group(self, username: str, group_id: GroupID) -> Optional[GroupV2]:
+        resp = await self.request("get_group", "get_group", account=username, groupID=group_id)
+        if "id" not in resp:
+            return None
+        return GroupV2.deserialize(resp)
+
     async def get_profile(self, username: str, address: Address) -> Optional[Profile]:
         try:
             resp = await self.request("get_profile", "profile", username=username,

+ 1 - 0
mausignald/types.py

@@ -125,6 +125,7 @@ class GroupV2(GroupV2ID, SerializableAttrs['GroupV2']):
     requesting_members: List[Address] = attr.ib(factory=lambda: [],
                                                 metadata={"json": "requestingMembers"})
     master_key: Optional[str] = attr.ib(default=None, metadata={"json": "masterKey"})
+    invite_link: Optional[str] = attr.ib(default=None, metadata={"json": "inviteLink"})
     timer: Optional[int] = None
 
 

+ 9 - 8
mautrix_signal/signal.py

@@ -70,15 +70,16 @@ class SignalHandler(SignaldClient):
         user = await u.User.get_by_username(evt.username)
         user.on_listen(evt)
 
-    @staticmethod
-    async def handle_message(user: 'u.User', sender: 'pu.Puppet', msg: MessageData,
+    async def handle_message(self, user: 'u.User', sender: 'pu.Puppet', msg: MessageData,
                              addr_override: Optional[Address] = None) -> None:
+        group_v2_info = None
         if msg.group_v2:
-            portal = await po.Portal.get_by_chat_id(msg.group_v2.id, create=False)
-            # TODO get group info for missing v2 groups and create portal when necessary
-            if not portal:
-                user.log.debug(f"Dropping message in unknown v2 group {msg.group_v2.id}")
-                return
+            portal = await po.Portal.get_by_chat_id(msg.group_v2.id, create=True)
+            if not portal.mxid:
+                group_v2_info = await self.get_group(user.username, msg.group_v2.id)
+                if not group_v2_info:
+                    user.log.debug(f"Dropping message in unknown v2 group {msg.group_v2.id}")
+                    return
         elif msg.group:
             portal = await po.Portal.get_by_chat_id(msg.group.group_id, create=True)
         else:
@@ -89,7 +90,7 @@ class SignalHandler(SignaldClient):
                                  " double puppeting enabled")
                 return
         if not portal.mxid:
-            await portal.create_matrix_room(user, (msg.group_v2 or msg.group
+            await portal.create_matrix_room(user, (group_v2_info or msg.group
                                                    or addr_override or sender.address))
         if msg.reaction:
             await portal.handle_signal_reaction(sender, msg.reaction)