forked from p3lim/weechat-pushjet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpushjet.py
184 lines (153 loc) · 5.37 KB
/
pushjet.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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# -*- coding: utf-8 -*-
# https://github.com/p3lim/weechat-pushjet
try:
import weechat
except ImportError:
from sys import exit
print('This script has to run under WeeChat (https://weechat.org/).')
exit(1)
from urllib import urlencode
SCRIPT_NAME = 'pushjet'
SCRIPT_AUTHOR = 'p3lim'
SCRIPT_VERSION = '0.1.1'
SCRIPT_LICENSE = 'MIT'
SCRIPT_DESC = 'Send highlights and mentions through Pushjet.io'
SETTINGS = {
'host': (
'https://api.pushjet.io',
'host for the pushjet api'),
'secret': (
'',
'secret for the pushjet api'),
'level': (
'4',
'severity level for the message, from 1 to 5 (low to high)'),
'timeout': (
'30',
'timeout for the message sending in seconds (>= 1)'),
'separator': (
': ',
'separator between nick and message in notifications'),
'notify_on_highlight': (
'on',
'push notifications for highlights in buffers (on/off)'),
'notify_on_privmsg': (
'on',
'push notifications for private messages (on/off)'),
'notify_when': (
'always',
'when to push notifications (away/detached/always/never)'),
'ignore_buffers': (
'',
'comma-separated list of buffers to ignore'),
'ignore_nicks': (
'',
'comma-separated list of users to not push notifications from'),
}
def send_message(title, message):
secret = weechat.config_get_plugin('secret')
if secret != '':
data = {
'secret': secret,
'level': int(weechat.config_get_plugin('level')),
'title': title,
'message': message,
}
host = weechat.config_get_plugin('host').rstrip('/') + '/message'
timeout = int(weechat.config_get_plugin('timeout')) * 1000
if timeout <= 0:
timeout = 1
data = urlencode(data)
cmd = 'python2 -c \'from urllib2 import Request, urlopen; r = urlopen(Request("%s", "%s")); print r.getcode()\'' % (host, data)
weechat.hook_process(cmd, timeout, 'send_message_callback', '')
def send_message_callback(data, command, return_code, out, err):
if return_code != 0:
# something went wrong
return weechat.WEECHAT_RC_ERROR
return weechat.WEECHAT_RC_OK
def get_sender(tags, prefix):
# attempt to find sender from tags
# nicks are always prefixed with 'nick_'
for tag in tags:
if tag.startswith('nick_'):
return tag[5:]
# fallback method to find sender from prefix
# nicks in prefixes are prefixed with optional modes (e.g @ for operators)
# so we have to strip away those first, if they exist
if prefix.startswith(('~', '&', '@', '%', '+', '-', ' ')):
return prefix[1:]
return prefix
def get_buffer_names(buffer):
buffer_names = []
buffer_names.append(weechat.buffer_get_string(buffer, 'short_name'))
buffer_names.append(weechat.buffer_get_string(buffer, 'name'))
return buffer_names
def should_send(buffer, tags, nick, highlighted):
if not nick:
# a nick is required to form a correct message, bail
return False
if highlighted:
if weechat.config_get_plugin('notify_on_highlight') != 'on':
# notifying on highlights is disabled, bail
return False
elif weechat.buffer_get_string(buffer, 'localvar_type') == 'private':
if weechat.config_get_plugin('notify_on_privmsg') != 'on':
# notifying on private messages is disabled, bail
return False
else:
# not a highlight or private message, bail
return False
notify_when = weechat.config_get_plugin('notify_when')
if notify_when == 'never':
# user has opted to not be notified, bail
return False
elif notify_when == 'away':
# user has opted to only be notified when away
infolist_args = (
weechat.buffer_get_string(buffer, 'localvar_channel'),
weechat.buffer_get_string(buffer, 'localvar_server'),
weechat.buffer_get_string(buffer, 'localvar_nick')
)
if not None in infolist_args:
infolist = weechat.infolist_get('irc_nick', '', ','.join(infolist_args))
if infolist:
away_status = weechat.infolist_integer(infolist, 'away')
if not away_status:
# user is not away, bail
return False
elif notify_when == 'detached':
# user has opted to only be notified when detached (relays)
num_relays = weechat.info_get('relay_client_count', 'connected')
if num_relays != 0:
# some relay(s) connected, bail
return False
if nick == weechat.buffer_get_string(buffer, 'localvar_nick'):
# the sender was the current user, bail
return False
if nick in weechat.config_get_plugin('ignore_nicks').split(','):
# the sender was on the ignore list, bail
return False
for buffer_name in get_buffer_names(buffer):
if buffer_name in weechat.config_get_plugin('ignore_buffers').split(','):
# the buffer was on the ignore list, bail
return False
return True
def message_callback(data, buffer, date, tags, displayed, highlight, prefix, message):
nick = get_sender(tags, prefix)
if should_send(buffer, tags, nick, int(highlight)):
message = '%s%s%s' % (nick, weechat.config_get_plugin('separator'), message)
if int(highlight):
buffer_names = get_buffer_names(buffer)
send_message(buffer_names[0] or buffer_names[1], message)
else:
send_message('Private Message', message)
return weechat.WEECHAT_RC_OK
# register plugin
weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, '', '')
# grab all messages in any buffer
weechat.hook_print('', '', '', 1, 'message_callback', '')
# register configuration defaults
for option, value in SETTINGS.items():
if not weechat.config_is_set_plugin(option):
weechat.config_set_plugin(option, value[0])
weechat.config_set_desc_plugin(option, '%s (default: "%s")' % (value[1], value[0]))