]> git.donarmstrong.com Git - infobot.git/blobdiff - src/core.pl
gmtime
[infobot.git] / src / core.pl
index 63c840663942ea1c7d344fefc4dc721ddca70487..e3118e968c392931c393ff03a9ca965cb968d984 100644 (file)
@@ -7,28 +7,30 @@
 
 use strict;
 
-# dynamic scalar. MUST BE REDUCED IN SIZE!!!
+# scalar. MUST BE REDUCED IN SIZE!!!
 ### TODO: reorder.
 use vars qw(
+       $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.
+# array.
 use vars qw(@joinchan @ircServers @wingateBad @wingateNow @wingateCache
 );
 
-### dynamic hash. MUST BE REDUCED IN SIZE!!!
+### hash. MUST BE REDUCED IN SIZE!!!
 # 
 use vars qw(%count %netsplit %netsplitservers %flood %dcc %orig
            %nuh %talkWho %seen %floodwarn %param %dbh %ircPort
@@ -47,7 +49,7 @@ $SIG{'__WARN__'} = 'doWarn';
 $last{buflen}  = 0;
 $last{say}     = "";
 $last{msg}     = "";
-$userHandle    = "default";
+$userHandle    = "_default";
 $wingaterun    = time();
 $firsttime     = 1;
 $utime_userfile        = 0;
@@ -56,6 +58,7 @@ $ucount_userfile = 0;
 $utime_chanfile        = 0;
 $wtime_chanfile        = 0;
 $ucount_chanfile = 0;
+$running       = 0;
 ### more variables...
 $msgtime       = time();
 $msgsize       = 0;
@@ -69,7 +72,7 @@ $notcount     = 0;
 ###
 if ( -d "CVS" ) {
     use POSIX qw(strftime);
-    $bot_release       = strftime("cvs (%Y%m%d)", localtime( (stat("CVS"))[9] ) );
+    $bot_release       = strftime("cvs (%Y%m%d)", gmtime( (stat("CVS"))[9] ) );
 } else {
     $bot_release       = "1.0.10 (2001xxxx)";
 }
@@ -97,18 +100,24 @@ sub doExit {
        &status("--- Start of quit.");
        $ident ||= "blootbot";  # lame hack.
 
-       &closeDCC();
+       &status("Memory Usage: $memusage kB");
+
        &closePID();
        &closeStats();
-       &seenFlush();
-       &quit($param{'quitMsg'}) if (&whatInterface() =~ /IRC/);
+       # shutdown IRC and related components.
+       if (&whatInterface() =~ /IRC/) {
+           &closeDCC();
+           &seenFlush();
+           &quit($param{'quitMsg'});
+       }
        &writeUserFile();
        &writeChanFile();
-       &uptimeWriteFile()      if (&ChanConfList("uptime"));
+       &uptimeWriteFile()      if (&IsChanConf("uptime"));
        &News::writeNews()      if (&ChanConfList("news"));
        &closeDB();
        &closeSHM($shm);
        &dumpallvars()          if (&IsParam("dumpvarsAtExit"));
+       &symdumpAll()           if (&IsParam("symdumpAtExit"));
        &closeLog();
        &closeSQLDebug()        if (&IsParam("SQLDebug"));
 
@@ -202,6 +211,13 @@ sub IsChanConf {
        return 0;
     }
 
+    # should we use IsParam() externally where needed or hack it in 
+    # here just in case? fix it later.
+    if (&IsParam($param)) {
+       &DEBUG("ICC: found '$param' option in main config file.");
+       return 1;
+    }
+
     $chan      ||= "_default";
 
     my $old = $chan;
@@ -274,7 +290,7 @@ sub getChanConf {
     my($param,$c)      = @_;
 
     if (!defined $param) {
-       &WARN("param == NULL.");
+       &WARN("gCC: param == NULL.");
        return 0;
     }
 
@@ -299,22 +315,69 @@ sub getChanConf {
     return $chanconf{"_default"}{$param};
 }
 
-sub showProc {
-    my ($prefix) = $_[0] || "";
+sub getChanConfDefault {
+    my($what, $default, $chan) = @_;
 
-    if (!open(IN, "/proc/$$/status")) {
-       &ERROR("cannot open '/proc/$$/status'.");
-       return;
+    $chan      ||= "_default";
+
+    if (exists $param{$what}) {
+       if (!exists $cache{config}{$what}) {
+           &status("conf: backward-compat: found param{$what} ($param{$what}) for $chan instead.");
+           $cache{config}{$what} = 1;
+       }
+
+       return $param{$what};
     }
+    my $val = &getChanConf($what, $chan);
+    return $val if (defined $val);
+
+    $param{$what}      = $default;
+    &status("conf: $chan auto-setting param{$what} = $default");
+    $cache{config}{$what} = 1;
+    return $default;
+}
+
+
+#####
+#  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;
+    }
+
+    my $c;
+    foreach $c (keys %chanconf) {
+       foreach (keys %{ $chanconf{$c} }) {
+           next unless (/^$param$/);
+
+           return $chanconf{$c}{$_};
+       }
+    }
+
+    return;
+}
+
+sub showProc {
+    my ($prefix) = $_[0] || "";
 
     if ($^O eq "linux") {
+       if (!open(IN, "/proc/$$/status")) {
+           &ERROR("cannot open '/proc/$$/status'.");
+           return;
+       }
+
        while (<IN>) {
            $memusage = $1 if (/^VmSize:\s+(\d+) kB/);
        }
        close IN;
 
     } elsif ($^O eq "netbsd") {
-       $memusage = (stat "/proc/$$/mem")[7]/1024;
+       $memusage = int( (stat "/proc/$$/mem")[7]/1024 );
 
     } elsif ($^O =~ /^(free|open)bsd$/) {
        my @info  = split /\s+/, `/bin/ps -l -p $$`;
@@ -338,7 +401,7 @@ sub showProc {
        } else {        # delta < 0.
            $delta = -$delta;
            # never knew RSS could decrease, probably Size can't?
-           $str = "MEM:$prefix decreased by $delta kB. YES YES YES";
+           $str = "MEM:$prefix decreased by $delta kB.";
        }
 
        &status($str);
@@ -355,15 +418,8 @@ sub setup {
     &openLog();                # write, append.
     &status("--- Started logging.");
 
-    foreach ("debian") {
-       my $dir = "$bot_base_dir/$_/";
-       next if ( -d $dir);
-       &status("Making dir $_");
-       mkdir $dir, 0755;
-    }
-
     # read.
-    &loadLang($bot_misc_dir.           "/blootbot.lang");
+    &loadLang($bot_data_dir. "/blootbot.lang");
     &loadIRCServers();
     &readUserFile();
     &readChanFile();
@@ -371,7 +427,8 @@ sub setup {
 
     $shm = &openSHM();
     &openSQLDebug()    if (&IsParam("SQLDebug"));
-    &openDB($param{'DBName'}, $param{'SQLUser'}, $param{'SQLPass'});
+    &openDB($param{'DBName'}, $param{'DBType'}, $param{'SQLUser'},
+       $param{'SQLPass'});
     &checkTables();
 
     &status("Setup: ". &countKeys("factoids") ." factoids.");
@@ -391,9 +448,9 @@ sub setup {
 
 sub setupConfig {
     $param{'VERBOSITY'} = 1;
-    &loadConfig($bot_misc_dir."/blootbot.config");
+    &loadConfig($bot_config_dir."/blootbot.config");
 
-    foreach ("ircNick", "ircUser", "ircName", "DBType", "tempDir") {
+    foreach ( qw(ircNick ircUser ircName DBType tempDir) ) {
        next if &IsParam($_);
        &ERROR("Parameter $_ has not been defined.");
        exit 1;
@@ -410,12 +467,12 @@ sub setupConfig {
 
     if (! -d $param{tempDir}) {
        &status("making $param{tempDir}...");
-       system("mkdir $param{tempDir}");
+       mkdir $param{tempDir}, 0755;
     }
 
     # 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 {
@@ -455,9 +512,12 @@ sub restart {
        &status("--- $sig called.");
 
        ### crappy bug in Net::IRC?
-       if (!$conn->connected and time - $msgtime > 900) {
-           &status("reconnecting because of uncaught disconnect \@ ".scalar(localtime) );
+       my $delta = time() - $msgtime;
+       &DEBUG("restart: dtime = $delta");
+       if (!$conn->connected or time() - $msgtime > 900) {
+           &status("reconnecting because of uncaught disconnect \@ ".scalar(gmtime) );
 ###        $irc->start;
+           &clearIRCVars();
            $conn->connect();
 ###        return;
        }
@@ -466,7 +526,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();
 
@@ -481,9 +541,8 @@ sub loadConfig {
     my ($file) = @_;
 
     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.");
+       &ERROR("Failed to read configuration file ($file): $!");
+       &status("Please read the INSTALL file on how to install and setup this file.");
        exit 0;
     }