+sub do_verstats {
+ my ($chan) = @_;
+
+ if (!defined $chan) {
+ &help("verstats");
+ return;
+ }
+
+ if (!&validChan($chan)) {
+ &pSReply("chan $chan is invalid.");
+ return;
+ }
+
+ if (scalar keys %ver or scalar @vernick) {
+ &DEBUG("verstats already in progress.");
+ return;
+ }
+
+ &msg($who, "Sending CTCP VERSION...");
+ $conn->ctcp("VERSION", $chan);
+ $conn->schedule(60, sub {
+ my $vtotal = 0;
+ my $total = keys %{ $channels{lc $chan}{''} };
+
+ foreach (keys %ver) {
+ $vtotal += scalar keys %{ $ver{$_} };
+ }
+
+ my %sorted;
+ my $unknown = $total - $vtotal;
+ my $perc = sprintf("%.1f", $unknown * 100 / $total);
+ $sorted{$perc} = "unknown/cloak - $unknown ($perc %)";
+ $perc =~ s/.0$//;
+
+ foreach (keys %ver) {
+ my $count = scalar keys %{ $ver{$_} };
+ $perc = sprintf("%.01f", $count * 100 / $total);
+ $perc =~ s/.0$//; # lame compression.
+
+ if (exists $sorted{$perc}) {
+ &WARN("sorted{$perc} already exists; FIXME.");
+ }
+
+ $sorted{$perc} = "$_ - $count ($perc %)";
+ }
+
+ ### can be compressed to a map?
+ my @list;
+ foreach ( sort { $a <=> $b } keys %sorted ) {
+ push(@list, $sorted{$_});
+ }
+
+ &pSReply( &formListReply(0, "IRC Client versions for $chan ", @list) );
+
+ # clean up not-needed data structures.
+ undef %ver;
+ undef @vernick;
+ } );
+
+ return;
+}
+