1#!/usr/local/bin/perl -w 2# shows top[0-9]+ irc client versions in a channel 3# by c0ffee 4# - http://www.penguin-breeder.org/?page=irssi 5 6#<scriptinfo> 7use strict; 8use vars qw($VERSION %IRSSI); 9 10use Irssi 20020120; 11$VERSION = "0.1"; 12%IRSSI = ( 13 authors => "c0ffee", 14 contact => "c0ffee\@penguin-breeder.org", 15 name => "version-stats", 16 description => "shows top[0-9]+ irc client versions in a channel", 17 license => "Public Domain", 18 url => "http://www.penguin-breeder.org/?page=irssi", 19 changed => "Sun Apr 14 17:30 GMT 2002", 20); 21#</scriptinfo> 22 23my %versions; 24my $tag; 25my $running = 0; 26 27sub version_reply { 28 my ($server, $data, $nick, $addr, $target) = @_; 29 30 $versions{$data} = 1 + $versions{$data} if $running; 31 32 if (not Irssi::settings_get_bool('mute_version_reply') or not $running) { 33 34 35 Irssi::signal_emit("default ctcp reply", $server, "VERSION $data", $nick, $addr, $target); 36 37 } 38 39 40} 41 42sub show_stats { 43 44 my ($data) = @_; 45 my @stats = map "$versions{$_},$_", sort { $versions{$b} <=> $versions{$a} } keys %versions; 46 my ($top,$best,$cnt,$v,$foo,$bar); 47 $running = 0; 48 49 ($top,$best) = $data =~ /(.*)\/(.*)/; 50 51 Irssi::print("VERSION stats:"); 52 53 Irssi::timeout_remove($tag); 54 55 foreach (1..$top) { 56 last if not defined $stats[$_ - 1]; 57 ($cnt,$v) = $stats[$_ - 1] =~ /(.*?),(.*)/; 58 $bar = $cnt * 20 / $best; 59 $foo = "|" x $bar . "." x (20 - $bar), 60 Irssi::print("$_. [$foo]: ($cnt) $v"); 61 } 62 63} 64 65sub cmd_vstat { 66 my ($data, $server, $channel) = @_; 67 my ($period, $top,@nicks,$num); 68 69 Irssi::print("usage: /vstat period-in-secs top-n"), return 70 if not (($period, $top) = $data =~ /(\d+)\s+(\d+)/); 71 72 @nicks = $channel->nicks(); 73 74 $num = @nicks; 75 76 $tag = Irssi::timeout_add($period * 1000, 'show_stats', "$top/$num"); 77 78 undef %versions; 79 $running = 1; 80 81 $server->send_raw("PRIVMSG $channel->{name} :\001VERSION\001"); 82 Irssi::print("Starting version collection in $channel->{name}"); 83 84} 85 86Irssi::signal_add_last('ctcp reply version', 'version_reply'); 87Irssi::command_bind('vstat', 'cmd_vstat'); 88Irssi::settings_add_bool('misc', 'mute_version_reply', 1); 89