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