From caf1a03ab6c301aec44c8bd6fd634f31cd203f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20M=C3=A4der?= <maeder@phys.ethz.ch> Date: Sat, 24 Jul 2021 21:49:23 +0200 Subject: [PATCH] Allow mapping of Matrix users to RT users --- base-config.yaml | 3 +++ maubot.yaml | 2 +- rt.py | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/base-config.yaml b/base-config.yaml index 1697c60..e9af71a 100644 --- a/base-config.yaml +++ b/base-config.yaml @@ -10,6 +10,9 @@ pass: secret # The list of user IDs who are allowed to use commands whitelist: - '@user:example.com' +# Map Matrix users to RT users +usermap: + user: rt-userid # List of ticket properties to show filter_properties: - 'Queue' diff --git a/maubot.yaml b/maubot.yaml index 700068d..1f023cf 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -5,7 +5,7 @@ maubot: 0.1.0 id: ch.ethz.phys.rt # A PEP 440 compliant version string. -version: 0.3.1 +version: 0.3.2 # The SPDX license identifier for the plugin. https://spdx.org/licenses/ # Optional, assumes all rights reserved if omitted. diff --git a/rt.py b/rt.py index 4dcc616..4ca64f9 100755 --- a/rt.py +++ b/rt.py @@ -14,6 +14,7 @@ class Config(BaseProxyConfig): helper.copy('user') helper.copy('pass') helper.copy('whitelist') + helper.copy('usermap') helper.copy('filter_properties') helper.copy('filter_entry') @@ -21,6 +22,7 @@ class Config(BaseProxyConfig): class RT(Plugin): prefix: str whitelist: Set[UserID] + usermap: dict api: str login: dict headers = {'User-agent': 'maubot-rt'} @@ -44,6 +46,7 @@ class RT(Plugin): self.config.load_and_update() self.prefix = self.config['prefix'] self.whitelist = set(self.config['whitelist']) + self.usermap = self.config['usermap'] self.url = self.config['url'] self.rest = f'{self.url}/REST/1.0/' self.display = f'{self.url}/Ticket/Display.html' @@ -58,6 +61,9 @@ class RT(Plugin): def can_manage(self, evt: MessageEvent) -> bool: return True if evt.sender in self.whitelist else False + def map_user(self, username: str) -> str: + return self.usermap[username] if username in self.usermap else username + def valid_number(self, number: str) -> bool: return True if self.regex_number.match(number) else False @@ -162,7 +168,7 @@ class RT(Plugin): target_ticket = self.regex_ticket.findall(target_evt.content.body) if len(target_ticket) == 1: number = target_ticket[0] - await self._edit(number, {'Owner': username}) + await self._edit(number, {'Owner': self.map_user(username)}) content = TextMessageEventContent( msgtype=MessageType.NOTICE, format=Format.HTML, body=f'{displayname} took {number}', @@ -182,7 +188,7 @@ class RT(Plugin): target_displayname = await self._displayname(evt.room_id, target_mxid) if len(target_ticket) == 1: number = target_ticket[0] - await self._edit(number, {'Owner': target_username}) + await self._edit(number, {'Owner': self.map_user(target_username)}) content = TextMessageEventContent( msgtype=MessageType.NOTICE, format=Format.HTML, body=f'{displayname} politely rejected {number} and gave it back to ' @@ -348,7 +354,8 @@ class RT(Plugin): return await evt.mark_read() displayname = await self._displayname(evt.room_id, evt.sender) - await self._edit(number, {'Owner': evt.sender[1:].split(':')[0]}) + username = evt.sender[1:].split(':')[0] + await self._edit(number, {'Owner': self.map_user(username)}) content = TextMessageEventContent( msgtype=MessageType.NOTICE, format=Format.HTML, body=f'{displayname} took rt#{number} ðŸ‘ï¸', @@ -375,7 +382,7 @@ class RT(Plugin): displayname = await self._displayname(evt.room_id, evt.sender) target_mxid = member_mxids[user] target_username = target_mxid[1:].split(':')[0] - await self._edit(number, {'Owner': target_username}) + await self._edit(number, {'Owner': self.map_user(target_username)}) react = f'(\U0001F44D to accept, \U0001F595 to reject)' content = TextMessageEventContent( msgtype=MessageType.NOTICE, format=Format.HTML, @@ -406,7 +413,8 @@ class RT(Plugin): await evt.mark_read() displayname = await self._displayname(evt.room_id, evt.sender) username = evt.sender[1:].split(':')[0] - params = {'query': f'Owner = "{username}" AND ( Status = "new" OR Status = "open" )'} + mapped_username = self.map_user(username) + params = {'query': f'Owner = "{mapped_username}" AND ( Status = "new" OR Status = "open" )'} tickets_dict = await self._search(params) links = {k: f'<a href="{self.display}?id={k}">{v}</a>' for k, v in tickets_dict.items()} if tickets_dict: -- GitLab