Преглед изворни кода

Store number in puppet table if found

Tulir Asokan пре 3 година
родитељ
комит
6351530623
2 измењених фајлова са 19 додато и 4 уклоњено
  1. 6 0
      mautrix_signal/db/puppet.py
  2. 13 4
      mautrix_signal/puppet.py

+ 6 - 0
mautrix_signal/db/puppet.py

@@ -76,6 +76,12 @@ class Puppet:
             await conn.execute("UPDATE message SET sender=$1 WHERE sender=$2", uuid, self.number)
             await conn.execute("UPDATE reaction SET author=$1 WHERE author=$2", uuid, self.number)
 
+    async def _set_number(self, number: str) -> None:
+        async with self.db.acquire() as conn, conn.transaction():
+            await conn.execute("DELETE FROM puppet WHERE number=$1 AND uuid<>$2",
+                               number, self.uuid)
+            await conn.execute("UPDATE puppet SET number=$1 WHERE uuid=$2", number, self.uuid)
+
     async def update(self) -> None:
         set_columns = (
             "name=$3, avatar_hash=$4, avatar_url=$5, name_set=$6, avatar_set=$7, "

+ 13 - 4
mautrix_signal/puppet.py

@@ -123,6 +123,14 @@ class Puppet(DBPuppet, BasePuppet):
                 return
             await self._handle_uuid_receive(uuid)
 
+    async def handle_number_receive(self, number: str) -> None:
+        async with self._uuid_lock:
+            if self.number:
+                return
+            self.number = number
+            self.by_number[self.number] = self
+            await self._set_number(number)
+
     async def _handle_uuid_receive(self, uuid: UUID) -> None:
         self.log.debug(f"Found UUID for user: {uuid}")
         user = await u.User.get_by_username(self.number)
@@ -158,10 +166,11 @@ class Puppet(DBPuppet, BasePuppet):
             await self.default_mxid_intent.join_room_by_id(room_id)
 
     async def update_info(self, info: Union[Profile, Contact, Address]) -> None:
-        if isinstance(info, (Contact, Address)):
-            address = info.address if isinstance(info, Contact) else info
-            if address.uuid and not self.uuid:
-                await self.handle_uuid_receive(address.uuid)
+        address = info.address if isinstance(info, (Contact, Profile)) else info
+        if address.uuid and not self.uuid:
+            await self.handle_uuid_receive(address.uuid)
+        if address.number and not self.number:
+            await self.handle_number_receive(address.number)
 
         contact_names = self.config["bridge.contact_list_names"]
         if isinstance(info, Profile) and contact_names != "prefer" and info.profile_name: