X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fcore.pl;h=2f7e7f3792912f8ae5a0e603ed1c21c201eb8137;hb=caae388bc73866dafc559c9b04b8737dc2db51c0;hp=aec5affb884601762386f3c726e5851d7e5c9a92;hpb=b701505fbda7d956b757182c4916dc1cd9345853;p=infobot.git diff --git a/src/core.pl b/src/core.pl index aec5aff..2f7e7f3 100644 --- a/src/core.pl +++ b/src/core.pl @@ -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. @@ -45,7 +50,6 @@ $last{buflen} = 0; $last{say} = ""; $last{msg} = ""; $userHandle = "default"; -$msgtime = time(); $wingaterun = time(); $firsttime = 1; $utime_userfile = 0; @@ -54,8 +58,25 @@ $ucount_userfile = 0; $utime_chanfile = 0; $wtime_chanfile = 0; $ucount_chanfile = 0; - -$bot_version = "blootbot cvs (20010214) -- $^O"; +$running = 0; +### 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,10 +98,12 @@ sub doExit { &status("parent caught SIG$sig (pid $$).") if (defined $sig); &status("--- Start of quit."); + $ident ||= "blootbot"; # lame hack. - &closeDCC(); + &closeDCC() if (&whatInterface() =~ /IRC/); &closePID(); - &seenFlush(); + &closeStats(); + &seenFlush() if (&whatInterface() =~ /IRC/); &quit($param{'quitMsg'}) if (&whatInterface() =~ /IRC/); &writeUserFile(); &writeChanFile(); @@ -89,6 +112,7 @@ sub doExit { &closeDB(); &closeSHM($shm); &dumpallvars() if (&IsParam("dumpvarsAtExit")); + &symdumpAll() if (&IsParam("symdumpAtExit")); &closeLog(); &closeSQLDebug() if (&IsParam("SQLDebug")); @@ -182,19 +206,36 @@ sub IsChanConf { return 0; } + $chan ||= "_default"; + + my $old = $chan; if ($chan =~ tr/A-Z/a-z/) { - &WARN("IsChanConf: lowercased chan."); + &WARN("IsChanConf: lowercased chan. ($old)"); } ### TODO: VERBOSITY on how chanconf returned 1 or 0 or -1. my %chan = &getChanConfList($param); - if (!defined $msgType or $msgType eq "") { + my $nomatch = 0; + if (!defined $msgType) { + $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: !msgType: $chan{$chan} (_default/$param)") if ($debug); + &DEBUG("ICC: other: $chan{$chan} (_default/$param)") if ($debug); } elsif ($chan{_default}) { - &DEBUG("ICC: !msgType: $chan{_default} (_default/$param)") if ($debug); + &DEBUG("ICC: other: $chan{_default} (_default/$param)") if ($debug); } else { - &DEBUG("ICC: !msgType: 0 ($param)") if ($debug); + &DEBUG("ICC: other: 0 ($param)") if ($debug); } return $chan{$chan} || $chan{_default} || 0; @@ -224,12 +265,6 @@ sub IsChanConf { 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; @@ -240,32 +275,89 @@ 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 and $c[0] ne $chan) { - &WARN("c ne chan ($c[0] ne $chan)"); + 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 { - my ($prefix) = $_[0] || ""; +sub getChanConfDefault { + my($what, $default, $chan) = @_; - if (!open(IN, "/proc/$$/status")) { - &ERROR("cannot open '/proc/$$/status'."); - return; + if (exists $param{$what}) { + if (!exists $cache{config}{$what}) { + &status("conf: backward-compat: found param{$what} ($param{$what}) instead."); + $cache{config}{$what} = 1; + } + + return $param{$what}; } + my $val = &getChanConf($what, $chan); + return $val if (defined $val); + + $param{$what} = $default; + &status("conf: 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$/); + + &DEBUG("chanconf{$c}{$_} ..."); + 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 () { $memusage = $1 if (/^VmSize:\s+(\d+) kB/); } @@ -296,7 +388,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); @@ -313,15 +405,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(); @@ -330,18 +415,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($_); @@ -360,12 +453,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 { @@ -383,7 +476,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. @@ -404,15 +499,18 @@ sub restart { ### crappy bug in Net::IRC? if (!$conn->connected and time - $msgtime > 900) { - &status("reconnecting because of uncaught disconnect."); -## $irc->start; + &status("reconnecting because of uncaught disconnect \@ ".scalar(localtime) ); +### $irc->start; + &clearIRCVars(); $conn->connect(); - return; +### return; } + &ircCheck(); # heh, evil! + &DCCBroadcast("-HUP called.","m"); &shutdown(); - &loadConfig($bot_misc_dir."/blootbot.config"); + &loadConfig($bot_config_dir."/blootbot.config"); &reloadAllModules() if (&IsParam("DEBUG")); &setup(); @@ -427,9 +525,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; }