]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/Factoids.pl
- forgot to set forked{}{PID} in addForked
[infobot.git] / src / Modules / Factoids.pl
index 8e4b48e8f1a976bacb639c5dd55dd5eb3022a2eb..b2e36461bf329ca395293f74bdd649f02f04961f 100644 (file)
@@ -1,6 +1,6 @@
 #
 #  Factoids.pl: Helpers for generating factoids statistics.
-#       Author: xk <xk@leguin.openprojects.net>
+#       Author: dms
 #      Version: v0.1 (20000514)
 #     Splitted: SQLExtras.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 {
@@ -154,7 +167,7 @@ sub CmdFactStats {
        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");
        }
 
@@ -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", "^<REPLY> 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,19 +238,19 @@ 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) {
-           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;
@@ -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,14 @@ sub CmdFactStats {
        my @list;
        while (my @row = $sth->fetchrow_array) {
            my($key,$val) = ($row[0], $row[1]);
-           next if ($val =~ /^</);
-           next if ($val =~ /\s{2,}/);
+           my $match = 0;
+           $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);
@@ -289,6 +330,31 @@ sub CmdFactStats {
        my $prefix = "Lame factoids ";
        return &formListReply(1, $prefix, @list);
 
+    } elsif ($type =~ /^listfix$/i) {
+       # Custom select statement.
+       my $query = "SELECT factoid_key,factoid_value FROM factoids";
+       my $sth = $dbh->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;
@@ -318,7 +384,7 @@ sub CmdFactStats {
 
        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 ";
@@ -326,7 +392,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.");
@@ -355,7 +421,7 @@ sub CmdFactStats {
            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;
@@ -366,7 +432,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.
@@ -412,7 +478,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;
            }
@@ -433,15 +499,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);
@@ -464,20 +533,65 @@ sub CmdFactStats {
        # 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);
 
+    } 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","<REPLY> 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 +638,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;