html/noteserve.pl


   1 # by Stefan 'tommie' Tomanek
   2 use strict;
   3 
   4 use vars qw($VERSION %IRSSI);
   5 $VERSION = "2002123101";
   6 %IRSSI = (
   7     authors     => "Stefan 'tommie' Tomanek",
   8     contact     => "stefan\@pico.ruhr.de",
   9     name        => "NoteServ",
  10     description => "Utilizes NoteServ to implement a buddylist",
  11     license     => "GPLv2",
  12     changed     => "$VERSION",
  13     sbitems     => "noteserv"
  14 );
  15 
  16 use Irssi;
  17 use Irssi::Irc;
  18 use Irssi::TextUI;
  19 
  20 use vars qw(%notifies);
  21 
  22 sub sig_event_connected ($) {
  23     my ($server) = @_;
  24     my $net = Irssi::settings_get_str('noteserv_ircnet');
  25     return unless (lc $server->{tag} eq lc $net);
  26     my $username = Irssi::settings_get_str('noteserv_login');
  27     my $password = Irssi::settings_get_str('noteserv_password');
  28     return unless $username && $password;
  29     $server->command('squery noteserv login '.$username.' '.$password);
  30     $server->command('squery noteserv notify');
  31 }
  32 
  33 sub sig_server_disconnected ($) {
  34     my ($server) = @_;
  35     my $net = Irssi::settings_get_str('noteserv_ircnet');
  36     return unless (lc $server->{tag} eq lc $net);
  37     %notifies = ();
  38 }
  39 
  40 sub sig_message_irc_notice ($$$) {
  41     my ($server, $msg, $nick, $address, $target) = @_;
  42     return unless lc $nick eq 'noteserv';
  43     #print $msg;
  44     if ($msg =~ /\d+\. Notify: (.*?)\!(.*?)\@(.*?) \(.*?\)/) {
  45 	my ($name, $user, $host, $time) = ($1,$2,$3,$4);
  46     } elsif ($msg =~ /^(.*?) \((.*?)\) is on \(.*?\)/) {
  47 	$notifies{$1} = { mask => $2, status => 1 };
  48 	Irssi::statusbar_items_redraw('noteserv');
  49 	Irssi::signal_stop() if Irssi::settings_get_bool('noteserv_hide_messages');
  50     } elsif ($msg =~ /^(.*?) \((.*?)\) gets (in)?visible/) {
  51 	$notifies{$1} = { mask => $2, status => not defined $3 };
  52 	Irssi::statusbar_items_redraw('noteserv');
  53 	Irssi::signal_stop() if Irssi::settings_get_bool('noteserv_hide_messages');
  54     } elsif ($msg =~ /^(.*?) \((.*?)\) signs (on|off)/) {
  55 	$notifies{$1} = { mask => $2, status => ($3 eq 'on') };
  56 	Irssi::statusbar_items_redraw('noteserv');
  57 	Irssi::signal_stop() if Irssi::settings_get_bool('noteserv_hide_messages');
  58     }
  59 }
  60 
  61 sub draw_bar ($$) {
  62     my ($item, $get_size) = @_;
  63     my $line = "";
  64     foreach (keys %notifies) {
  65 	if ($notifies{$_}{status}) {
  66 	    $line .= '%Go%n';
  67 	} else {
  68 	    $line .= '%Ro%n';
  69 	}
  70 	$line .= ' '.$_.' ';
  71     }
  72     my $format = "{sb ".$line."}";
  73     $item->{min_size} = $item->{max_size} = length($line);
  74     $item->default_handler($get_size, $format, 0, 1);
  75 }
  76 
  77 Irssi::signal_add('message irc notice', \&sig_message_irc_notice);
  78 Irssi::statusbar_item_register('noteserv', 0, "draw_bar");
  79 
  80 Irssi::settings_add_str('NoteServ', 'noteserv_ircnet', 'IRCNet');
  81 Irssi::settings_add_str('NoteServ', 'noteserv_login', '');
  82 Irssi::settings_add_str('NoteServ', 'noteserv_password', '');
  83 Irssi::settings_add_bool('NoteServ', 'noteserv_show_offline', 1);
  84 Irssi::settings_add_bool('NoteServ', 'noteserv_hide_messages', 0);
  85 
  86 Irssi::signal_add('event connected', \&sig_event_connected);
  87 Irssi::signal_add('server disconnected', \&sig_server_disconnected);
  88 
  89 print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded';