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