From 5a76b5bcdc534d8f824bafa76ab86d7bd3081a2e Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Wed, 4 Aug 2021 14:03:54 -0600 Subject: [PATCH 1/2] Upgrade mautrix to 0.10.2 and use new BridgeStateEvents --- mautrix_telegram/__main__.py | 3 +++ mautrix_telegram/user.py | 22 ++++++++++------------ requirements.txt | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mautrix_telegram/__main__.py b/mautrix_telegram/__main__.py index 11c2ebd8..82f80ac7 100644 --- a/mautrix_telegram/__main__.py +++ b/mautrix_telegram/__main__.py @@ -129,5 +129,8 @@ class TelegramBridge(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_tgid.values() if user.tgid]) + TelegramBridge().run() diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py index 6d3d64d0..bab545d3 100644 --- a/mautrix_telegram/user.py +++ b/mautrix_telegram/user.py @@ -32,6 +32,7 @@ from mautrix.client import Client from mautrix.errors import MatrixRequestError, MNotFound from mautrix.types import UserID, RoomID, PushRuleScope, PushRuleKind, PushActionType, RoomTagInfo from mautrix.bridge import BaseUser, BridgeState +from mautrix.util.bridge_state import BridgeStateEvent from mautrix.util.logging import TraceLogger from mautrix.util.opt_prometheus import Gauge @@ -222,22 +223,17 @@ class User(AbstractUser, BaseUser): await asyncio.sleep(3) connected = self._is_connected self._track_metric(METRIC_CONNECTED, connected) - await self.push_bridge_state(ok=connected, ttl=3600 if connected else 240, - error="tg-not-connected" if not connected else None) + if connected: + await self.push_bridge_state(BridgeStateEvent.CONNECTED, ttl=3600) + else: + await self.push_bridge_state(BridgeStateEvent.UNKNOWN_ERROR, ttl=240, + error="tg-not-connected") async def fill_bridge_state(self, state: BridgeState) -> None: await super().fill_bridge_state(state) state.remote_id = str(self.tgid) state.remote_name = self.human_tg_id - async def get_bridge_state(self) -> BridgeState: - if not self.tgid: - return BridgeState(ok=False, error="logged-out") - elif not self._is_connected: - return BridgeState(ok=False, error="tg-not-connected") - else: - return BridgeState(ok=True) - async def get_puppet(self) -> Optional['pu.Puppet']: if not self.tgid: return None @@ -249,7 +245,8 @@ class User(AbstractUser, BaseUser): self._track_connection_task.cancel() self._track_connection_task = None self._track_metric(METRIC_CONNECTED, False) - await self.push_bridge_state(ok=False, error="tg-not-connected") + await self.push_bridge_state(state_event=BridgeStateEvent.UNKNOWN_ERROR, + error="tg-not-connected") async def post_login(self, info: TLUser = None, first_login: bool = False) -> None: if config["metrics.enabled"] and not self._track_connection_task: @@ -341,7 +338,7 @@ class User(AbstractUser, BaseUser): self.portals = {} self.contacts = [] await self.save(portals=True, contacts=True) - await self.push_bridge_state(ok=False, error="logged-out") + await self.push_bridge_state(BridgeStateEvent.LOGGED_OUT) if self.tgid: try: del self.by_tgid[self.tgid] @@ -507,6 +504,7 @@ class User(AbstractUser, BaseUser): index = 0 self.log.debug(f"Syncing dialogs (update_limit={update_limit}, " f"create_limit={create_limit})") + await self.push_bridge_state(BridgeStateEvent.BACKFILLING) puppet = await pu.Puppet.get_by_custom_mxid(self.mxid) dialog: Dialog async for dialog in self.client.iter_dialogs(limit=update_limit, ignore_migrated=True, diff --git a/requirements.txt b/requirements.txt index 3e5d9e46..9beef648 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ python-magic>=0.4,<0.5 commonmark>=0.8,<0.10 aiohttp>=3,<4 yarl>=1,<2 -mautrix>=0.9.7,<0.10 +mautrix>=0.10.2,<0.11 telethon>=1.22,<1.23 telethon-session-sqlalchemy>=0.2.14,<0.3 From ecdaaea3b91853fe72113d1daab8b350d615fc48 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 10 Aug 2021 18:14:32 +0300 Subject: [PATCH 2/2] Don't send connected state when sync is in progress --- mautrix_telegram/user.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mautrix_telegram/user.py b/mautrix_telegram/user.py index bab545d3..96c6c448 100644 --- a/mautrix_telegram/user.py +++ b/mautrix_telegram/user.py @@ -94,6 +94,7 @@ class User(AbstractUser, BaseUser): self._db_instance = db_instance self._ensure_started_lock = asyncio.Lock() self._track_connection_task = None + self._is_backfilling = False (self.relaybot_whitelisted, self.whitelisted, @@ -224,7 +225,8 @@ class User(AbstractUser, BaseUser): connected = self._is_connected self._track_metric(METRIC_CONNECTED, connected) if connected: - await self.push_bridge_state(BridgeStateEvent.CONNECTED, ttl=3600) + await self.push_bridge_state(BridgeStateEvent.BACKFILLING if self._is_backfilling + else BridgeStateEvent.CONNECTED, ttl=3600) else: await self.push_bridge_state(BridgeStateEvent.UNKNOWN_ERROR, ttl=240, error="tg-not-connected") @@ -270,10 +272,13 @@ class User(AbstractUser, BaseUser): if not self.is_bot and config["bridge.startup_sync"]: try: + self._is_backfilling = True await self.sync_dialogs() await self.sync_contacts() except Exception: self.log.exception("Failed to run post-login sync") + finally: + self._is_backfilling = False async def update(self, update: TypeUpdate) -> bool: if not self.is_bot: