Script: weeprowl.py

Prowl notifications.
Author: Josh Dick — Version: 0.8 — License: GPL-2.0-or-later
For WeeChat ≥ 0.3.7.
Tags: notify, py3
Added: 2013-10-19 — Updated: 2021-03-06

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# -*- coding: utf-8 -*-
# Author: Josh Dick <josh@joshdick.net>
# <https://github.com/joshdick/weeprowl>
#
# Requires WeeChat version 0.3.7 or greater
# Released under GNU GPL v2
#
# Based on the 'notify' plugin version 0.0.5 by lavaramano <lavaramano AT gmail DOT com>:
# <http://www.weechat.org/scripts/source/stable/notify.py.html/>
#
# 2021-03-03, Johannes Rabenschlag <j.rabenschlag@gmail.com>
#     Version 0.8: Fixed urllib error
# 2014-05-10, Sébastien Helleu <flashcode@flashtux.org>
#     Version 0.7: Change hook_print callback argument type of
#                  displayed/highlight (WeeChat >= 1.0)
# 2013-12-22, Josh Dick <josh@joshdick.net>
#     Version 0.6: Fixed bug that was preventing negative numbers from working with
#                  the prowl_priority setting
# 2013-12-20, Josh Dick <josh@joshdick.net>
#     Version 0.5: Now backgrounds Prowl API requests, added prowl_priority setting,
#                  now requires WeeChat version 0.3.7 or greater
# 2013-08-13, Josh Dick <josh@joshdick.net>
#     Version 0.4: No longer sending notifications for text you send in private messages
# 2012-09-16, Josh Dick <josh@joshdick.net>
#     Version 0.3: Removed 'smart_notification' and away_notification' settings
#                  in favor of more granular notification settings
# 2012-09-16, Josh Dick <josh@joshdick.net>
#     Version 0.2: Added 'away_notification' setting
# 2012-03-25, Josh Dick <josh@joshdick.net>
#     Version 0.1: Initial release

import urllib.parse, weechat

weechat.register('weeprowl', 'Josh Dick', '0.8', 'GPL', 'Prowl notifications for WeeChat', '', '')

# Plugin settings
settings = {
    'prowl_api_key': '',
    'prowl_priority': '0', # An integer value ranging [-2, 2] per http://www.prowlapp.com/api.php#add
    'show_hilights': 'on',
    'show_priv_msg': 'on',
    'nick_separator': ': ',
    'notify_focused_active': 'on', # If 'on', send Prowl notifications for the currently-focused buffer when not away
    'notify_focused_away': 'on', # If 'on', send Prowl notifications for the currently-focused buffer when away
    'notify_unfocused_active': 'on', # If 'on', send Prowl notifications for non-focused buffers when not away
    'notify_unfocused_away': 'on' # If 'on', send Prowl notifications for non-focused buffers when away
}

# Hook for private messages/hilights
weechat.hook_print('', 'irc_privmsg', '', 1, 'notification_callback', '')

# Shows an error/help message if prowl_api_key is not set
def show_config_help():
    weechat.prnt('', '%sweeprowl - Error: Your Prowl API key is not set!' % weechat.prefix('error'))
    weechat.prnt('', '%sweeprowl - To obtain a Prowl API key, visit <http://prowlapp.com>.' % weechat.prefix('error'))
    weechat.prnt('', '%sweeprowl - Once you have a Prowl API key, configure weeprowl to use it by running:' % weechat.prefix('error'))
    weechat.prnt('', '%sweeprowl - /set plugins.var.python.weeprowl.prowl_api_key "your_prowl_api_key_here"' % weechat.prefix('error'))

# Shows an error when there was a problem sending a Prowl notification.
def show_notification_error():
    weechat.prnt('', '%sweeprowl - Could not send Prowl notification.' % weechat.prefix('error'))

# Triggered by the weechat hook above
def notification_callback(data, bufferp, uber_empty, tagsn, isdisplayed, ishilight, prefix, message):

    is_away = weechat.buffer_get_string(bufferp, 'localvar_away')
    is_focused = bufferp == weechat.current_buffer()
    do_prowl = True # If set to False depending on state and settings, no Prowl notification will be sent

    if (is_away):
        if (is_focused and weechat.config_get_plugin('notify_focused_away') != 'on'):
            do_prowl = False
        elif (not is_focused and weechat.config_get_plugin('notify_unfocused_away') != 'on'):
            do_prowl = False
    else:
        if (is_focused and weechat.config_get_plugin('notify_focused_active') != 'on'):
            do_prowl = False
        elif (not is_focused and weechat.config_get_plugin('notify_unfocused_active') != 'on'):
            do_prowl = False

    if (do_prowl):
        if (weechat.buffer_get_string(bufferp, 'localvar_type') == 'private' and weechat.config_get_plugin('show_priv_msg') == 'on' and prefix != weechat.buffer_get_string(bufferp, 'localvar_nick')):
            send_prowl_notification(prefix, message, True)
        elif (int(ishilight) and weechat.config_get_plugin('show_hilights') == 'on'):
            buffer = (weechat.buffer_get_string(bufferp, 'short_name') or weechat.buffer_get_string(bufferp, 'name'))
            send_prowl_notification(buffer, prefix + weechat.config_get_plugin('nick_separator') + message, False)

    return weechat.WEECHAT_RC_OK

# Send a Prowl notification via the Prowl API (API documentation: <http://www.prowlapp.com/api.php>)
def send_prowl_notification(chan, message, isPrivate):

    # Make sure a Prowl API key has been configured
    prowl_api_key = weechat.config_get_plugin('prowl_api_key')
    if (prowl_api_key == ''):
        show_config_help()
        show_notification_error()
        return

    # Make sure a valid Prowl priority has been configured
    prowl_priority = weechat.config_get_plugin('prowl_priority')
    valid_prowl_priority = True
    try:
        if (int(prowl_priority) > 2 or int(prowl_priority) < -2):
            valid_prowl_priority = False
    except ValueError:
            valid_prowl_priority = False
    if (not valid_prowl_priority):
        weechat.prnt('', '%sweeprowl - Current prowl_priority setting "%s" is invalid.' % (weechat.prefix('error'), prowl_priority))
        weechat.prnt('', '%sweeprowl - Please set prowl_priority to an integer value ranging from [-2, 2].' % weechat.prefix('error'))
        show_notification_error()
        return

    # Build the Prowl API request parameters
    params = urllib.parse.urlencode({
        'apikey': prowl_api_key,
        'application': 'weechat',
        'event': 'IRC ' + 'Private Message' if isPrivate else 'Mention/Hilight',
        'description': 'Channel: ' + chan + '\n' + message,
        'priority': prowl_priority
    })

    # Build the complete Prowl API request URL
    prowl_api_url = 'https://api.prowlapp.com/publicapi/add?' + params

    # Make the Prowl API request
    weechat.hook_process_hashtable(
        'url:' + prowl_api_url,
        { 'post': '1' },
        30 * 1000,
        'send_prowl_notification_callback',
        ''
    )

# Callback that handles the result of the Prowl API request
def send_prowl_notification_callback(data, command, rc, stdout, stderr):

    # Show an error if the Prowl API request failed
    if (rc > 0):
        weechat.prnt('', '%sweeprowl - Error: There was a problem communicating with the Prowl API!' % weechat.prefix('error'))
        weechat.prnt('', '%sweeprowl - Prowl API response information:' % weechat.prefix('error'))
        weechat.prnt('', '%sweeprowl -     Response code = %s' % (weechat.prefix('error'), rc))
        weechat.prnt('', '%sweeprowl -     STDOUT = %s' % (weechat.prefix('error'), stdout))
        weechat.prnt('', '%sweeprowl -     STDERR = %s' % (weechat.prefix('error'), stderr))
        show_notification_error()

    return weechat.WEECHAT_RC_OK

# Initialization
for option, default_value in settings.items():
    if weechat.config_get_plugin(option) == '':
        weechat.config_set_plugin(option, default_value)

if (weechat.config_get_plugin('prowl_api_key') == ''):
    show_config_help()

# vim: autoindent expandtab smarttab shiftwidth=4