Эх сурвалжийг харах

link_wait: use wait_for_scan to have intermediate step on login

Sumner Evans 3 жил өмнө
parent
commit
715c8668f7

+ 3 - 0
mausignald/signald.py

@@ -150,6 +150,9 @@ class SignaldClient(SignaldRPCClient):
     async def start_link(self) -> LinkSession:
         return LinkSession.deserialize(await self.request_v1("generate_linking_uri"))
 
+    async def wait_for_scan(self, session_id: str) -> None:
+        await self.request_v1("wait_for_scan", session_id=session_id)
+
     async def finish_link(
         self, session_id: str, device_name: str = "mausignald", overwrite: bool = False
     ) -> Account:

+ 2 - 0
mautrix_signal/user.py

@@ -155,6 +155,8 @@ class User(DBUser, BaseUser):
         self.username = account.account_id
         self.uuid = account.address.uuid
         self._add_to_cache()
+        # Push a remote state immediately so that the client knows that it's doing something.
+        asyncio.create_task(self.push_bridge_state(BridgeStateEvent.CONNECTING))
         await self.update()
         await self.bridge.signal.subscribe(self.username)
         asyncio.create_task(self.sync())

+ 13 - 1
mautrix_signal/web/provisioning_api.py

@@ -25,7 +25,7 @@ from aiohttp import web
 from mausignald.errors import InternalError, TimeoutException
 from mausignald.types import Account, Address
 from mautrix.types import UserID
-from mautrix.util.bridge_state import BridgeStateEvent
+from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
 from mautrix.util.logging import TraceLogger
 
 from .. import user as u
@@ -186,6 +186,18 @@ class ProvisioningAPI:
             )
         session_id = user.command_status["session_id"]
         device_name = user.command_status["device_name"]
+        try:
+            await self.bridge.signal.wait_for_scan(session_id)
+            status_endpoint = self.bridge.config["homeserver.status_endpoint"]
+            if status_endpoint:
+                state = BridgeState(state_event=BridgeStateEvent.CONNECTING).fill()
+                asyncio.create_task(state.send(status_endpoint, self.bridge.az.as_token, self.log))
+        except Exception as e:
+            self.log.exception(f"Failed waiting for scan. Error: {e}")
+            raise web.HTTPBadRequest(
+                text='{"error": "Failed to wait for scan"}', headers=self._headers
+            )
+
         try:
             account = await asyncio.shield(self._shielded_link(user, session_id, device_name))
         except asyncio.CancelledError: