Răsfoiți Sursa

bin/ircd: add tau notifier bot

Dastan-glitch 3 ani în urmă
părinte
comite
535bf4e85c
1 a modificat fișierele cu 97 adăugiri și 0 ștergeri
  1. 97 0
      bin/ircd/script/bots/taubot.py

+ 97 - 0
bin/ircd/script/bots/taubot.py

@@ -0,0 +1,97 @@
+import argparse
+import irc
+import json
+import socket
+import sys
+
+# parse arguments
+parser = argparse.ArgumentParser(description='IRC bot to send a pipe to an IRC channel')
+parser.add_argument('--server',default='127.0.0.1', help='IRC server')
+parser.add_argument('--port', default=11066, help='port of the IRC server')
+parser.add_argument('--nickname', help='bot nickname in IRC')
+parser.add_argument('--channel', default="#dev", action='append', help='channel to join')
+parser.add_argument('--pipe', default="/tmp/tau_pipe" , help='pipe to read from')
+parser.add_argument('--skip', default="prv", help='Project or Tags to skip notifications for')
+parser.add_argument('--alt-chan', default="#test", required='--skip' in sys.argv, help='Alternative channel to send notifications to when there are skipped tasks')
+
+args = parser.parse_args()
+
+channels = [args.channel, args.alt_chan] if args.alt_chan is not None else args.channel
+
+ircc = irc.IRC()
+ircc.connect(args.server, args.port, channels, args.nickname)
+
+while True:
+    with open(args.pipe) as handle:
+        while True:
+            log_line = handle.readline()
+            if not log_line:
+                break
+            print(log_line)
+            print("======================================")
+            task = json.loads(log_line)
+            channel = args.channel
+
+            for event in task['events']:
+                cmd = event['action']
+                if cmd == "add_task":
+                    user = task['owner']
+                    id = task['id']
+                    title = task['title']
+                    assigned = ", ".join(task['assign'])
+
+                    project = task['project'] if task['project'] is not None else []
+                    if args.skip in project or args.skip in task['tags']:
+                        channel = args.alt_chan
+
+                    if len(assigned) > 0:
+                        notification = f"{user} added task ({id}): {title}. assigned to {assigned}"
+                    else:
+                        notification = f"{user} added task ({id}): {title}"
+                    # print(notification)
+                    ircc.send(channel, notification)
+                elif cmd == "state":
+                    user = event['author']
+                    state = event['content']
+                    id = task['id']
+                    title = task['title']
+
+                    project = task['project'] if task['project'] is not None else []
+                    if args.skip in project or args.skip in task['tags']:
+                        channel = args.alt_chan
+
+                    if state == "start":
+                        notification = f"{user} started task ({id}): {title}"
+                    elif state == "pause":
+                        notification = f"{user} paused task ({id}): {title}"
+                    elif state == "stop":
+                        notification = f"{user} stopped task ({id}): {title}"
+                    elif state == "cancel":
+                        notification = f"{user} canceled task ({id}): {title}"
+                    # print(notification)
+                    ircc.send(channel, notification)
+                elif cmd == "comment":
+                    user = event['author']
+                    id = task['id']
+                    title = task['title']
+                    
+                    project = task['project'] if task['project'] is not None else []
+                    if args.skip in project or args.skip in task['tags']:
+                        channel = args.alt_chan
+
+                    notification = f"{user} commented on task ({id}): {title}"
+                    # print(notification)
+                    ircc.send(channel, notification)
+                elif cmd == "assign":
+                    user = event['author']
+                    assignees = event['content']
+                    id = task['id']
+                    title = task['title']
+
+                    project = task['project'] if task['project'] is not None else []
+                    if args.skip in project or args.skip in task['tags']:
+                        channel = args.alt_chan
+
+                    notification = f"{user} reassigned task ({id}): {title} to {assignees}"
+                    # print(notification)
+                    ircc.send(channel, notification)