-
Notifications
You must be signed in to change notification settings - Fork 1
/
weeprowl.py
154 lines (131 loc) · 7.38 KB
/
weeprowl.py
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
# Author: Josh Dick <[email protected]>
# <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/>
#
# 2014-09-07, Josh Dick <[email protected]>
# Version 0.7: Fixed an issue that was preventing hilight notifications from being sent
# (normalized for a possible API type change in WeeChat);
# Minor stylistic tweaks to send_prowl_notification;
# Addded a comment with debugging information
# 2013-12-22, Josh Dick <[email protected]>
# Version 0.6: Fixed bug that was preventing negative numbers from working with
# the prowl_priority setting
# 2013-12-20, Josh Dick <[email protected]>
# 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 <[email protected]>
# Version 0.4: No longer sending notifications for text you send in private messages
# 2012-09-16, Josh Dick <[email protected]>
# Version 0.3: Removed 'smart_notification' and away_notification' settings
# in favor of more granular notification settings
# 2012-09-16, Josh Dick <[email protected]>
# Version 0.2: Added 'away_notification' setting
# 2012-03-25, Josh Dick <[email protected]>
# Version 0.1: Initial release
import urllib, weechat
weechat.register('weeprowl', 'Josh Dick', '0.7', 'GPL', 'weeprowl: 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 (str(ishilight) == '1' 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 data
request_data = urllib.urlencode({
'apikey': prowl_api_key,
'application': 'weechat',
'event': 'IRC ' + 'Private Message' if isPrivate else 'Mention/Hilight',
'description': 'Channel: ' + chan + '\n' + message,
'priority': prowl_priority
})
# Make the Prowl API request
weechat.hook_process_hashtable(
'url:https://api.prowlapp.com/publicapi/add',
{ 'post': '1', 'postfields': request_data }, # Useful for debugging: { 'verbose': '1', 'ssl_verifypeer': '0' }
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