]> git.donarmstrong.com Git - infobot.git/blobdiff - src/CommandStubs.pl
support for new dynamic configuration infrastructure
[infobot.git] / src / CommandStubs.pl
index 96ccce3b2eabe02c37126b714d6da9e95d00c28b..4495e10e2fd9e9a216cd96fde377fdd29900b555 100644 (file)
@@ -189,11 +189,12 @@ sub parseCmdHook {
 &addCmdHook("extra", 'uptime', ('CODEREF' => 'uptime', 'Identifier' => 'uptime',
        'Cmdstats' => 'Uptime') );
 &addCmdHook("extra", 'nullski', ('CODEREF' => 'nullski', ) );
-&addCmdHook("extra", 'crash', ('CODEREF' => 'crash' ) );
-sub nullski { my ($arg) = @_; foreach (`$arg`) { &msg($who,$_); } }
+       sub nullski { my ($arg) = @_; foreach (`$arg`) { &msg($who,$_); } }
 &addCmdHook("extra", '(fm|freshmeat)', ('CODEREF' => 'Freshmeat::Freshmeat',
        'Identifier' => 'freshmeat', 'Cmdstats' => 'Freshmeat',
        'Forker' => 1, 'Help' => 'freshmeat') );
+&addCmdHook("extra", 'verstats', ('CODEREF' => 'do_verstats' ) );
+
 ###
 ### END OF ADDING HOOKS.
 ###
@@ -285,7 +286,7 @@ sub Modules {
        &loadMyModule($myModules{'nickometer'});
 
        if ($term =~ /^$mask{chan}$/) {
-           &DEBUG("nickometer: term == chan.");
+           &status("Doing nickometer for chan $term.");
 
            if (!&validChan($term)) {
                &msg($who, "error: channel is invalid.");
@@ -295,23 +296,27 @@ sub Modules {
            # step 1.
            my %nickometer;
            foreach (keys %{ $channels{lc $term}{''} }) {
-               if (!defined $_) {
-                   &WARN("nickometer: _ is undefined.");
+               my $value = &nickometer($_);
+
+               if (!defined $value) {
+                   &WARN("nickometer: value is undefined.");
                    next;
                }
+               &DEBUG("value => $value.");
 
-               my $value = &nickometer($_);
                $nickometer{$value}{$_} = 1;
            }
+
            # step 2.
            ### TODO: compact with map?
            my @list;
            foreach (sort {$a <=> $b} keys %nickometer) {
                my $str = join(", ", sort keys %{$nickometer{$_}});
-               push(@list, "$str ($_)");
+               push(@list, "$str ($_ %)");
            }
 
            &pSReply( &formListReply(0, "Nickometer list for $term ", @list) );
+           &DEBUG("test.");
 
            return;
        }
@@ -650,4 +655,66 @@ sub DebianNew {
     &::performStrictReply( &::formListReply(0, "New debian packages:", @new) );
 }
 
+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;
+}
+
 1;