Script: gntpnotify.py

Growl notifications using python-gntp.
Author: ofan — Version: 0.2 — License: GPL-3.0-or-later
For WeeChat ≥ 0.3.0, requires: python-gntp.
Tags: notify, py2, py3
Added: 2012-04-13

Download GitHub Repository

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
# -*- coding: utf-8 -*-
# Author: Ryan Feng <odayfans at gmail dot com>
# License: GPL3
# Version: 0.2
# Changelog
# 0.2:
# * Fewer error messages

import gntp.notifier as notifier
import weechat
import time

# Logging
def log(msg):
    weechat.prnt("",msg)

# Register plugin
weechat.register("gntpnotify",
             "Ryan Feng",
             "0.2",
             "GPL3",
             "GNTP Notify: Growl notifications using python-gntp",
             "",
             "")

# Create hooks
weechat.hook_signal("*,irc_in2_PRIVMSG","private_msg","")
weechat.hook_signal("weechat_highlight","hilight_msg","")

growl = None
grow_loaded = False
last_log_time = None
log_period = 10 # Redisplay error log in 10s
error_log_max = 3  # Only show no more than 3 error messages in 10s
error_logged = 0

def connect():
    global growl, grow_loaded, log_period, error_log_max, last_log_time, error_logged
    # Create grow object
    growl = notifier.GrowlNotifier(
        applicationName = "Weechat",
        notifications = ["irc message"],
        defaultNotifications = ["irc message"],
        )
    try:
        grow_loaded = growl.register()
    except:
        grow_loaded = False
        if last_log_time is None:
            last_log_time = time.time()
        elapsed_time = time.time() - last_log_time
        if elapsed_time >= log_period:
            error_logged = 0

        if error_logged < error_log_max:
            log("Cannot create notifier object, please make sure Growl has started")
            error_logged += 1
            last_log_time = time.time()

    return grow_loaded

def show_notification(title, message):
    if not grow_loaded:
        connect()
        return
    r = growl.notify(
            noteType = "irc message",
            title = title,
            description = message,
            sticky = False,
            priority = 1
            )
    if not r:
        log("Cannot send notification")

def private_msg(data, signal, message):
    # message is a raw irc message sent from the server
    message = message[1:]

    # Get sender
    sender = message[:message.find('!')-1]

    # Get receiver
    receiver = message.split()[2]

    # Get message body
    msg = message[message.find(':')+1:]

    # Get the server which sent this message
    server = signal.partition(',')[0]

    # Ignore all PRIVMSGs send to a channel,the rest are messages send to 'me'
    if not receiver.startswith('#'):
        show_notification("%s @ #%s" % (sender,server),msg)

    return weechat.WEECHAT_RC_OK

def hilight_msg(data, signal, message):
    # TODO: Get the sender of the message and the channel where the highlight displayed
    sender,_,tmp_msg = message.partition('\t')

    _,_,msg = tmp_msg.partition(' ')

    if grow_loaded:
        show_notification("%s" % sender, msg)
    else:
        connect()
    return weechat.WEECHAT_RC_OK