#!/usr/bin/perl -w
#
# This is a simple Irssi script to send out Growl notifications using
# Mac::Growl. The original version was written by Nelson Elhage. It has 
# been modified by Heather Rivers to allow more notifications and
# customizations.
#

use strict;
use vars qw($VERSION %IRSSI $Notes $AppName $Icon);

use Irssi;
use Mac::Growl;

$VERSION = '1.0';
%IRSSI = (
  authors     =>  'Heather Rivers, based on original script by Nelson Elhage',
  contact     =>  'heather@rive.rs',
  name        =>  'Growl',
  description =>  'Sends out Growl notifications for Irssi',
  license     =>  'BSD',
  url         =>  'http://growl.info/',
);

$Notes = [
  'Script notification',
  'Channel message',
  'Private message',
  'Server notification',
  'Channel notification',
  'Highlight'
];
$AppName = "irssi";

$Icon = '/Users/[you]/.irssi/growl.icns';

sub cmd_growl ($$$) {
  Irssi::print('>> You may configure Growl to notify you using the following settings:');
  Irssi::print('>> %Ggrowl_show_privmsg%n : Notify when you receive a private message.');
  Irssi::print('>> %Ggrowl_show_hilight%n : Notify when a message is highlighted.');
  Irssi::print('>> %Ggrowl_show_notify%n : Notify when someone on your away list joins or leaves.');
  Irssi::print('>> %Ggrowl_show_pubmsg%n : Notify when a public message is received.');
  Irssi::print('>> %Ggrowl_show_server%n : Notify when you connect to or disconnect from a server.');
  Irssi::print('>> %Ggrowl_show_channel%n : Notify when you join or leave a channel.');
  Irssi::print('>> %Ggrowl_show_channel_mode%n : Notify when channel mode is changed.');
  Irssi::print('>> %Ggrowl_show_channel_topic%n : Notify when channel topic is changed.');
}

Mac::Growl::RegisterNotifications($AppName, $Notes, $Notes, $Icon);

# public message
sub sig_message_public ($$$$) {
  return unless Irssi::settings_get_bool('growl_show_pubmsg');
  my ($server, $data, $nick, $address) = @_;
  Mac::Growl::PostNotification($AppName, "Channel message", "$nick:", "$data");
}

# private message
sub sig_message_private ($$$$) {
  return unless Irssi::settings_get_bool('growl_show_privmsg');
  my ($server, $data, $nick, $address) = @_;
  Mac::Growl::PostNotification($AppName, "Private message", "[Private] $nick:", "$data", 1);
}

# print text
sub sig_print_text ($$$) {
  return unless Irssi::settings_get_bool('growl_show_hilight');
  my ($dest, $text, $stripped) = @_;
  if ($dest->{level} & MSGLEVEL_HILIGHT) {
    Mac::Growl::PostNotification($AppName, 'Highlight', $dest->{target}, $stripped, 1);
  }
}

# server connected
sub sig_server_connected ($$$$$$) {
  return unless Irssi::settings_get_bool('growl_show_server');
  my ($server) = @_;
  Mac::Growl::PostNotification($AppName, 'Server notification', 'Server connected', "$server->{chatnet}");
}

# server disconnected
sub sig_server_disconnected ($$$$$$) {
  return unless Irssi::settings_get_bool('growl_show_server');
  my ($server, $nick, $user, $host, $realname, $away) = @_;
  Mac::Growl::PostNotification($AppName, 'Server notification', 'Server disconnected', "$server->{chatnet}");
}

# channel joined
sub sig_channel_joined ($$$$$$) {
  return unless Irssi::settings_get_bool('growl_show_channel');
  my ($channel) = @_;
  Mac::Growl::PostNotification($AppName, 'Channel notification', 'Channel joined', "$channel->{name}");
}

# channel mode changed
sub sig_channel_mode_changed ($$$$$$) {
  return unless Irssi::settings_get_bool('growl_show_channel_mode');
  my ($channel_mode, $setby) = @_;
  Mac::Growl::PostNotification($AppName, 'Channel notification', 'Channel mode changed by $setby', "$channel_mode");
}

# topic changed
sub sig_channel_topic_changed ($$$$$$) {
  return unless Irssi::settings_get_bool('growl_show_channel_topic');
  my ($channel_topic) = @_;
  Mac::Growl::PostNotification($AppName, 'Message notification', 'Channel topic changed', "$channel_topic");
}

Irssi::command_bind('growl', 'cmd_growl');

Irssi::signal_add_last('message public', \&sig_message_public);
Irssi::signal_add_last('message private', \&sig_message_private);
Irssi::signal_add_last('print text', \&sig_print_text);
Irssi::signal_add_last('server connected', \&sig_server_connected);
Irssi::signal_add_last('server disconnected', \&sig_server_disconnected);
Irssi::signal_add_last('channel joined', \&sig_channel_joined);
Irssi::signal_add_last('channel mode changed', \&sig_channel_mode_changed);
Irssi::signal_add_last('channel topic changed', \&sig_channel_topic_changed);

Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_pubmsg', 1);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_privmsg', 1);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_hilight', 1);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_server', 1);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_channel', 1);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_channel_mode', 0);
Irssi::settings_add_bool($IRSSI{'name'}, 'growl_show_channel_topic', 0);

Mac::Growl::PostNotification(
  $AppName,
  'Script notification',
  $IRSSI{name}.' '.$VERSION.' loaded',
  '/growl for help'
);
Irssi::print('%G>>%n '.$IRSSI{name}.' '.$VERSION.' loaded (/growl for help)');
