Sfoglia il codice sorgente

contact info: update on startup

Signed-off-by: Sumner Evans <sumner@beeper.com>
Sumner Evans 2 anni fa
parent
commit
c1ba767955
3 ha cambiato i file con 33 aggiunte e 14 eliminazioni
  1. 6 0
      mautrix_instagram/db/puppet.py
  2. 23 14
      mautrix_instagram/puppet.py
  3. 4 0
      mautrix_instagram/user.py

+ 6 - 0
mautrix_instagram/db/puppet.py

@@ -115,3 +115,9 @@ class Puppet:
         q = f"SELECT {cls.columns} FROM puppet WHERE custom_mxid IS NOT NULL"
         rows = await cls.db.fetch(q)
         return [cls._from_row(row) for row in rows]
+
+    @classmethod
+    async def get_all(cls) -> list[Puppet]:
+        q = f"SELECT {cls.columns} FROM puppet"
+        rows = await cls.db.fetch(q)
+        return [cls._from_row(row) for row in rows]

+ 23 - 14
mautrix_instagram/puppet.py

@@ -15,7 +15,7 @@
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 from __future__ import annotations
 
-from typing import TYPE_CHECKING, AsyncGenerator, AsyncIterable, Awaitable, cast
+from typing import TYPE_CHECKING, Any, AsyncGenerator, AsyncIterable, Awaitable, cast
 import os.path
 
 from yarl import URL
@@ -128,13 +128,13 @@ class Puppet(DBPuppet, BasePuppet):
         )
 
     async def update_info(self, info: BaseResponseUser, source: u.User) -> None:
-        update = await self._update_contact_info(info)
+        update = await self.update_contact_info(info)
         update = await self._update_name(info) or update
         update = await self._update_avatar(info, source) or update
         if update:
             await self.update()
 
-    async def _update_contact_info(self, info: BaseResponseUser | None = None) -> bool:
+    async def update_contact_info(self, info: BaseResponseUser | None = None) -> bool:
         if not self.bridge.homeserver_software.is_hungry:
             return False
 
@@ -142,17 +142,15 @@ class Puppet(DBPuppet, BasePuppet):
             return False
 
         try:
-            identifiers = []
+            contact_info: dict[str, Any] = {
+                "com.beeper.bridge.remote_id": str(self.igpk),
+                "com.beeper.bridge.service": self.bridge.beeper_service_name,
+                "com.beeper.bridge.network": self.bridge.beeper_network_name,
+            }
             if info and info.username:
-                identifiers.append(f"instagram:{info.username}")
-            await self.default_mxid_intent.beeper_update_profile(
-                {
-                    "com.beeper.bridge.identifiers": identifiers,
-                    "com.beeper.bridge.remote_id": str(self.fbid),
-                    "com.beeper.bridge.service": self.bridge.beeper_service_name,
-                    "com.beeper.bridge.network": self.bridge.beeper_network_name,
-                }
-            )
+                contact_info["com.beeper.bridge.identifiers"] = [f"instagram:{info.username}"]
+
+            await self.default_mxid_intent.beeper_update_profile(contact_info)
             self.contact_info_set = True
         except Exception:
             self.log.exception("Error updating contact info")
@@ -280,7 +278,18 @@ class Puppet(DBPuppet, BasePuppet):
     async def all_with_custom_mxid(cls) -> AsyncGenerator[Puppet, None]:
         puppets = await super().all_with_custom_mxid()
         puppet: cls
-        for index, puppet in enumerate(puppets):
+        for puppet in puppets:
+            try:
+                yield cls.by_pk[puppet.pk]
+            except KeyError:
+                puppet._add_to_cache()
+                yield puppet
+
+    @classmethod
+    async def get_all(cls) -> AsyncGenerator[Puppet, None]:
+        puppets = await super().get_all()
+        puppet: cls
+        for puppet in puppets:
             try:
                 yield cls.by_pk[puppet.pk]
             except KeyError:

+ 4 - 0
mautrix_instagram/user.py

@@ -318,6 +318,10 @@ class User(DBUser, BaseUser):
                 self._thread_sync_task.cancel()
             self._thread_sync_task = asyncio.create_task(self.backfill_threads())
 
+        if self.bridge.homeserver_software.is_hungry:
+            self.log.info("Updating contact info for all users")
+            asyncio.gather(*[puppet.update_contact_info() async for puppet in pu.Puppet.get_all()])
+
     async def _handle_backfill_requests_loop(self) -> None:
         if not self.config["bridge.backfill.enable"] or not self.config["bridge.backfill.msc2716"]:
             return