]> git.donarmstrong.com Git - infobot.git/blobdiff - src/core.pl
- patch from Morten Brix Pedersen <morten@wtf.dk>. Thanks!
[infobot.git] / src / core.pl
index 7f9b4a2b79e56e7ea872c5be79ee15170a83127d..e8975c136a799f11219e10e071d3de9d85c8fbd0 100644 (file)
@@ -10,15 +10,20 @@ use strict;
 # dynamic scalar. MUST BE REDUCED IN SIZE!!!
 ### TODO: reorder.
 use vars qw(
-       $answer $correction_plausible $talkchannel
+       $bot_misc_dir $bot_pid $bot_base_dir $bot_src_dir
+       $bot_data_dir $bot_config_dir $bot_state_dir $bot_run_dir
+       $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
+       $shm $host $msg $noreply $conn $irc $learnok $nick $ident
        $force_public_reply $addrchar $userHandle $addressedother
        $floodwho $chan $msgtime $server $firsttime $wingaterun
-       $flag_quit $msgType
+       $flag_quit $msgType $no_syscall
        $utime_userfile $wtime_userfile $ucount_userfile
        $utime_chanfile $wtime_chanfile $ucount_chanfile
+       $pubsize $pubcount $pubtime
+       $msgsize $msgcount $msgtime
+       $notsize $notcount $nottime
+       $running
 );
 
 # dynamic hash.
@@ -53,15 +58,25 @@ $ucount_userfile = 0;
 $utime_chanfile        = 0;
 $wtime_chanfile        = 0;
 $ucount_chanfile = 0;
+$running       = 0;
 ### more variables...
-$msgtime       = 0;
+$msgtime       = time();
 $msgsize       = 0;
 $msgcount      = 0;
 $pubtime       = 0;
 $pubsize       = 0;
 $pubcount      = 0;
+$nottime       = 0;
+$notsize       = 0;
+$notcount      = 0;
 ###
-$bot_version   = "blootbot cvs (20010214) -- $^O";
+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";
 
 ##########
@@ -83,9 +98,11 @@ sub doExit {
        &status("parent caught SIG$sig (pid $$).") if (defined $sig);
 
        &status("--- Start of quit.");
+       $ident ||= "blootbot";  # lame hack.
 
        &closeDCC();
        &closePID();
+       &closeStats();
        &seenFlush();
        &quit($param{'quitMsg'}) if (&whatInterface() =~ /IRC/);
        &writeUserFile();
@@ -188,6 +205,8 @@ sub IsChanConf {
        return 0;
     }
 
+    $chan      ||= "_default";
+
     my $old = $chan;
     if ($chan =~ tr/A-Z/a-z/) {
        &WARN("IsChanConf: lowercased chan. ($old)");
@@ -255,21 +274,57 @@ 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.");
+    }
+
+    $c         ||= $chan;
+    $c         ||= "_default";
+    $c         = "_default" if ($c eq "*");    # fix!
+    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};
+    }
+
+#    &DEBUG("gCC: returning _default... ");
+    return $chanconf{"_default"}{$param};
+}
 
-    if (@c and $c[0] ne $chan) {
-       &WARN("c ne chan ($c[0] ne $chan)");
+#####
+#  Usage: &findChanConf($param);
+#  About: Retrieve value for 'param' value from any chan.
+# Return: scalar for success, undef for failure.
+sub findChanConf {
+    my($param) = @_;
+
+    if (!defined $param) {
+       &WARN("param == NULL.");
+       return 0;
     }
 
-    return $chanconf{$c[0]}{$param} || $chanconf{"_default"}{$param};
+    my $c;
+    foreach $c (keys %chanconf) {
+       foreach (keys %{ $chanconf{$c} }) {
+           next unless (/^$param$/);
+
+           &DEBUG("chanconf{$c}{$_} ...");
+           return $chanconf{$c}{$_};
+       }
+    }
+
+    return;
 }
 
 sub showProc {
@@ -336,7 +391,7 @@ sub setup {
     }
 
     # read.
-    &loadLang($bot_misc_dir.           "/blootbot.lang");
+    &loadLang($bot_data_dir. "/blootbot.lang");
     &loadIRCServers();
     &readUserFile();
     &readChanFile();
@@ -345,18 +400,26 @@ 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 {
     $param{'VERBOSITY'} = 1;
-    &loadConfig($bot_misc_dir."/blootbot.config");
+    &loadConfig($bot_config_dir."/blootbot.config");
 
     foreach ("ircNick", "ircUser", "ircName", "DBType", "tempDir") {
        next if &IsParam($_);
@@ -379,8 +442,8 @@ sub setupConfig {
     }
 
     # static scalar variables.
-    $file{utm} = "$bot_base_dir/$param{'ircUser'}.uptime";
-    $file{PID} = "$bot_base_dir/$param{'ircUser'}.pid";
+    $file{utm} = "$bot_state_dir/$param{'ircUser'}.uptime";
+    $file{PID} = "$bot_run_dir/$param{'ircUser'}.pid";
 }
 
 sub startup {
@@ -398,7 +461,9 @@ 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.
@@ -419,8 +484,9 @@ sub restart {
 
        ### crappy bug in Net::IRC?
        if (!$conn->connected and time - $msgtime > 900) {
-           &status("reconnecting because of uncaught disconnect.");
+           &status("reconnecting because of uncaught disconnect \@ ".scalar(localtime) );
 ###        $irc->start;
+           &clearIRCVars();
            $conn->connect();
 ###        return;
        }
@@ -429,7 +495,7 @@ sub restart {
 
        &DCCBroadcast("-HUP called.","m");
        &shutdown();
-       &loadConfig($bot_misc_dir."/blootbot.config");
+       &loadConfig($bot_config_dir."/blootbot.config");
        &reloadAllModules() if (&IsParam("DEBUG"));
        &setup();
 
@@ -445,8 +511,7 @@ sub loadConfig {
 
     if (!open(FILE, $file)) {
        &ERROR("FAILED loadConfig ($file): $!");
-       &status("Please copy files/sample.config to files/blootbot.config");
-       &status("  and edit files/blootbot.config, modify to tastes.");
+       &status("Please read the INSTALL file on how to install and setup this file.");
        exit 0;
     }