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