From a4471f71aad10433725161dff9ac39b8f23c4d77 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 12 Jul 2013 23:37:31 +0200 Subject: notifyudp: initial checkin of 0.2.20130614 Originally posted on http://askubuntu.com/a/61656/6969 by me. Description: This version does not react on all messages (like parted/joined). If you want to get such spam notifications, remove the leading `#` in the `#'print text'` line. Some rate-limiting is implemented, there will be at least 1.3 seconds delay between notifications. --- notifyudp.pl | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 notifyudp.pl diff --git a/notifyudp.pl b/notifyudp.pl new file mode 100644 index 0000000..9f878aa --- /dev/null +++ b/notifyudp.pl @@ -0,0 +1,120 @@ +## +## Put me in ~/.irssi/scripts, and then execute the following in irssi: +## +## /load perl +## /script load notifyudp +## + +use strict; +use Irssi; +use IO::Socket; +use vars qw($VERSION %IRSSI); +use Time::HiRes qw(time); + +$VERSION = "0.2.20130614"; +%IRSSI = ( + authors => 'Lekensteyn', + contact => 'lekensteyn@gmail.com', + name => 'notifyudp.pl', + description => 'Send a UDP signal to a remote machine', + license => 'GPLv3+' +); + +Irssi::settings_add_str('notifyudp', 'notifyudp_ip_addr', ''); +# port 0 = disabled +Irssi::settings_add_int('notifyudp', 'notifyudp_port', 0); +Irssi::settings_add_bool('notifyudp', 'notifyudp_auto_start', 0); + +my $sock; + +sub notify_load { + if ($sock) { + Irssi::print('NotifyUDP: Already connected.'); + return; + } + my $ip = Irssi::settings_get_str('notifyudp_ip_addr'); + my $port = Irssi::settings_get_int('notifyudp_port'); + if (!$port || !$ip) { + Irssi::print('NotifyUDP: No port or host set, /set notifyudp for more information..'); + return; + } + if ($port < 1024 || $port > 65535) { + Irssi::print('NotifyUDP: Invalid port, must be 1024 <= port <= 65535, resetting and ignoring.'); + Irssi::settings_set_int('notifyudp_port', 0); + return; + } + $sock = new IO::Socket::INET( + PeerAddr => $ip, + PeerPort => $port, + Proto => 'udp', + Timeout => 1 + ); + Irssi::print("NotifyUDP: IP $ip will be notified on port $port."); +} + +my $last_time = 0; +sub notify { + if ($sock) { + my $now = time; + my $notify_delay = 1.3; + if (abs($now - $last_time) > $notify_delay) { + $last_time = $now; + $sock->send("M"); + } + } +} + +sub notify_stop { + if ($sock) { + Irssi::print("NotifyUDP: Stopping."); + $sock->send("S"); + $sock = undef; + } else { + Irssi::print("NotifyUDP: not active."); + } +} + +sub cmd_notifyudp { + my ($cmd) = @_; + if ($cmd eq 'start') { + notify_load(); + } elsif ($cmd eq 'stop') { + notify_stop(); + } elsif ($cmd eq 'ping') { + notify(); + } else { + Irssi::print('NotifyUDP: Usage: /notifyudp [start|stop|ping]'); + } +} + +Irssi::command_bind('notifyudp', 'cmd_notifyudp'); + +my @signals = ( +#'print text', # too verbose? +'message public', +'message private', +'dcc request', + +'message irc notice', # NickServ responses and such + +# whenever the server dies +'server connected', +'server connect failed', +'server disconnected', + +'message invite', +'message topic', +'message dcc', +'ctcp msg', +'ctcp reply', +); +foreach (@signals) { + Irssi::signal_add($_, 'notify'); +} + +if (Irssi::settings_get_bool('notifyudp_auto_start')) { + Irssi::print('NotifyUDP: automatic connection with the sound server is enabled.'); + notify_load(); +} else { + Irssi::print('NotifyUDP: automatic connection with the sound server is disabled.'); +} -- cgit v1.2.1