✨
This commit is contained in:
commit
945ff82bfa
19
LICENSE.txt
Normal file
19
LICENSE.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2017 Adrian L Lange
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
46
README.md
Normal file
46
README.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# weechat-pushjet
|
||||||
|
|
||||||
|
A [WeeChat](https://weechat.org/) plugin that sends highlights and/or private message notifications through [Pushjet](https://pushjet.io/).
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
In WeeChat install the script by typing the following:
|
||||||
|
```
|
||||||
|
/script install pushjet.py
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're using the public push server, all you have to do is set the _`secret`_ option in the configuration.
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
The plugin allows you to set a few options through the normal WeeChat settings system.
|
||||||
|
You'll find all of them under _`plugins.var.python.pushjet`_, and all of them have helpful descriptions.
|
||||||
|
|
||||||
|
To set them use _`/set plugins.var.python.pushjet.foo bar`_ or through the [iset.pl](https://weechat.org/scripts/source/iset.pl.html) plugin.
|
||||||
|
|
||||||
|
- `host`
|
||||||
|
- host for the pushjet api (default: "https://api.pushjet.io")
|
||||||
|
- `secret`
|
||||||
|
- secret for the pushjet api (default: "")
|
||||||
|
- `level`
|
||||||
|
- severity level for the message, from 1 to 5 (low to high) (default: 4)
|
||||||
|
- `timeout`
|
||||||
|
- timeout for the message sending in seconds (>= 1) (default: 30)
|
||||||
|
- `separator`
|
||||||
|
- separator between nick and message in notifications (default: ": ")
|
||||||
|
- `notify_on_highlight`
|
||||||
|
- push notifications for highlights in buffers (on/off) (default: "on")
|
||||||
|
- `notify_on_privmsg`
|
||||||
|
- push notifications for private messages (on/off) (default: "on")
|
||||||
|
- `notify_when`
|
||||||
|
- when to push notifications (away/detached/always/never) (default: "always")
|
||||||
|
- `ignore_buffers`
|
||||||
|
- comma-separated list of buffers to ignore (default: "")
|
||||||
|
- `ignore_nicks`
|
||||||
|
- comma-separated list of users to not push notifications from (default: "")
|
||||||
|
|
||||||
|
### Issues
|
||||||
|
|
||||||
|
- The currently available version of Pushjet is sending the wrong error codes for errors.
|
||||||
|
This means that if your settings are invalid it's very hard to find out exactly what is wrong.
|
||||||
|
- Away status can't be checked when receiving private messages
|
184
pushjet.py
Normal file
184
pushjet.py
Normal file
@ -0,0 +1,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.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]))
|
Loading…
Reference in New Issue
Block a user