if ($faqtoid eq "") {
&help("factinfo");
- return $noreply;
+ return;
}
my $i = 0;
my %factinfo;
my @factinfo = &getFactInfo($faqtoid,"*");
- foreach ( &dbGetRowInfo("factoids") ) {
+ foreach ( &dbGetColInfo("factoids") ) {
$factinfo{$_} = $factinfo[$i] || '';
$i++;
}
# factoid does not exist.
if (scalar @factinfo <= 1) {
&performReply("there's no such factoid as \002$faqtoid\002");
- return $noreply;
+ return;
+ }
+
+ # fix for problem observed by asuffield.
+ # why did it happen though?
+ if (!$factinfo{'factoid_value'}) {
+ &performReply("there's no such factoid as \002$faqtoid\002; deleted because we don't have factoid_value!");
+ foreach (keys %factinfo) {
+ &DEBUG("factinfo{$_} => '$factinfo{$_}'.");
+ }
+### &delFactoid($faqtoid);
+ return;
}
# created:
my $time = $factinfo{'created_time'};
if ($time) {
if (time() - $time > 60*60*24*7) {
- my $days = int( (time() - $time)*60*60*24 );
+ my $days = int( (time() - $time)/60/60/24 );
$string .= " at \037". scalar(localtime $time). "\037" .
- " ($days days) ";
+ " ($days days)";
} else {
$string .= " ".&Time2String(time() - $time)." ago";
}
# factoid was inserted not through the bot.
if (!scalar @array) {
&performReply("no extra info on \002$faqtoid\002");
- return $noreply;
+ return;
}
&performStrictReply("$factinfo{'factoid_key'} -- ". join("; ", @array) .".");
- return $noreply;
+ return;
}
sub CmdFactStats {
my ($type) = @_;
if ($type =~ /^author$/i) {
- my %hash = &dbGetCol("factoids", "factoid_key","created_by");
+ my %hash = &dbGetCol("factoids", "factoid_key,created_by", "created_by IS NOT NULL");
my %author;
foreach (keys %hash) {
my $count;
my @list;
foreach $count (sort { $b <=> $a } keys %count) {
- my $author = join(", ", sort keys %{$count{$count}});
+ my $author = join(", ", sort keys %{ $count{$count} });
push(@list, "$count by $author");
}
} elsif ($type =~ /^broken$/i) {
&status("factstats(broken): starting...");
- my $start_time = &gettimeofday();
- my %data = &dbGetCol("factoids", "factoid_key","factoid_value");
+ my $start_time = &timeget();
+ my %data = &dbGetCol("factoids", "factoid_key,factoid_value", "factoid_value IS NOT NULL");
my @list;
- my $delta_time = &gettimeofday() - $start_time;
+ my $delta_time = &timedelta($start_time);
&status(sprintf("factstats(broken): %.02f sec to retreive all factoids.", $delta_time)) if ($delta_time > 0);
- $start_time = &gettimeofday();
+ $start_time = &timeget();
# parse the factoids.
foreach (keys %data) {
}
}
- $delta_time = &gettimeofday() - $start_time;
+ $delta_time = &timedelta($start_time);
&status(sprintf("factstats(broken): %.02f sec to complete.", $delta_time)) if ($delta_time > 0);
# bail out on no results.
my $prefix = "broken factoid ";
return &formListReply(1, $prefix, @list);
+ } elsif ($type =~ /^total$/i) {
+ &status("factstats(total): starting...");
+ my $start_time = &timeget();
+ my @list;
+ my $str;
+ my($i,$j);
+ my %hash;
+
+ ### lets do it.
+ # total factoids requests.
+ $i = &sumKey("factoids", "requested_count");
+ push(@list, "total requests - $i");
+
+ # total factoids modified.
+ $str = &countKeys("factoids", "modified_by");
+ push(@list, "total modified - $str");
+
+ # total factoids modified.
+ $j = &countKeys("factoids", "requested_count");
+ $str = &countKeys("factoids", "factoid_key");
+ push(@list, "total non-requested - ".($str - $i));
+
+ # average request/factoid.
+ # i/j == total(requested_count)/count(requested_count)
+ $str = sprintf("%.01f", $i/$j);
+ push(@list, "average requested per factoid - $str");
+
+ # total prepared for deletion.
+ $str = scalar( &searchTable("factoids", "factoid_key", "factoid_value", " #DEL") );
+ push(@list, "total prepared for deletion - $str");
+
+ # total unique authors.
+ foreach ( &dbRawReturn("SELECT created_by FROM factoids WHERE created_by IS NOT NULL") ) {
+ /^(\S+)!/;
+ my $nick = lc $1;
+ $hash{$nick}++;
+ }
+ push(@list, "total unique authors - ".(scalar keys %hash) );
+ undef %hash;
+
+ # total unique requesters.
+ foreach ( &dbRawReturn("SELECT requested_by FROM factoids WHERE requested_by IS NOT NULL") ) {
+ /^(\S+)!/;
+ my $nick = lc $1;
+ $hash{$nick}++;
+ }
+ push(@list, "total unique requesters - ".(scalar keys %hash) );
+ undef %hash;
+
+ ### end of "job".
+
+ my $delta_time = &timedelta($start_time);
+ &status(sprintf("factstats(broken): %.02f sec to retreive all factoids.", $delta_time)) if ($delta_time > 0);
+ $start_time = &timeget();
+
+ # bail out on no results.
+ if (scalar @list == 0) {
+ return 'no broken factoids... wooohoo.';
+ }
+
+ # parse the results.
+ my $prefix = "General factoid stiatistics ";
+ return &formListReply(1, $prefix, @list);
+
} elsif ($type =~ /^deadredir$/i) {
my @list = &searchTable("factoids", "factoid_key",
"factoid_value", "^<REPLY> see ");
my @newlist;
foreach $f (keys %redir) {
- my @sublist = keys %{$redir{$f}};
+ my @sublist = keys %{ $redir{$f} };
for (@sublist) {
s/([\,\;]+)/\037$1\037/g;
}
return &formListReply(1, $prefix, @newlist);
} elsif ($type =~ /^dup(licate|e)$/i) {
- my $start_time = &gettimeofday();
&status("factstats(dupe): starting...");
- my %hash = &dbGetCol("factoids", "factoid_key", "factoid_value", 1);
+ my $start_time = &timeget();
+ my %hash = &dbGetCol("factoids", "factoid_key,factoid_value", "factoid_value IS NOT NULL", 1);
+ my $refs = 0;
my @list;
- my $refs = 0;
my $v;
foreach $v (keys %hash) {
- my $count = scalar(keys %{$hash{$v}});
+ my $count = scalar(keys %{ $hash{$v} });
next if ($count == 1);
my @sublist;
- foreach (keys %{$hash{$v}}) {
+ foreach (keys %{ $hash{$v} }) {
if ($v =~ /^<REPLY> see /i) {
$refs++;
next;
}
&status("factstats(dupe): (good) dupe refs: $refs.");
- my $delta_time = &gettimeofday() - $start_time;
+ my $delta_time = &timedelta($start_time);
&status(sprintf("factstats(dupe): %.02f sec to complete", $delta_time)) if ($delta_time > 0);
# bail out on no results.
my $prefix = "dupe factoid ";
return &formListReply(1, $prefix, @list);
+ } elsif ($type =~ /^nullfactoids$/i) {
+ my $query = "SELECT factoid_key,factoid_value FROM factoids WHERE factoid_value=''";
+ my $sth = $dbh->prepare($query);
+ &ERROR("factstats(null): => '$query'.") unless $sth->execute;
+
+ my @list;
+ while (my @row = $sth->fetchrow_array) {
+ if ($row[1] ne "") {
+ &DEBUG("row[1] != NULL for $row[0].");
+ next;
+ }
+
+ &DEBUG("row[0] => '$row[0]'.");
+ push(@list, $row[0]);
+ }
+ $sth->finish;
+
+ # parse the results.
+ my $prefix = "NULL factoids (not deleted yet) ";
+ return &formListReply(1, $prefix, @list);
+
} elsif ($type =~ /^(2|too)short$/i) {
# Custom select statement.
my $query = "SELECT factoid_key,factoid_value FROM factoids WHERE length(factoid_value) <= 40";
$match++ if ($val =~ /\s{3,}/);
next unless ($match);
+ my $v = &getFactoid($val);
+ if (defined $v) {
+ &DEBUG("key $key => $val => $v");
+ }
+
$key =~ s/\,/\037\,\037/g;
push(@list, $key);
}
return &formListReply(1, $prefix, @list);
} elsif ($type =~ /^locked$/i) {
- my %hash = &dbGetCol("factoids", "factoid_key","locked_by");
+ my %hash = &dbGetCol("factoids", "factoid_key,locked_by", "locked_by IS NOT NULL");
my @list = keys %hash;
for (@list) {
return &formListReply(0, $prefix, @list);
} elsif ($type =~ /^new$/i) {
- my %hash = &dbGetCol("factoids", "factoid_key","created_time");
+ my %hash = &dbGetCol("factoids", "factoid_key,created_time", "created_time IS NOT NULL");
my %age;
foreach (keys %hash) {
my @list;
foreach (sort {$a <=> $b} keys %age) {
- push(@list, join(",", keys %{$age{$_}}));
+ push(@list, join(",", keys %{ $age{$_} }));
}
my $prefix = "new factoids in the last 24hours ";
} elsif ($type =~ /^part(ial)?dupe$/i) {
### requires "custom" select statement... oh well...
- my $start_time = &gettimeofday();
+ my $start_time = &timeget();
# form length|key and key=length hash list.
&status("factstats(partdupe): forming length hash list.");
my @sublist;
my $length;
foreach $length (@length) {
- foreach (keys %{$length{$length}}) {
+ foreach (keys %{ $length{$length} }) {
if ($key{$_} =~ /^$val/i) {
s/([\,\;]+)/\037$1\037/g;
s/( and|and )/\037$1\037/g;
push(@list, join(" ,",@sublist)) if (scalar @sublist);
}
- my $delta_time = sprintf("%.02fs", &gettimeofday() - $start_time);
+ my $delta_time = sprintf("%.02fs", &timedelta($start_time) );
&status("factstats(partdupe): $delta_time sec to complete.") if ($delta_time > 0);
# bail out on no results.
return &formListReply(1, $prefix, @list);
} elsif ($type =~ /^profanity$/i) {
- my %data = &dbGetCol("factoids", "factoid_key","factoid_value");
+ my %data = &dbGetCol("factoids", "factoid_key,factoid_value", "factoid_value IS NOT NULL");
my @list;
foreach (keys %data) {
my @newlist;
foreach $f (keys %redir) {
- my @sublist = keys %{$redir{$f}};
+ my @sublist = keys %{ $redir{$f} };
for (@sublist) {
s/([\,\;]+)/\037$1\037/g;
}
return &formListReply(1, $prefix, @newlist);
} elsif ($type =~ /^request(ed)?$/i) {
- my %hash = &dbGetCol("factoids", "factoid_key", "requested_count",1);
+ my %hash = &dbGetCol("factoids", "factoid_key,requested_count", "requested_count IS NOT NULL", 1);
if (!scalar keys %hash) {
return 'sorry, no factoids have been questioned.';
my $count;
my @list;
+ my $total = 0;
foreach $count (sort {$b <=> $a} keys %hash) {
- my @faqtoids = sort keys %{$hash{$count}};
+ my @faqtoids = sort keys %{ $hash{$count} };
for (@faqtoids) {
s/([\,\;]+)/\037$1\037/g;
}
+ $total += $count * scalar(@faqtoids);
push(@list, "$count - ". join(", ", @faqtoids));
}
+ unshift(@list, "\037$total - TOTAL\037");
my $prefix = "factoid statistics on $type ";
return &formListReply(0, $prefix, @list);
+ } elsif ($type =~ /^reqrate$/i) {
+ my %hash = &dbGetCol("factoids",
+ "factoid_key,(unix_timestamp() - created_time)/requested_count as rate",
+ "requested_by IS NOT NULL and created_time IS NOT NULL ORDER BY rate LIMIT 15", 1);
+
+ my $rate;
+ my @list;
+ my $total = 0;
+ my $users = 0;
+ foreach $rate (sort { $b <=> $a } keys %hash) {
+ my $f = join(", ", sort keys %{ $hash{$rate} });
+ push(@list, "$f - ".&Time2String($rate));
+ }
+
+ my $prefix = "Rank of top factoid rate (time/req): ";
+ return &formListReply(0, $prefix, @list);
+
} elsif ($type =~ /^requesters?$/i) {
- my %hash = &dbGetCol("factoids", "factoid_key","requested_by");
+ my %hash = &dbGetCol("factoids", "factoid_key,requested_by", "requested_by IS NOT NULL");
my %requester;
foreach (keys %hash) {
# work-around.
my %count;
foreach (keys %requester) {
- $count{$requester{$_}}{$_} = 1;
+ $count{ $requester{$_} }{$_} = 1;
}
undef %requester;
my $count;
my @list;
+ my $total = 0;
+ my $users = 0;
foreach $count (sort { $b <=> $a } keys %count) {
- my $requester = join(", ", sort keys %{$count{$count}});
+ my $requester = join(", ", sort keys %{ $count{$count} });
+ $total += $count * scalar(keys %{ $count{$count} });
+ $users += scalar(keys %{ $count{$count} });
push(@list, "$count by $requester");
}
+ unshift(@list, "\037$total TOTAL REQUESTS; $users UNIQUE REQUESTERS\037");
+ # should not the above value be the same as collected by
+ # 'requested'? soemthing weird is going on!
my $prefix = "rank of top factoid requesters: ";
return &formListReply(0, $prefix, @list);
for (@list) {
my $factoid = $_;
my $val = &getFactInfo($factoid, "factoid_value");
- if ($val =~ /^see( also)? (.*?)\.?$/i) {
- my $redirf = lc $2;
- my $redir = &getFactInfo($redirf, "factoid_value");
+
+ next unless ($val =~ /^see( also)? (.*?)\.?$/i);
- if ($redirf =~ /^\Q$factoid\W$/i) {
- &delFactoid($factoid);
- $loop{$factoid} = 1;
- }
+ my $redirf = lc $2;
+ my $redir = &getFactInfo($redirf, "factoid_value");
- if (defined $redir) { # good.
- &setFactInfo($factoid,"factoid_value","<REPLY> see $redir");
- $fixed++;
- } else {
- push(@newlist, $redirf);
- }
+ if ($redirf =~ /^\Q$factoid\W$/i) {
+ &delFactoid($factoid);
+ $loop{$factoid} = 1;
+ }
+
+ if (defined $redir) { # good.
+ &setFactInfo($factoid,"factoid_value","<REPLY> see $redir");
+ $fixed++;
+ } else {
+ push(@newlist, $redirf);
}
}