+ if ( $msgType eq 'privmsg' and $message =~ / ($mask{chan})$/ ) {
+ &DEBUG("ircTC: privmsg detected; chan = $1");
+ $chan = $1;
+ }
+
+ my ( $type, $arg );
+ if ( $message =~ /^($z)stats(\s+(\S+))?$/i ) {
+ $type = $1;
+ $arg = $3;
+ }
+ else {
+ return 0;
+ }
+
+ my $c = $chan || 'PRIVATE';
+
+ # Define various types of stats in one place.
+ # Note: sqlSelectColHash has built in sqlQuote
+ my $where_chan_type = { channel => $c, type => $type };
+ my $where_chan_type_nick = { channel => $c, type => $type, nick => $arg };
+
+ my $sum = ( &sqlSelect( 'stats', 'SUM(counter)', $where_chan_type ) )[0];
+
+ if ( !defined $arg or $arg =~ /^\s*$/ ) {
+
+ # get top 3 stats of $type in $chan
+ my %hash =
+ &sqlSelectColHash( 'stats', 'nick,counter', $where_chan_type,
+ 'ORDER BY counter DESC LIMIT 3', 1 );
+ my $i;
+ my @top;
+
+ # unfortunately we have to sort it again!
+ my $tp = 0;
+ foreach $i ( sort { $b <=> $a } keys %hash ) {
+ foreach ( keys %{ $hash{$i} } ) {
+ my $p = sprintf( '%.01f', 100 * $i / $sum );
+ $tp += $p;
+ push( @top, "\002$_\002 -- $i ($p%)" );
+ }
+ }
+ my $topstr = '';
+ if ( scalar @top ) {
+ $topstr = '. Top ' . scalar(@top) . ': ' . join( ', ', @top );
+ }
+
+ if ( defined $sum ) {
+ &performStrictReply(
+ "total count of \037$type\037 on \002$c\002: $sum$topstr");
+ }
+ else {
+ &performStrictReply("zero counter for \037$type\037.");
+ }
+ }
+ else {
+ my $x =
+ ( &sqlSelect( 'stats', 'SUM(counter)', $where_chan_type_nick ) )[0];
+
+ if ( !defined $x ) { # If no stats were found
+ &performStrictReply("$arg has not said $type yet.");
+ return 1;
+ }
+
+ # Get list of all nicks for channel $c and $type
+ my @array =
+ &sqlSelectColArray( 'stats', 'nick', $where_chan_type,
+ 'ORDER BY counter DESC' );
+
+ my $total = scalar(@array);
+ my $rank;
+
+ # Find position of nick $arg in the list
+ for ( my $i = 0 ; $i < $total ; $i++ ) {
+ next unless ( $array[$i] =~ /^\Q$arg\E$/ );
+ $rank = $i + 1;
+ last;
+ }
+
+ my $xtra;
+ if ( $total and $rank ) {
+ my $pct = sprintf( '%.01f', 100 * ($rank) / $total );
+ $xtra =
+ ", ranked $rank\002/\002$total (percentile: \002$pct\002 %)";
+ }
+
+ my $pct1 = sprintf( '%.01f', 100 * $x / $sum );
+ &performStrictReply(
+"\002$arg\002 has said \037$type\037 \002$x\002 times (\002$pct1\002 %)$xtra"
+ );
+ }