|
@@ -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
|