]> git.donarmstrong.com Git - infobot.git/blobdiff - src/core.pl
- fixed dns lookup
[infobot.git] / src / core.pl
index 4d5363ec47b543cd65cf8ac34194f01f01c2a83a..36e8c76b66eca42a3d37072b62892305937abd22 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 # dynamic scalar. MUST BE REDUCED IN SIZE!!!
 ### TODO: reorder.
 use vars qw(
-       $answer $correction_plausible $talkchannel
+       $answer $correction_plausible $talkchannel $bot_release
        $statcount $memusage $user $memusageOld $bot_version $dbh
        $shm $host $msg $bot_misc_dir $bot_pid $bot_base_dir $noreply
        $bot_src_dir $conn $irc $learnok $nick $ident $no_syscall
@@ -19,6 +19,9 @@ use vars qw(
        $flag_quit $msgType
        $utime_userfile $wtime_userfile $ucount_userfile
        $utime_chanfile $wtime_chanfile $ucount_chanfile
+       $pubsize $pubcount $pubtime
+       $msgsize $msgcount $msgtime
+       $notsize $notcount $nottime
 );
 
 # dynamic hash.
@@ -45,7 +48,6 @@ $last{buflen} = 0;
 $last{say}     = "";
 $last{msg}     = "";
 $userHandle    = "default";
-$msgtime       = time();
 $wingaterun    = time();
 $firsttime     = 1;
 $utime_userfile        = 0;
@@ -54,8 +56,24 @@ $ucount_userfile = 0;
 $utime_chanfile        = 0;
 $wtime_chanfile        = 0;
 $ucount_chanfile = 0;
-
-$bot_version   = "blootbot cvs (20010214) -- $^O";
+### more variables...
+$msgtime       = time();
+$msgsize       = 0;
+$msgcount      = 0;
+$pubtime       = 0;
+$pubsize       = 0;
+$pubcount      = 0;
+$nottime       = 0;
+$notsize       = 0;
+$notcount      = 0;
+###
+if ( -d "CVS" ) {
+    use POSIX qw(strftime);
+    $bot_release       = strftime("cvs (%Y%m%d)", localtime( (stat("CVS"))[9] ) );
+} else {
+    $bot_release       = "1.0.10 (2001xxxx)";
+}
+$bot_version   = "blootbot $bot_release -- $^O";
 $noreply       = "NOREPLY";
 
 ##########
@@ -77,6 +95,7 @@ sub doExit {
        &status("parent caught SIG$sig (pid $$).") if (defined $sig);
 
        &status("--- Start of quit.");
+       $ident ||= "blootbot";  # lame hack.
 
        &closeDCC();
        &closePID();
@@ -85,6 +104,7 @@ sub doExit {
        &writeUserFile();
        &writeChanFile();
        &uptimeWriteFile()      if (&ChanConfList("uptime"));
+       &News::writeNews()      if (&ChanConfList("news"));
        &closeDB();
        &closeSHM($shm);
        &dumpallvars()          if (&IsParam("dumpvarsAtExit"));
@@ -174,31 +194,71 @@ sub getChanConfList {
 # Return: 1 for enabled, 0 for passive disable, -1 for active disable.
 sub IsChanConf {
     my($param) = shift;
+    my $debug  = 0;    # knocked tons of bugs with this! :)
 
     if (!defined $param) {
-       &WARN("param == NULL.");
+       &WARN("IsChanConf: param == NULL.");
        return 0;
     }
 
+    my $old = $chan;
+    if ($chan =~ tr/A-Z/a-z/) {
+       &WARN("IsChanConf: lowercased chan. ($old)");
+    }
+
     ### TODO: VERBOSITY on how chanconf returned 1 or 0 or -1.
     my %chan   = &getChanConfList($param);
+    my $nomatch = 0;
     if (!defined $msgType) {
-       return $chan{_default} || 0;
+       $nomatch++;
+    } else {
+       $nomatch++ if ($msgType eq "");
+       $nomatch++ unless ($msgType =~ /^(public|private)$/i);
+    }
+
+### debug purposes only.
+#    &DEBUG("param => $param, msgType => $msgType.");
+#    foreach (keys %chan) {
+#      &DEBUG("   $_ => $chan{$_}");
+#    }
+
+    if ($nomatch) {
+       if ($chan{$chan}) {
+           &DEBUG("ICC: other: $chan{$chan} (_default/$param)") if ($debug);
+       } elsif ($chan{_default}) {
+           &DEBUG("ICC: other: $chan{_default} (_default/$param)") if ($debug);
+       } else {
+           &DEBUG("ICC: other: 0 ($param)") if ($debug);
+       }
+
+       return $chan{$chan} || $chan{_default} || 0;
     }
 
     if ($msgType eq "public") {
-       return $chan{lc $chan} || $chan{_default} || 0;
+       if ($chan{$chan}) {
+           &DEBUG("ICC: public: $chan{$chan} ($chan/$param)") if ($debug);
+       } elsif ($chan{_default}) {
+           &DEBUG("ICC: public: $chan{_default} (_default/$param)") if ($debug);
+       } else {
+           &DEBUG("ICC: public: 0 ($param)") if ($debug);
+       }
+
+       return $chan{$chan} || $chan{_default} || 0;
     }
 
     if ($msgType eq "private") {
-       return $chan{_default} || 0;
+       if ($chan{_default}) {
+           &DEBUG("ICC: private: $chan{_default} (_default/$param)") if ($debug);
+       } elsif ($chan{$chan}) {
+           &DEBUG("ICC: private: $chan{$chan} ($chan/$param) (hack)") if ($debug);
+       } else {
+           &DEBUG("ICC: private: 0 ($param)") if ($debug);
+       }
+
+       return $chan{$chan} || $chan{_default} || 0;
     }
 
-### debug purposes only.
-#    &DEBUG("param => $param, msgType => $msgType.");
-#    foreach (keys %chan) {
-#      &DEBUG("   $_ => $chan{$_}");
-#    }
+    &DEBUG("ICC: no-match: 0/$param (msgType = $msgType)");
 
     return 0;
 }
@@ -208,21 +268,31 @@ sub IsChanConf {
 #  About: Retrieve value for 'param' value in current/default chan.
 # Return: scalar for success, undef for failure.
 sub getChanConf {
-    my($param,$chan)   = @_;
+    my($param,$c)      = @_;
 
     if (!defined $param) {
        &WARN("param == NULL.");
        return 0;
     }
 
-    $chan      ||= "_default";
-    my @c      = grep /^$chan$/i, keys %chanconf;
+    # this looks evil... 
+    if (0 and !defined $chan) {
+       &DEBUG("gCC: ok !chan... doing _default instead.");
+    }
 
-    if (@c and $c[0] ne $chan) {
-       &WARN("c ne chan ($c[0] ne $chan)");
+    $c         ||= $chan;
+    $c         ||= "_default";
+    my @c      = grep /^$c$/i, keys %chanconf;
+
+    if (@c) {
+       if (0 and $c[0] ne $c) {
+           &WARN("c ne chan ($c[0] ne $chan)");
+       }
+       return $chanconf{$c[0]}{$param};
     }
 
-    return $chanconf{$c[0] || "_default"}{$param};
+#    &DEBUG("gCC: returning _default... ");
+    return $chanconf{"_default"}{$param};
 }
 
 sub showProc {
@@ -298,12 +368,21 @@ sub setup {
     $shm = &openSHM();
     &openSQLDebug()    if (&IsParam("SQLDebug"));
     &openDB($param{'DBName'}, $param{'SQLUser'}, $param{'SQLPass'});
+    &checkTables();
 
     &status("Setup: ". &countKeys("factoids") ." factoids.");
+    &News::readNews() if (&ChanConfList("news"));
+    &getChanConfDefault("sendPrivateLimitLines", 3);
+    &getChanConfDefault("sendPrivateLimitBytes", 1000);
+    &getChanConfDefault("sendPublicLimitLines", 3);
+    &getChanConfDefault("sendPublicLimitBytes", 1000);
+    &getChanConfDefault("sendNoticeLimitLines", 3);
+    &getChanConfDefault("sendNoticeLimitBytes", 1000);
 
     $param{tempDir} =~ s#\~/#$ENV{HOME}/#;
 
     &status("Initial memory usage: $memusage kB");
+    &status("-------------------------------------------------------");
 }
 
 sub setupConfig {
@@ -350,7 +429,15 @@ sub startup {
 
 sub shutdown {
     # reverse order of &setup().
-    &DEBUG("shutdown called.");
+    &status("--- shutdown called.");
+
+    $ident ||= "blootbot";     # hack.
+
+    # opened files must be written to on shutdown/hup/whatever
+    # unless they're write-only, like uptime.
+    &writeUserFile();
+    &writeChanFile();
+    &News::writeNews() if (&ChanConfList("news"));
 
     &closeDB();
     &closeSHM($shm);   # aswell. TODO: use this in &doExit?
@@ -366,11 +453,13 @@ sub restart {
        ### crappy bug in Net::IRC?
        if (!$conn->connected and time - $msgtime > 900) {
            &status("reconnecting because of uncaught disconnect.");
-##         $irc->start;
+###        $irc->start;
            $conn->connect();
-           return;
+###        return;
        }
 
+       &ircCheck();    # heh, evil!
+
        &DCCBroadcast("-HUP called.","m");
        &shutdown();
        &loadConfig($bot_misc_dir."/blootbot.config");