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