diff options
Diffstat (limited to 'scripts/pushsafer.pl')
| -rw-r--r-- | scripts/pushsafer.pl | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/scripts/pushsafer.pl b/scripts/pushsafer.pl new file mode 100644 index 0000000..584f19c --- /dev/null +++ b/scripts/pushsafer.pl @@ -0,0 +1,312 @@ +use strict; +use warnings; + +use Irssi; +use vars qw($VERSION %IRSSI %config); +use LWP::UserAgent; +use Scalar::Util qw(looks_like_number); + +$VERSION = '0.0.1'; + +%IRSSI = ( + authors => 'Kevin Siml', + contact => 'kevinsiml@googlemail.com', + name => 'pushsafer', + description => 'Push hilights and private messages when away by the pushsafer.com API', + license => 'BSD', + url => 'https://www.pushsafer.com', + changed => "2017-03-31" +); + +my $pushsafer_ignorefile; + + +sub cmd_help { + my $out = <<'HELP_EOF'; +PUSHIGNORE LIST +PUSHIGNORE ADD <hostmask> +PUSHIGNORE REMOVE <number> + +The mask matches in the format ident@host. Notice that no-ident responses puts +a tilde in front of the ident. + +Examples: + Will match foo@test.bar.de but *not* ~foo@test.bar.se. + /PUSHIGNORE ADD foo@*.bar.de + Use the list-command to show a list of ignores and the number in front + combined with remove to delete that mask. + /PUSHIGNORE REMOVE 2 + +For a list of available settings, run: + /set pushsafer +HELP_EOF + chomp $out; + Irssi::print($out, MSGLEVEL_CLIENTCRAP); +} +sub read_settings { + $pushsafer_ignorefile = Irssi::settings_get_str('pushsafer_ignorefile'); +} + +sub debug { + return unless Irssi::settings_get_bool('pushsafer_debug'); + my $text = shift; + my @caller = caller(1); + Irssi::print('From '.$caller[3].': '.$text); +} + +sub send_push { + my $private_key = Irssi::settings_get_str('pushsafer_key'); + if (!$private_key) { + debug('Missing Pushsafer.com private or alias_key.'); + return; + } + + debug('Sending notification.'); + my ($channel, $text) = @_; + my $resp = LWP::UserAgent->new()->post( + 'https://www.pushsafer.com/api', [ + k => $private_key, + m => $text, + d => Irssi::settings_get_str('pushsafer_device'), + s => Irssi::settings_get_str('pushsafer_sound'), + i => Irssi::settings_get_str('pushsafer_icon'), + v => Irssi::settings_get_str('pushsafer_vibration'), + u => Irssi::settings_get_str('pushsafer_url'), + ut => Irssi::settings_get_str('pushsafer_urltitle'), + l => Irssi::settings_get_str('pushsafer_time2live'), + t => $channel + ] + ); + + if ($resp->is_success) { + debug('Notification successfully sent.'); + } + else { + debug('Notification not sent: '.$resp->decoded_content); + } +} + +sub msg_pub { + my ($server, $data, $nick, $address, $target) = @_; + my $safeNick = quotemeta($server->{nick}); + + if(check_ignore_channels($target)) { + return; + } + + if(check_ignore($address) || check_away($server)) { + return; + } + + if ($data =~ /$safeNick/i) { + debug('Got pub msg.'); + send_push($target, $nick.': '.Irssi::strip_codes($data)); + } +} + +sub msg_print_text { + my ($dest, $text, $stripped) = @_; + my $server = $dest->{server}; + my $target = $dest->{target}; + + return if (!$server || !($dest->{level} & MSGLEVEL_HILIGHT)); + + if(check_ignore_channels($target)) { + return; + } + + if(check_away($server)) { + return; + } + + debug('Got nick highlight'); + $stripped =~ s/^\s+|\s+$//g; + send_push($target, $stripped); +} + +sub msg_pri { + my ($server, $data, $nick, $address) = @_; + + if(check_ignore($address) || check_away($server)) { + return; + } + debug('Got priv msg.'); + send_push('Priv, '.$nick, Irssi::strip_codes($data)); +} + +sub msg_kick { + my ($server, $channel, $nick, $kicker, $address, $reason) = @_; + + if(check_ignore($address) || check_away($server)) { + return; + } + + if ($nick eq $server->{nick}) { + debug('Was kicked.'); + send_push('Kicked: '.$channel, 'Was kicked by: '.$kicker.'. Reason: '.Irssi::strip_codes($reason)); + } +} + +sub msg_test { + my ($data, $server, $item) = @_; + $data =~ s/^([\s]+).*$/$1/; + my $orig_debug = Irssi::settings_get_bool('pushsafer_debug'); + Irssi::settings_set_bool('pushsafer_debug', 1); + debug("Sending test message :" . $data); + send_push("Test Message", Irssi::strip_codes($data)); + Irssi::settings_set_bool('pushsafer_debug', $orig_debug); +} + +# check our away status & pushsafer_only_if_away. returns 0 if it's ok to send a message. +sub check_away { + my ($server) = @_; + my $msg_only_if_away = Irssi::settings_get_bool('pushsafer_only_if_away'); + if ($msg_only_if_away && $server->{usermode_away} != '1') { + debug("Only sending messages if we're marked as away, and we're not"); + return 1; + } + return 0; +} + +sub check_ignore { + return 0 unless(Irssi::settings_get_bool('pushsafer_ignore')); + my @ignores = read_file(); + return 0 unless(@ignores); + my ($mask) = @_; + + foreach (@ignores) { + $_ =~ s/\./\\./g; + $_ =~ s/\*/.*?/g; + if ($mask =~ m/^$_$/i) { + debug('Ignore matches, not pushing.'); + return 1; + } + } + return 0; +} + +sub check_ignore_channels { + my ($target) = @_; + my @ignore_channels = split(' ', Irssi::settings_get_str('pushsafer_ignorechannels')); + return 0 unless @ignore_channels; + if (grep {lc($_) eq lc($target)} @ignore_channels) { + debug("$target set as ignored channel."); + return 1; + } + return 0; +} + +sub ignore_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; + Irssi::command_runsub('pushignore', $data, $server, $item); +} + +sub ignore_unknown { + cmd_help(); + Irssi::signal_stop(); # Don't print 'no such command' error. +} + +sub ignore_list { + my @data = read_file(); + if (@data) { + my $i = 1; + my $out; + foreach(@data) { + $out .= $i++.". $_\n"; + } + chomp $out; + Irssi::print($out, MSGLEVEL_CLIENTCRAP); + } +} + +sub ignore_add { + my ($data, $server, $item) = @_; + $data =~ s/^([\s]+).*$/$1/; + return Irssi::print("No hostmask given.", MSGLEVEL_CLIENTCRAP) unless($data ne ""); + + my @ignores = read_file(); + push(@ignores, $data); + write_file(@ignores); + Irssi::print("Successfully added '$data'.", MSGLEVEL_CLIENTCRAP); +} + +sub ignore_remove { + my($num, $server, $item) = @_; + $num =~ s/^(\d+).*$/$1/; + return Irssi::print("List-number is needed when removing", MSGLEVEL_CLIENTCRAP) unless(looks_like_number($num)); + my @ignores = read_file(); + + # Index out of range + return Irssi::print("Number was out of range.", MSGLEVEL_CLIENTCRAP) unless(scalar(@ignores) >= $num); + delete $ignores[$num-1]; + write_file(@ignores); +} + +sub write_file { + read_settings(); + my $fp; + if (!open($fp, ">", $pushsafer_ignorefile)) { + Irssi::print("Error opening ignore file", MSGLEVEL_CLIENTCRAP); + return; + } + print $fp join("\n", @_); + close $fp; +} + +sub read_file { + read_settings(); + my $fp; + if (-e $pushsafer_ignorefile) { + if (!open($fp, "<", $pushsafer_ignorefile)) { + Irssi::print("Error opening ignore file", MSGLEVEL_CLIENTCRAP); + return; + } + } + + my @out; + while (<$fp>) { + chomp; + next if $_ eq ''; + push(@out, $_); + } + close $fp; + + return @out; +} + +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_key', ''); +Irssi::settings_add_bool($IRSSI{'name'}, 'pushsafer_debug', 0); +Irssi::settings_add_bool($IRSSI{'name'}, 'pushsafer_ignore', 1); +Irssi::settings_add_bool($IRSSI{'name'}, 'pushsafer_only_if_away', 0); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_ignorefile', Irssi::get_irssi_dir().'/pushsafer_ignores'); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_ignorechannels', ''); + +# Check the Pushsafer.com API > https://www.pushsafer.com/en/pushapi for replacing params +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_sound', '21'); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_device', ''); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_icon', '25'); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_vibration', '0'); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_url', ''); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_urltitle', ''); +Irssi::settings_add_str($IRSSI{'name'}, 'pushsafer_time2live', ''); + +Irssi::command_bind('help pushignore', \&cmd_help); +Irssi::command_bind('pushignore help', \&cmd_help); +Irssi::command_bind('pushignore add', \&ignore_add); +Irssi::command_bind('pushignore remove', \&ignore_remove); +Irssi::command_bind('pushignore list', \&ignore_list); +Irssi::command_bind('pushignore', \&ignore_handler); +Irssi::command_bind('pushtest', \&msg_test); +Irssi::signal_add_first("default command pushignore", \&ignore_unknown); + + +#Irssi::signal_add_last('message public', 'msg_pub'); +Irssi::signal_add_last('print text', 'msg_print_text'); +Irssi::signal_add_last('message private', 'msg_pri'); +Irssi::signal_add_last('message kick', 'msg_kick'); + +Irssi::print('%Y>>%n '.$IRSSI{name}.' '.$VERSION.' loaded.'); +if (!Irssi::settings_get_str('pushsafer_key')) { + Irssi::print('%Y>>%n '.$IRSSI{name}.' Pushsafer.com private or alias key is not set, set it with /set pushsafer_key YourPrivateOrAliasKey'); +} |
