]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/News.pl
- moved scripts/setup_sql.pl to src/db_mysql as &createTables()
[infobot.git] / src / Modules / News.pl
index 089ab07113270aff18ad9ca21db7df6ff305bf73..dbe7cf074363d31c66661eb806b26032b5157826 100644 (file)
@@ -36,7 +36,7 @@ sub Parse {
 
     if (defined $what and $what =~ s/^($::mask{chan})\s*//) {
        # todo: check if the channel exists aswell.
-       $chan = $1;
+       $chan   = lc $1;
 
        if (!&::IsNickInChan($::who, $chan)) {
            &::notice($::who, "sorry but you're not on $chan.");
@@ -45,7 +45,7 @@ sub Parse {
     }
 
     if (!defined $chan) {
-       my @chans = &::GetNickInChans($::who);
+       my @chans = &::getNickInChans($::who);
 
        if (scalar @chans > 1) {
            &::notice($::who, "error: I dunno which channel you are referring to since you're on more than one. Try 'news #chan ...' instead");
@@ -80,7 +80,7 @@ sub Parse {
        &set($2);
 
     } elsif ($what =~ /^(\d+)$/i) {
-       &::DEBUG("read shortcut called.");
+       &::VERB("News: read shortcut called.",2);
        &read($1);
 
     } elsif ($what =~ /^read(\s+(.*))?$/i) {
@@ -88,9 +88,12 @@ sub Parse {
 
     } elsif ($what =~ /^(latest|new)(\s+(.*))?$/i) {
        &latest($3 || $chan, 1);
+#      $::cmdstats{'News latest'}++;
+
+    } elsif ($what =~ /^stats?$/i) {
+       &stats();
 
     } elsif ($what =~ /^list$/i) {
-       &::DEBUG("list longcut called.");
        &list();
 
     } elsif ($what =~ /^(expire|text|desc)(\s+(.*))?$/i) {
@@ -102,6 +105,10 @@ sub Parse {
     } elsif ($what =~ /^help(\s+(.*))?$/i) {
        &::help("news$1");
 
+    } elsif ($what =~ /^newsflush$/i) {
+       &::msg($::who, "newsflush called... check out the logs!");
+       &::newsFlush();
+
     } elsif ($what =~ /^(un)?notify$/i) {
        my $state = ($1) ? 0 : 1;
 
@@ -132,14 +139,14 @@ sub Parse {
        }
 
     } else {
-       &::DEBUG("could not parse '$what'.");
+       &::DEBUG("could not parse '$what'");
        &::notice($::who, "unknown command: $what");
     }
 }
 
 sub readNews {
     my $file = "$::bot_base_dir/blootbot-news.txt";
-    if (! -f $file) {
+    if (! -f $file or -z $file) {
        return;
     }
 
@@ -182,13 +189,17 @@ sub readNews {
     }
     close NEWS;
 
-    &::status("News: Read $ci items for ".scalar(keys %::news)
-               ." chans, $cu users cache");
+    my $cn = scalar(keys %::news);
+    &::status("News: Read ".
+       $ci. &::fixPlural(" item", $ci). " for ".
+       $cn. &::fixPlural(" chan", $cn). ", ".
+       $cu. &::fixPlural(" user", $cu), " cache"
+    ) if ($ci or $cn or $cu);
 }
 
 sub writeNews {
-    if (!scalar keys %::news) {
-       &::DEBUG("wN: nothing to write.");
+    if (!scalar keys %::news and !scalar keys %::newsuser) {
+       &::VERB("wN: nothing to write.",2);
        return;
     }
 
@@ -356,6 +367,10 @@ sub list {
        if (defined $x and ($x == 0 or $x == -1)) {
            &::DEBUG("not updating time for $::who.");
        } else {
+           if (!scalar keys %{ $::news{$chan} }) {
+               &DEBUG("news: should not add $chan/$::who to cache!");
+           }
+
            $::newsuser{$chan}{$::who} = time();
        }
     }
@@ -423,20 +438,30 @@ sub read {
     my $rcount = $::news{$chan}{$item}{Request_Count} || 0;
 
     if (length $text < $::param{maxKeySize}) {
-       &::DEBUG("NEWS: Possible news->factoid redirection.");
+       &::VERB("NEWS: Possible news->factoid redirection.",2);
        my $f   = &::getFactoid($text);
 
        if (defined $f) {
-           &::DEBUG("NEWS: ok, $text is factoid redirection.");
+           &::VERB("NEWS: ok, $text is factoid redirection.",2);
            $f =~ s/^<REPLY>\s*//i;     # anything else?
            $text = $f;
        }
     }
 
-    &::notice($::who, "+- News \002$chan\002 #$num: \037$item\037");
-    &::notice($::who, "| Added by $a at $t");
-    &::notice($::who, "| Requested $rcount times, last by $rwho") if ($rcount);
+    $_ = $::news{$chan}{$item}{'Expire'};
+    my $e;
+    if ($_) {
+       $e = sprintf("\037%s\037  [%s from now]",
+               scalar(localtime($_)),
+               &::Time2String($_ - time())
+       );
+    }
+
+    &::notice($::who, "+- News \002$chan\002 #$num: $item");
+    &::notice($::who, "| Added by $a at \037$t\037");
+    &::notice($::who, "| Expire: $e") if (defined $e);
     &::notice($::who, $text);
+    &::notice($::who, "| Requested \002$rcount\002 times, last by \002$rwho\002") if ($rcount and $rwho);
 
     $::news{$chan}{$item}{'Request_By'}   = $::who;
     $::news{$chan}{$item}{'Request_Time'} = time();
@@ -534,7 +559,6 @@ sub set {
 
     &::DEBUG("item => '$item'.");
     my $news = &getNewsItem($item);
-    &::DEBUG("news => '$news'");
 
     if (!defined $news) {
        &::notice($::who, "Could not find item '$item' substring or # in news list.");
@@ -657,7 +681,7 @@ sub latest {
 
     # todo: if chan = undefined, guess.
     if (!exists $::news{$chan}) {
-       &::notice($::who, "invalid chan $chan");
+       &::notice($::who, "invalid chan $chan") if ($flag);
        return;
     }
 
@@ -690,7 +714,11 @@ sub latest {
 
        # don't list new items if they don't have Text.
        if (!exists $::news{$chan}{$_}{Text}) {
-           &::WARN("news: news{$chan}{$_}{Text} undef.");
+           if (time() - $::news{$chan}{$_}{Time} > 60*60*24*3) {
+               &::DEBUG("deleting news{$chan}{$_} because it was too old and had no text info.");
+               delete $::news{$chan}{$_};
+           }
+
            next;
        }
 
@@ -709,7 +737,7 @@ sub latest {
     if (!$flag) {
        return unless ($unread);
 
-       my $reply = "There are unread news in $chan ($unread unread, $total total). /msg $::ident news latest.";
+       my $reply = "There are unread news in $chan ($unread unread, $total total). /msg $::ident news $::chan latest";
        $reply   .= "  If you don't want further news notification, /msg $::ident news unnotify" if ($unread == $total);
        &::notice($::who, $reply);
 
@@ -851,12 +879,11 @@ sub getNewsItem {
            return;
        }
 
-       &::DEBUG("gNI: part_string->full_string: $what->$items[0]");
        if (@items) {
-           &::DEBUG("gNI: Guessed '$items[0]'.");
+           &::DEBUG("gNI: part_string->full_string: $what->$items[0]");
            return $items[0];
        } else {
-           &::DEBUG("gNI: No match.");
+           &::DEBUG("gNI: No match for '$what'");
            return;
        }
     }
@@ -885,4 +912,37 @@ sub do_set {
     &::DEBUG("do_set: TODO...");
 }
 
+sub stats {
+    &::DEBUG("News: stats called.");
+    &::msg($::who, "check my logs/console.");
+    my($i,$j) = (0,0);
+
+    # total request count.
+    foreach $chan (keys %::news) {
+       foreach (keys %{ $::news{$chan} }) {
+           $i += $::news{$chan}{$_}{Request_Count};
+       }
+    }
+    &::DEBUG("news: stats: total request count => $i");
+    $i = 0;
+
+    # total user cached.
+    foreach $chan (keys %::newsuser) {
+       $i += $::newsuser{$chan}{$_};
+    }
+    &::DEBUG("news: stats: total user cache => $i");
+    $i = 0;
+
+    # average latest time read.
+    my $t = time();
+    foreach $chan (keys %::newsuser) {
+       $i += $t - $::newsuser{$chan}{$_};
+       $j++;
+    }
+    &::DEBUG("news: stats: average latest time read: total time: $i");
+    &::DEBUG("... count: $j");
+    &::DEBUG("   average: ".sprintf("%.02f", $i/($j||1))." sec/user");
+    $i = $j = 0;
+}
+
 1;