1use strict;
2
3use vars qw($VERSION %IRSSI);
4$VERSION = "20030208";
5%IRSSI = (
6    authors     => "Stefan 'tommie' Tomanek",
7    contact     => "stefan\@pico.ruhr.de",
8    name        => "VerStats",
9    description => "Draws a diagram of the used clients in a channel",
10    license     => "GPLv2",
11    url         => "http://scripts.irssi.org",
12    changed     => "$VERSION",
13    commands	=> "verstats"
14);
15
16
17use Irssi;
18
19use vars qw(%clients $timeout);
20
21sub draw_box ($$$$) {
22    my ($title, $text, $footer, $colour) = @_;
23    my $box = '';
24    $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
25    foreach (split(/\n/, $text)) {
26        $box .= '%R|%n '.$_."\n";
27    }
28    $box .= '%R`--<%n'.$footer.'%R>->%n';
29    $box =~ s/%.//g unless $colour;
30    return $box;
31}
32
33
34sub sig_ctcp_reply_version ($$$$$) {
35    my ($server, $args, $nick, $addr, $target) = @_;
36    return unless $timeout;
37    Irssi::timeout_remove($timeout);
38    if ($args =~ /^(.*?)( |\/|$)/) {
39	my $client = lc($1);
40	$client =~ s/^[^\w]//;
41	$client =~ s/%.//g;
42	#$clients{$client} = 0 unless defined $clients{$client};
43	push @{$clients{$client}}, $nick;
44    }
45    $timeout = Irssi::timeout_add(5000, \&finished, undef);
46}
47
48sub finished {
49    my $max=0;
50    foreach (keys %clients) {
51	$max = @{$clients{$_}} if $max < @{$clients{$_}};
52    }
53    return if $max == 0;
54    my $width = 60;
55    my $block = $width/$max;
56    my $text;
57    foreach (sort {@{$clients{$b}} <=> @{$clients{$a}}} keys %clients) {
58	s/%/%%/g;
59	$text .= "'".$_."'".': '.@{$clients{$_}}."\n";
60	my $bar = '#'x(($block * @{$clients{$_}})-1);
61	$text .= $bar.">\n";
62	#$text .= $_.' ' foreach (@{$clients{$_}});
63	#$text .= "\n";
64    }
65    %clients = ();
66    print CLIENTCRAP draw_box('VerStats', $text, 'stats', 1);
67    Irssi::timeout_remove($timeout);
68    $timeout = undef;
69}
70
71sub cmd_verstats ($$$) {
72    my ($args, $server, $witem) = @_;
73    return unless ($server && ref $witem && $witem->{type} eq 'CHANNEL');
74    $witem->command('ctcp '.$witem->{name}.' version');
75    $timeout = Irssi::timeout_add(5000, \&finished, undef)
76}
77
78Irssi::signal_add('ctcp reply version' => \&sig_ctcp_reply_version);
79Irssi::command_bind('verstats' => \&cmd_verstats);
80
81print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded';
82