From a090d6de329d6dc15c32ec21e48c85d7b55ac9c2 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 7 Jan 2019 19:54:19 +0200 Subject: [PATCH] Add command to cache Matrix room memberships --- mautrix_telegram/commands/portal.py | 16 +++++++++++++++- mautrix_telegram/portal.py | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mautrix_telegram/commands/portal.py b/mautrix_telegram/commands/portal.py index edd16d18..8509a09e 100644 --- a/mautrix_telegram/commands/portal.py +++ b/mautrix_telegram/commands/portal.py @@ -28,7 +28,7 @@ from ..config import yaml from ..util import ignore_coro from .. import portal as po, user as u, util from . import (command_handler, CommandEvent, - SECTION_ADMIN, SECTION_CREATING_PORTALS, SECTION_PORTAL_MANAGEMENT) + SECTION_ADMIN, SECTION_CREATING_PORTALS, SECTION_PORTAL_MANAGEMENT, SECTION_MISC) @command_handler(needs_admin=True, needs_auth=False, name="set-pl", @@ -53,6 +53,20 @@ async def set_power_level(evt: CommandEvent) -> Dict: return {} +@command_handler(needs_admin=False, needs_puppeting=False, needs_auth=False, + help_section=SECTION_MISC, + help_text="Fetch Matrix room state to ensure the bridge has up-to-date info.") +async def sync_state(evt: CommandEvent) -> Dict: + portal = po.Portal.get_by_mxid(evt.room_id) + if not portal: + return await evt.reply("This is not a portal room.") + elif not await user_has_power_level(evt.room_id, evt.az.intent, evt.sender, "bridge"): + return await evt.reply(f"You do not have the permissions to synchronize this room.") + + await portal.sync_matrix_members() + await evt.reply("Synchronization complete") + + @command_handler(help_section=SECTION_PORTAL_MANAGEMENT, help_text="Get a Telegram invite link to the current chat.") async def invite_link(evt: CommandEvent) -> Dict: diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index b532087a..ef216aaa 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -77,7 +77,6 @@ if TYPE_CHECKING: from .config import Config from .tgclient import MautrixTelegramClient - mimetypes.init() config = None # type: Config @@ -329,6 +328,7 @@ class Portal: puppet = p.Puppet.get(self.tgid) await puppet.update_info(user, entity) await puppet.intent.join_room(self.mxid) + await self.sync_matrix_members() async def create_matrix_room(self, user: 'AbstractUser', entity: TypeChat = None, invites: InviteList = None, update_if_exists: bool = True, @@ -783,6 +783,20 @@ class Portal: return (await self.main_intent.get_displayname(self.mxid, user.mxid) or user.mxid) + async def sync_matrix_members(self) -> None: + resp = await self.main_intent.get_room_joined_memberships(self.mxid) + members = resp["joined"] + print(members) + for mxid, info in members.items(): + member = { + "membership": "join", + } + if "display_name" in info: + member["displayname"] = info["display_name"] + if "avatar_url" in info: + member["avatar_url"] = info["avatar_url"] + self.az.state_store.set_member(self.mxid, mxid, member) + def set_typing(self, user: 'u.User', typing: bool = True, action: type = SendMessageTypingAction) -> Awaitable[bool]: return user.client(SetTypingRequest(