Răsfoiți Sursa

Merge pull request #14 from mautrix/new-bridge-state

Upgrade mautrix to 0.10.2 and use new BridgeStateEvents
Tulir Asokan 3 ani în urmă
părinte
comite
35fb4487e4
3 a modificat fișierele cu 17 adăugiri și 13 ștergeri
  1. 3 0
      mautrix_instagram/__main__.py
  2. 13 12
      mautrix_instagram/user.py
  3. 1 1
      requirements.txt

+ 3 - 0
mautrix_instagram/__main__.py

@@ -152,5 +152,8 @@ class InstagramBridge(Bridge):
     def is_bridge_ghost(self, user_id: UserID) -> bool:
         return bool(Puppet.get_id_from_mxid(user_id))
 
+    async def count_logged_in_users(self) -> int:
+        return len([user for user in User.by_igpk.values() if user.igpk])
+
 
 InstagramBridge().run()

+ 13 - 12
mautrix_instagram/user.py

@@ -28,8 +28,9 @@ from mauigpapi.errors import (IGNotLoggedInError, MQTTNotLoggedIn, MQTTNotConnec
 from mautrix.bridge import BaseUser, BridgeState, async_getter_lock
 from mautrix.types import UserID, RoomID, EventID, TextMessageEventContent, MessageType
 from mautrix.appservice import AppService
-from mautrix.util.opt_prometheus import Summary, Gauge, async_time
+from mautrix.util.bridge_state import BridgeStateEvent
 from mautrix.util.logging import TraceLogger
+from mautrix.util.opt_prometheus import Summary, Gauge, async_time
 
 from .db import User as DBUser, Portal as DBPortal
 from .config import Config
@@ -158,7 +159,7 @@ class User(DBUser, BaseUser):
         self._track_metric(METRIC_CONNECTED, True)
         self._is_connected = True
         await self.send_bridge_notice("Connected to Instagram")
-        await self.push_bridge_state(ok=True)
+        await self.push_bridge_state(BridgeStateEvent.CONNECTED)
 
     async def on_disconnect(self, evt: Disconnect) -> None:
         self.log.debug("Disconnected from Instagram")
@@ -184,18 +185,13 @@ class User(DBUser, BaseUser):
         state.remote_id = str(self.igpk)
         state.remote_name = f"@{self.username}"
 
-    async def get_bridge_state(self) -> BridgeState:
-        if not self.client:
-            return BridgeState(ok=False, error="logged-out")
-        elif not self._listen_task or self._listen_task.done() or not self.is_connected:
-            return BridgeState(ok=False, error="ig-no-mqtt")
-        return BridgeState(ok=True)
-
     async def send_bridge_notice(self, text: str, edit: Optional[EventID] = None,
+                                 state_event: Optional[BridgeStateEvent] = None,
                                  important: bool = False, error_code: Optional[str] = None,
                                  error_message: Optional[str] = None) -> Optional[EventID]:
-        if error_code:
-            await self.push_bridge_state(ok=False, error=error_code, message=error_message)
+        if state_event:
+            await self.push_bridge_state(state_event, error=error_code,
+                                         message=error_message if error_code else text)
         if self.config["bridge.disable_bridge_notices"]:
             return None
         if not important and not self.config["bridge.unimportant_bridge_notices"]:
@@ -275,6 +271,7 @@ class User(DBUser, BaseUser):
         limit = self.config["bridge.chat_sync_limit"]
         min_active_at = (time.time() * 1_000_000) - max_age
         i = 0
+        await self.push_bridge_state(BridgeStateEvent.BACKFILLING)
         async for thread in self.client.iter_inbox(start_at=resp):
             try:
                 await self._sync_thread(thread, min_active_at)
@@ -314,16 +311,19 @@ class User(DBUser, BaseUser):
             await self.refresh()
         except (MQTTNotConnected, MQTTNotLoggedIn) as e:
             await self.send_bridge_notice(f"Error in listener: {e}", important=True,
+                                          state_event=BridgeStateEvent.UNKNOWN_ERROR,
                                           error_code="ig-connection-error")
             self.mqtt.disconnect()
         except Exception:
             self.log.exception("Fatal error in listener")
             await self.send_bridge_notice("Fatal error in listener (see logs for more info)",
+                                          state_event=BridgeStateEvent.UNKNOWN_ERROR,
                                           important=True, error_code="ig-connection-error")
             self.mqtt.disconnect()
         else:
             if not self.shutdown:
                 await self.send_bridge_notice("Instagram connection closed without error",
+                                              state_event=BridgeStateEvent.UNKNOWN_ERROR,
                                               error_code="ig-disconnected")
         finally:
             self._listen_task = None
@@ -352,6 +352,7 @@ class User(DBUser, BaseUser):
         self._track_metric(METRIC_CONNECTED, False)
         self._track_metric(METRIC_LOGGED_IN, False)
         if not from_error:
+            await self.push_bridge_state(BridgeStateEvent.LOGGED_OUT)
             puppet = await pu.Puppet.get_by_pk(self.igpk, create=False)
             if puppet and puppet.is_real_user:
                 await puppet.switch_mxid(None, None)
@@ -361,7 +362,7 @@ class User(DBUser, BaseUser):
                 pass
             self.igpk = None
         else:
-            await self.push_bridge_state(ok=False, error="logged-out")
+            await self.push_bridge_state(BridgeStateEvent.BAD_CREDENTIALS)
         self.client = None
         self.mqtt = None
         self.state = None

+ 1 - 1
requirements.txt

@@ -4,7 +4,7 @@ commonmark>=0.8,<0.10
 aiohttp>=3,<4
 yarl>=1,<2
 attrs>=20.1
-mautrix>=0.9.6,<0.10
+mautrix>=0.10.2,<0.11
 asyncpg>=0.20,<0.24
 pycryptodome>=3,<4
 paho-mqtt>=1.5,<2