Mercurial > p > roundup > code
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
