1# by Stefan 'tommie' Tomanek 2use strict; 3 4use 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 16use Irssi; 17use Irssi::Irc; 18use Irssi::TextUI; 19 20use vars qw(%notifies); 21 22sub 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 33sub 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 40sub 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 61sub 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 77Irssi::signal_add('message irc notice', \&sig_message_irc_notice); 78Irssi::statusbar_item_register('noteserv', 0, "draw_bar"); 79 80Irssi::settings_add_str('NoteServ', 'noteserv_ircnet', 'IRCNet'); 81Irssi::settings_add_str('NoteServ', 'noteserv_login', ''); 82Irssi::settings_add_str('NoteServ', 'noteserv_password', ''); 83Irssi::settings_add_bool('NoteServ', 'noteserv_show_offline', 1); 84Irssi::settings_add_bool('NoteServ', 'noteserv_hide_messages', 0); 85 86Irssi::signal_add('event connected', \&sig_event_connected); 87Irssi::signal_add('server disconnected', \&sig_server_disconnected); 88 89print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded'; 90