changeset 4695:132650f4700a

#2550782: Added a new irker detector to send notifications on IRC when an issue is created or messages are added.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 14 Dec 2012 18:22:27 +0200
parents 118457ca2e07
children 57a64e591a00
files CHANGES.txt detectors/irker.py doc/customizing.txt
diffstat 3 files changed, 110 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Fri Dec 14 01:13:37 2012 +0530
+++ b/CHANGES.txt	Fri Dec 14 18:22:27 2012 +0200
@@ -7,6 +7,8 @@
 
 Features:
 
+- issue2550782: Added a new irker detector to send notifications on IRC
+  when an issue is created or messages are added. (Ezio Melotti)
 - Beta version of responsive templates using devel schema
   and Twitter Bootstrap for styling (Pradip Caulagi)
 - pywin32 is not longer required to run on Windows (anatoly techtonik)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/detectors/irker.py	Fri Dec 14 18:22:27 2012 +0200
@@ -0,0 +1,101 @@
+# This detector sends notification on IRC through an irker daemon
+# (http://www.catb.org/esr/irker/) when issues are created or messages
+#  are added.
+#
+# Written by Ezio Melotti
+#
+# Requires a running irkerd daemon to work.  See the irker documentation
+# for more information about installing, configuring, and running irker.
+#
+# Add the IRC channel(s) that should receive notifications in
+# detectors/config.ini as a comma-separated list, using this format:
+#
+#   [irker]
+#   channels = irc://chat.freenode.net/channelname
+#
+
+import re
+import json
+import socket
+
+IRKER_HOST = 'localhost'
+IRKER_PORT = 6659
+
+max_content = 120
+
+TEMPLATE = ('%(green)s%(author)s%(reset)s '
+            '%(bluish)s#%(nodeid)s%(reset)s/%(title)s%(bold)s:%(bold)s '
+            '%(log)s %(url)s')
+
+
+def sendmsg(msg):
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    try:
+        sock.connect((IRKER_HOST, IRKER_PORT))
+        sock.sendall(msg + "\n")
+    finally:
+        sock.close()
+
+
+def notify_irker(db, cl, nodeid, oldvalues):
+    messages = set(cl.get(nodeid, 'messages'))
+    if oldvalues:
+        messages -= set(oldvalues.get('messages', ()))
+    if not messages:
+        return
+    messages = list(messages)
+
+    if oldvalues:
+        oldstatus = oldvalues['status']
+    else:
+        oldstatus = None
+    newstatus = db.issue.get(nodeid, 'status')
+    if oldstatus != newstatus:
+        if oldvalues:
+            status = db.status.get(newstatus, 'name')
+        else:
+            status = 'new'
+        log = '[' + status + '] '
+    else:
+        log = ''
+    for msg in messages:
+        log += db.msg.get(msg, 'content')
+    if len(log) > max_content:
+        log = log[:max_content-3] + '...'
+    log = re.sub('\s+', ' ', log)
+
+    # include irc colors
+    params = {
+        'bold': '\x02',
+        'green': '\x0303',
+        'blue': '\x0302',
+        'bluish': '\x0310',
+        'yellow': '\x0307',
+        'brown': '\x0305',
+        'reset': '\x0F'
+    }
+    # extend with values used in the template
+    params['author'] = db.user.get(db.getuid(), 'username')
+    params['nodeid'] = nodeid
+    params['title'] = db.issue.get(nodeid, 'title')
+    params['log'] = log
+    params['url'] = '%sissue%s' % (db.config.TRACKER_WEB, nodeid)
+
+    # create the message and use the list of channels defined in
+    # detectors/config.ini
+    msg = json.dumps({
+        'to': db.config.detectors.IRKER_CHANNELS.split(','),
+        'privmsg': TEMPLATE % params,
+    })
+
+    try:
+        sendmsg(msg)
+    except Exception as e:
+        # Ignore any errors in sending the irker;
+        # if the server is down, that's just bad luck
+        # XXX might want to do some logging here
+        print '* Sending message to irker failed', str(e)
+
+def init(db):
+    db.issue.react('create', notify_irker)
+    db.issue.react('set', notify_irker)
--- a/doc/customizing.txt	Fri Dec 14 01:13:37 2012 +0530
+++ b/doc/customizing.txt	Fri Dec 14 18:22:27 2012 +0200
@@ -869,6 +869,13 @@
 the ``'detectors'`` directory of the Roundup distribution. If you want
 to use one, copy it to the ``'detectors'`` of your tracker instance:
 
+**irker.py**
+  This detector sends notification on IRC through an irker daemon
+  (http://www.catb.org/esr/irker/) when issues are created or messages
+  are added.  In order to use it you need to install irker, start the
+  irkerd daemon, and add an ``[irker]`` section in ``detectors/config.ini``
+  that contains a comma-separated list of channels where the messages should
+  be sent, e.g. ``channels = irc://chat.freenode.net/channelname``.
 **newissuecopy.py**
   This detector sends an email to a team address whenever a new issue is
   created. The address is hard-coded into the detector, so edit it

Roundup Issue Tracker: http://roundup-tracker.org/