view detectors/irker.py @ 7695:2be7a8f66ea7

fix: windows install using pip mislocates share directory The setup code that tries to make the share install path absolute prependeds something like: c:\program files\python_venv to the paths. The equivalent on linux is recognized as an absolute path. On windows this is treated oddly. This resulted in the share files being placed in: c:\program files\python_venv\Lib\site-packages\program files\python_venv\share Roundup was unable to find the files there. On windows (where the platform starts with 'win') don't make the path absolute. This puts share in: c:\program files\python_venv\Lib\share and Roundup finds them. The translations and templates are found by the roundup-server. The docs are also installed under the share directory. The man pages are not installed as windows doesn't have groff to format the source documents. This is the second fix from issues getting Roundup running on windows discussed on mailing list by Simon Eigeldinger. Thread starts with: https://sourceforge.net/p/roundup/mailman/message/41557096/ subject: Installing Roundup on Windows 2023-10-05.
author John Rouillard <rouilj@ieee.org>
date Sun, 05 Nov 2023 23:01:29 -0500
parents 64b05e24dbd8
children 72f549e68534
line wrap: on
line source

# 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
#

from __future__ import print_function
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)

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