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';