From 6dc6d05f62b0664dd92600ffde0dcb1fe7be0da4 Mon Sep 17 00:00:00 2001 From: Sven Bartscher Date: Fri, 7 Jul 2023 22:58:33 +0200 Subject: [PATCH] Create private chats with the is_direct flag To ensure that users' client will determine the correct user as the direct-chat partner, we let the IRC puppet user create the chat room and send the invitation to the user. --- heisenbridge/appservice.py | 7 ++++--- heisenbridge/private_room.py | 9 +++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/heisenbridge/appservice.py b/heisenbridge/appservice.py index 18fff5d..554d285 100644 --- a/heisenbridge/appservice.py +++ b/heisenbridge/appservice.py @@ -27,13 +27,13 @@ async def load(self): async def save(self): await self.az.intent.set_account_data("irc", self.config) - async def create_room(self, name: str, topic: str, invite: List[str], restricted: str = None) -> str: + async def create_room(self, name: str, topic: str, invite: List[str], restricted: str = None, as_user: str = None, is_direct: bool = False) -> str: req = { "visibility": "private", "name": name, "topic": topic, "invite": invite, - "is_direct": False, + "is_direct": is_direct, "power_level_content_override": { "users_default": 0, "invite": 100, @@ -70,7 +70,8 @@ async def create_room(self, name: str, topic: str, invite: List[str], restricted } ] - resp = await self.az.intent.api.request(Method.POST, Path.v3.createRoom, req) + intent = self.az.intent.user(as_user) if as_user else self.az.intent + resp = await intent.api.request(Method.POST, Path.v3.createRoom, req) return resp["room_id"] diff --git a/heisenbridge/private_room.py b/heisenbridge/private_room.py index d8118e8..1844677 100644 --- a/heisenbridge/private_room.py +++ b/heisenbridge/private_room.py @@ -19,6 +19,7 @@ from mautrix.types.event.state import JoinRestrictionType from mautrix.types.event.state import JoinRule from mautrix.types.event.state import JoinRulesStateEventContent +from mautrix.types.event.state import PowerLevelStateEventContent from mautrix.types.event.type import EventType from heisenbridge.command_parse import CommandManager @@ -468,10 +469,14 @@ async def _create_mx(self, displayname) -> None: self.id = await self.network.serv.create_room( "{} ({})".format(displayname, self.network.name), "Private chat with {} on {}".format(displayname, self.network.name), - [self.network.user_id, irc_user_id], + [self.network.user_id, self.network.serv.user_id], + as_user=irc_user_id, is_direct=True, ) self.serv.register_room(self) - await self.az.intent.user(irc_user_id).ensure_joined(self.id) + await self.az.intent.ensure_joined(self.id) + power_levels = PowerLevelStateEventContent() + power_levels.set_user_level(self.network.serv.user_id, 100) + await self.az.intent.user(irc_user_id).set_power_levels(self.id, power_levels) await self.save() # start event queue now that we have an id self._queue.start()