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