From f64e49028ec58f9808aa70731b211832f573620f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sven=20M=C3=A4der?= <maeder@phys.ethz.ch>
Date: Fri, 14 Feb 2020 01:16:55 +0100
Subject: [PATCH] Add subcommands unowned and mine

---
 maubot.yaml |  2 +-
 rt.py       | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/maubot.yaml b/maubot.yaml
index 2fdedcc..898265a 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.2.8
+version: 0.2.9
 
 # 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 fe23420..def1b10 100755
--- a/rt.py
+++ b/rt.py
@@ -117,6 +117,12 @@ class RT(Plugin):
             entry['Content'] = block
         return entry
 
+    async def _search(self, params: dict) -> dict:
+        rest = f'{self.rest}search/ticket'
+        async with self.http.get(rest, headers=self.headers, params=params) as response:
+            content = await response.text()
+        return dict(self.regex_history.findall(content))
+
     @command.passive('((^| )([rR][tT]#?))([0-9]+)', multiple=True)
     async def handler(self, evt: MessageEvent, subs: List[Tuple[str, str]]) -> None:
         await evt.mark_read()
@@ -313,3 +319,33 @@ class RT(Plugin):
             f'assigned {self.html_link(number)} to '
             f'<a href="https://matrix.to/#/{target_mxid}">{target_mxid}</a> 😜')
         await evt.respond(content)
+
+    @rt.subcommand('unowned', aliases=('u', 'un'), help='List all unowned open tickets.')
+    async def unowned(self, evt: MessageEvent) -> None:
+        if not self.can_manage(evt):
+            return
+        await evt.mark_read()
+        params = {'query': 'Owner = "Nobody" AND ( Status = "new" OR Status = "open" )'}
+        tickets_dict = await self._search(params)
+        # links = {k: self.markdown_link(k) for k, v in tickets_dict.items()}
+        tickets = '  \n'.join([f'`{k}`: {v}' for k, v in tickets_dict.items()])
+        await evt.respond(f'Unowned open tickets:  \n{tickets}')
+
+    @rt.subcommand('mine', aliases=('m', 'my'), help='List all your open tickets.')
+    async def mine(self, evt: MessageEvent) -> None:
+        if not self.can_manage(evt):
+            return
+        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" )'}
+        tickets_dict = await self._search(params)
+        # links = {k: self.html_link(k) for k, v in tickets_dict.items()}
+        body = '\n'.join([f'{k}: {v}' for k, v in tickets_dict.items()])
+        fbody = '<br/>'.join([f'<code>{k}</code>: {v}' for k, v in tickets_dict.items()])
+        content = TextMessageEventContent(
+            msgtype=MessageType.NOTICE, format=Format.HTML,
+            body=f'Open tickets for {displayname}:\n{body}',
+            formatted_body=f'Open tickets for <a href="https://matrix.to/#/{evt.sender}">'
+            f'{evt.sender}</a>:<br/>{fbody}')
+        await evt.respond(content)
-- 
GitLab