Script: pushjet.py

Send highlights and mentions through Pushjet.io. (for WeeChat ≥ 1.0)
Author: p3lim — Version: 0.1.0 — License: MIT.
Added: 2017-05-08.
Download

  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
185
186
# -*- coding: utf-8 -*-
#
# Copyright (C) 2017 p3lim <weechat@p3lim.net>
#
# 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.0'
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 = 'python -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:
			# no relays 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]))