# # Copyright (c) 2009 by kinabalu (andrew AT mysticcoders DOT com) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # # Growl Notification script over network using Net::Growl # # History: # # 2009-05-02, FlashCode : # version 0.5, sync with last API changes # # 2009-04-25, kinabalu # version 0.4, version upgrade, minor cleanup of source # # 2009-04-18, kinabalu # version 0.3, version upgraded to support weechat 0.3.0+ # # 2009-04-16, kinabalu # version 0.2, removed need for Parse::IRC # # 2009-04-10, kinabalu # version 0.1, initial version rewritten from growl-notify # - original inspiration from growl-notify.pl author Zak Elep # # /growl and /gl can be used in combination with these actions # # /growl on # /growl off # /growl setup [host] [password] # /growl inactive [time_in_seconds] # /growl status # /growl test [message] # /help growl # # The script can be laoded into WeeChat by executing: # # /perl load growl_net_notify.pl # # The script may also be auto-loaded by WeeChat. See the # WeeChat manual for instructions about how to do this. # # This script was tested with WeeChat version 0.2.6. An # updated version of this script will be available when # the new WeeChat API is officially released. # # For up-to-date information about this script, and new # version downloads, please go to: # # http://www.mysticcoders.com/apps/growl-notify/ # # If you have any questions, please contact me on-line at: # # irc.freenode.net - kinabalu (op): ##java # # - kinabalu # use Net::Growl; use integer; my $growl_app = "growl_net_notify"; # name given to Growl for configuration my $growl_active = 1; sub message_process_init { weechat::hook_signal("weechat_pv", "highlight_privmsg", ""); weechat::hook_print( "", "", "", 1, "highlight_public", ""); } # # 0.3.0 clean version of highlighting for private messages # sub highlight_privmsg { my ( $nick, $message ) = ( $_[2] =~ /(.*?)\t(.*)/ ); send_message($nick, $message); return weechat::WEECHAT_RC_OK; } # # 0.3.0 clean version of highlighting for public messages # sub highlight_public { my ( $data, $bufferp, undef, undef, undef, $ishilight, $nick, $message ) = @_; if( $ishilight == 1 ) { $channel = weechat::buffer_get_string( $bufferp, "localvar_channel" ) || 'UNDEF'; send_message($nick, $message . ($channel ne 'UNDEF' ? ' in ' . $channel : '')); } return weechat::WEECHAT_RC_OK; } sub send_message { my ( $nick, $message ) = @_; my $inactivity = 0; $inactivity = weechat::info_get("inactivity", ""); if((&getc('growl_net_inactivity') - $inactivity) <= 0 && $growl_active) { growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "$nick", "$message" ); } } # # smaller way to do weechat::get_plugin_config # sub getc { return weechat::config_get_plugin($_[0]); } # # smaller way to do weechat::get_plugin_config # sub setc { return weechat::config_set_plugin($_[0], $_[1]); } # # print function # sub prt { weechat::print("buffer", $_[0]); } # # Send notification through growl # # args: $host, $pass, $port, $application_name, $title, $description # sub growl_notify { Net::Growl::notify( host=> $_[0], password=> $_[1], port=> $_[2], application=> $_[3], title=> $_[4], description => $_[5], priority=> 0, sticky=> '1' ); } # # Register your app with Growl system # # args: $host, $pass, $port, $app # sub growl_register { Net::Growl::register( host=> $_[0], password=> $_[1], port=> $_[2], application=> $_[3] ); } # # Handler will process commands # # /growl on # /growl off # /growl setup [host] [password] [port] # /growl inactive [time_in_seconds] # /growl status # /growl test [message] # /help growl # sub handler { no strict 'refs'; # access symbol table my $data = shift; my $buffer = shift; my $argList = shift; my @args = split(/ /, $argList); my $command = $args[0]; if(!$command) { prt("Rawr!"); return weechat::WEECHAT_RC_OK; } if($command eq "off") { $growl_active = 0; prt("Growl notifications: OFF"); return weechat::WEECHAT_RC_OK; } elsif($command eq "on") { $growl_active = 1; prt("Growl notifications: ON"); return weechat::WEECHAT_RC_OK; } elsif($command eq "inactive") { if(exists $args[1] && $args[1] >= 0) { setc("growl_net_inactivity", $args[1]); prt("Growl notifications inactivity set to: " . $args[1] . "s"); return weechat::WEECHAT_RC_OK; } return weechat::WEECHAT_RC_ERROR; } elsif($command eq "setup") { if(exists $args[1] && $args[1] ne "") { setc("growl_net_client", $args[1]); } if(exists $args[2] && $args[2] ne "") { setc("growl_net_pass", $args[2]); } if(exists $args[3] && $args[3] ne "") { setc("growl_net_port", $args[3]); } growl_register( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app" ); prt("Growl setup re-registered with: [host: " . &getc('growl_net_client') . ":" . &getc('growl_net_port') . ", pass: " . &getc('growl_net_pass') . "]"); return weechat::WEECHAT_RC_OK; } elsif($command eq "status") { prt("Growl notifications: " . ($growl_active ? "ON" : "OFF") . ", inactivity timeout: " . &getc("growl_net_inactivity")); return weechat::WEECHAT_RC_OK; } elsif($command eq "test") { my $test_message = substr $argList, 5; prt("Sending test message: " . $test_message); growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "Test Message", $test_message ); return weechat::WEECHAT_RC_OK; } return weechat::WEECHAT_RC_ERROR; } # # setup # my $version = '0.5'; weechat::register("$growl_app", "kinabalu ", $version, "GPL3", "Send Weechat notifications thru Net::Growl", "", ""); weechat::hook_command("growl", "setup the growl notify script", "on|off|setup [host] [password] [port]|inactive [time_in_seconds]|status|help", " on: turn on growl notifications (default)\n" ."off: turn off growl notifications\n" ."setup [host] [password] [port]: change the parameters for registration/notification with Growl\n" ."inactive [time_in_seconds]: number of seconds of inactivity before we notify (default: 30)\n" ."status: gives info on notification and inactivity settings\n" ."test [message]: send a test message\n", "on|off|setup|inactive|status","handler",""); my $default_growl_net_pass = "password"; my $default_growl_net_client = "localhost"; my $default_growl_net_inactivity = 30; my $default_growl_net_port = 9887; # default UDP port used by Growl &setc("growl_net_pass", $default_growl_net_pass) if (&getc("growl_net_pass") eq ""); &setc("growl_net_client", $default_growl_net_client) if (&getc("growl_net_client") eq ""); &setc("growl_net_inactivity", $default_growl_net_inactivity) if (&getc("growl_net_inactivity") eq ""); &setc("growl_net_port", $default_growl_net_port) if (&getc("growl_net_port") eq ""); # register our app with growl growl_register( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app" ); # send up a we're here and notifying growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "Starting Up", "Weechat notification through Growl = on" ); message_process_init();