X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2FModules%2FFactoids.pl;h=d6c20b4a1e382f1480e3c04136099435186303b6;hb=d5322152bd03e24534af7ed7512a24e666cf9919;hp=525d9002288b9c5af640c63b3fc47bb71bc8369f;hpb=7ea50ad1d0e8dc5e851aa1c5db489de01e719d24;p=infobot.git diff --git a/src/Modules/Factoids.pl b/src/Modules/Factoids.pl index 525d900..d6c20b4 100644 --- a/src/Modules/Factoids.pl +++ b/src/Modules/Factoids.pl @@ -16,7 +16,7 @@ sub CmdFactInfo { if ($faqtoid eq "") { &help("factinfo"); - return $noreply; + return; } my $i = 0; @@ -30,7 +30,18 @@ sub CmdFactInfo { # 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: @@ -43,7 +54,9 @@ sub CmdFactInfo { my $time = $factinfo{'created_time'}; if ($time) { if (time() - $time > 60*60*24*7) { - $string .= " at \037". scalar(localtime $time). "\037"; + my $days = int( (time() - $time)/60/60/24 ); + $string .= " at \037". scalar(localtime $time). "\037" . + " ($days days) "; } else { $string .= " ".&Time2String(time() - $time)." ago"; } @@ -119,11 +132,11 @@ sub CmdFactInfo { # 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 { @@ -163,13 +176,13 @@ sub CmdFactStats { } 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"); 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) { @@ -179,7 +192,7 @@ sub CmdFactStats { } } - $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. @@ -191,7 +204,7 @@ sub CmdFactStats { my $prefix = "broken factoid "; return &formListReply(1, $prefix, @list); - } elsif ($type =~ /^deadredir?$/i) { + } elsif ($type =~ /^deadredir$/i) { my @list = &searchTable("factoids", "factoid_key", "factoid_value", "^ see "); my %redir; @@ -204,6 +217,7 @@ sub CmdFactStats { my $redirf = lc $2; my $redir = &getFactInfo($redirf, "factoid_value"); next if (defined $redir); + next if (length $val > 50); $redir{$redirf}{$factoid} = 1; } @@ -211,7 +225,7 @@ sub CmdFactStats { my @newlist; foreach $f (keys %redir) { - my @sublist = keys %{$redir{$f}}; + my @sublist = keys %{ $redir{$f} }; for (@sublist) { s/([\,\;]+)/\037$1\037/g; } @@ -224,11 +238,11 @@ sub CmdFactStats { 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", 1); + my $refs = 0; my @list; - my $refs = 0; my $v; foreach $v (keys %hash) { @@ -256,7 +270,7 @@ sub CmdFactStats { } &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. @@ -268,7 +282,28 @@ sub CmdFactStats { my $prefix = "dupe factoid "; return &formListReply(1, $prefix, @list); - } elsif ($type =~ /^lame$/i) { + } 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"; my $sth = $dbh->prepare($query); @@ -277,8 +312,9 @@ sub CmdFactStats { my @list; while (my @row = $sth->fetchrow_array) { my($key,$val) = ($row[0], $row[1]); - next if ($val =~ /^prepare($query); + &ERROR("factstats(listfix): => '$query'.") unless $sth->execute; + + my @list; + while (my @row = $sth->fetchrow_array) { + my($key,$val) = ($row[0], $row[1]); + my $match = 0; + $match++ if ($val =~ /\S+,? or \S+,? or \S+,? or \S+,?/); + next unless ($match); + + $key =~ s/\,/\037\,\037/g; + push(@list, $key); + $val =~ s/,? or /, /g; + &DEBUG("fixed: => $val."); + &setFactInfo($key,"factoid_value", $val); + } + $sth->finish; + + # parse the results. + my $prefix = "Inefficient lists fixed "; + return &formListReply(1, $prefix, @list); + } elsif ($type =~ /^locked$/i) { my %hash = &dbGetCol("factoids", "factoid_key","locked_by"); my @list = keys %hash; @@ -326,7 +387,7 @@ sub CmdFactStats { } 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."); @@ -366,7 +427,7 @@ sub CmdFactStats { 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. @@ -433,15 +494,18 @@ sub CmdFactStats { 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); @@ -470,14 +534,59 @@ sub CmdFactStats { 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); + } elsif ($type =~ /^seefix$/i) { + my @list = &searchTable("factoids", "factoid_key", + "factoid_value", "^see "); + my @newlist; + my $fixed = 0; + my %loop; + my $f; + + for (@list) { + my $factoid = $_; + my $val = &getFactInfo($factoid, "factoid_value"); + + next unless ($val =~ /^see( also)? (.*?)\.?$/i); + + my $redirf = lc $2; + my $redir = &getFactInfo($redirf, "factoid_value"); + + if ($redirf =~ /^\Q$factoid\W$/i) { + &delFactoid($factoid); + $loop{$factoid} = 1; + } + + if (defined $redir) { # good. + &setFactInfo($factoid,"factoid_value"," see $redir"); + $fixed++; + } else { + push(@newlist, $redirf); + } + } + + # parse the results. + &msg($who, "Fixed $fixed factoids."); + &msg($who, "Self looped factoids removed: ". + sort(keys %loop) ) if (scalar keys %loop); + + my $prefix = "Loose link (dead) redirections in factoids "; + return &formListReply(1, $prefix, @newlist); + } elsif ($type =~ /^(2|too)long$/i) { my @list; @@ -524,7 +633,7 @@ sub CmdListAuth { my @list = &searchTable("factoids","factoid_key", "created_by", "^$query!"); my $prefix = "factoid author list by '$query' "; - return &formListReply(1, $prefix, @list); + &performStrictReply( &formListReply(1, $prefix, @list) ); } 1;