X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fcore.pl;h=1b7a68c02fded05360f467f97e7318adfecfeea6;hb=3936a3e1255582305fc4200485b71fa692e66bd3;hp=9cf0c802375862491cd26d90e5b75a52852ce6a3;hpb=a7384ea463f0bc1c37a2dfd5b547b0bc66c633b7;p=infobot.git diff --git a/src/core.pl b/src/core.pl index 9cf0c80..1b7a68c 100644 --- a/src/core.pl +++ b/src/core.pl @@ -27,15 +27,15 @@ use vars qw( ); # array. -use vars qw(@joinchan @ircServers @wingateBad @wingateNow @wingateCache +use vars qw(@ircServers @wingateBad @wingateNow @wingateCache ); ### hash. MUST BE REDUCED IN SIZE!!! -# +# use vars qw(%count %netsplit %netsplitservers %flood %dcc %orig %nuh %talkWho %seen %floodwarn %param %dbh %ircPort %topic %moduleAge %last %time %mask %file - %forked %chanconf %channels + %forked %chanconf %channels %cache ); # Signals. @@ -47,8 +47,8 @@ $SIG{'__WARN__'} = 'doWarn'; # initialize variables. $last{buflen} = 0; -$last{say} = ""; -$last{msg} = ""; +$last{say} = ''; +$last{msg} = ''; $userHandle = "_default"; $wingaterun = time(); $firsttime = 1; @@ -60,6 +60,14 @@ $wtime_chanfile = 0; $ucount_chanfile = 0; $running = 0; ### more variables... +# static scalar variables. +$mask{ip} = '(\d+)\.(\d+)\.(\d+)\.(\d+)'; +$mask{host} = '[\d\w\_\-\/]+\.[\.\d\w\_\-\/]+'; +$mask{chan} = '[\#\&]\S*|_default'; +my $isnick1 = 'a-zA-Z\[\]\{\}\_\`\^\|\\\\'; +my $isnick2 = '0-9\-'; +$mask{nick} = "[$isnick1]{1}[$isnick1$isnick2]*"; +$mask{nuh} = '\S*!\S*\@\S*'; $msgtime = time(); $msgsize = 0; $msgcount = 0; @@ -70,19 +78,26 @@ $nottime = 0; $notsize = 0; $notcount = 0; ### -if ( -d "CVS" ) { +$bot_release = "1.3.3"; +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_release .= strftime(" cvs (%Y%m%d)", gmtime( (stat('CVS'))[9] ) ); } $bot_version = "blootbot $bot_release -- $^O"; -$noreply = "NOREPLY"; +$noreply = 'NOREPLY'; ########## ### misc commands. ### +sub whatInterface { + if (!&IsParam('Interface') or $param{'Interface'} =~ /IRC/) { + return 'IRC'; + } else { + return 'CLI'; + } +} + sub doExit { my ($sig) = @_; @@ -98,9 +113,9 @@ sub doExit { &status("parent caught SIG$sig (pid $$).") if (defined $sig); &status("--- Start of quit."); - $ident ||= "blootbot"; # lame hack. + $ident ||= 'blootbot'; # lame hack. - &status("Memory Usage: $memusage kB"); + &status("Memory Usage: $memusage KiB"); &closePID(); &closeStats(); @@ -112,14 +127,17 @@ sub doExit { } &writeUserFile(); &writeChanFile(); - &uptimeWriteFile() if (&IsChanConf("uptime")); - &News::writeNews() if (&ChanConfList("news")); - &closeDB(); + &uptimeWriteFile() if (&IsParam('Uptime')); + &sqlCloseDB(); &closeSHM($shm); - &dumpallvars() if (&IsParam("dumpvarsAtExit")); - &symdumpAll() if (&IsParam("symdumpAtExit")); + + if (&IsParam('dumpvarsAtExit')) { + &loadMyModule('DumpVars'); + &dumpallvars(); + } + &symdumpAll() if (&IsParam('symdumpAtExit')); &closeLog(); - &closeSQLDebug() if (&IsParam("SQLDebug")); + &closeSQLDebug() if (&IsParam('SQLDebug')); &status("--- QUIT."); } else { # child. @@ -179,8 +197,8 @@ sub getChanConfList { foreach (keys %chanconf) { my $chan = $_; -# &DEBUG("chan => $chan"); my @array = grep /^$param$/, keys %{ $chanconf{$chan} }; + #&DEBUG("gCCL param => $param, chan => $chan, keys => " . join(':',keys %{ $chanconf{$chan} }) . " array => " . join(':', @array)) if ($param eq 'whatever'); next unless (scalar @array); @@ -188,7 +206,7 @@ sub getChanConfList { &WARN("multiple items found?"); } - if ($array[0] eq "0") { + if ($chanconf{$chan}{$param} eq '0') { $chan{$chan} = -1; } else { $chan{$chan} = 1; @@ -204,21 +222,23 @@ 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! :) + + # knocked tons of bugs with this! :) + my $debug = 0; # 1 if ($param eq 'whatever'); if (!defined $param) { &WARN("IsChanConf: param == NULL."); return 0; } - # should we use IsParam() externally where needed or hack it in - # here just in case? fix it later. + # these should get moved to your .chan file instead of the .config + # .config items overide any .chan entries if (&IsParam($param)) { - &DEBUG("ICC: found '$param' option in main config file."); + &WARN("ICC: found '$param' option in main config file."); return 1; } - $chan ||= "_default"; + $chan ||= "_default"; my $old = $chan; if ($chan =~ tr/A-Z/a-z/) { @@ -231,14 +251,16 @@ sub IsChanConf { if (!defined $msgType) { $nomatch++; } else { - $nomatch++ if ($msgType eq ""); + $nomatch++ if ($msgType eq ''); $nomatch++ unless ($msgType =~ /^(public|private)$/i); } ### debug purposes only. -# &DEBUG("param => $param, msgType => $msgType."); -# foreach (keys %chan) { -# &DEBUG(" $_ => $chan{$_}"); +# if ($debug) { +# &DEBUG("param => $param, msgType => $msgType."); +# foreach (keys %chan) { +# &DEBUG(" $_ => $chan{$_}"); +# } # } if ($nomatch) { @@ -249,31 +271,15 @@ sub IsChanConf { } else { &DEBUG("ICC: other: 0 ($param)") if ($debug); } - return $chan{$chan} || $chan{_default} || 0; - } - - if ($msgType eq "public") { + } elsif ($msgType =~ /^(public|private)$/i) { if ($chan{$chan}) { - &DEBUG("ICC: public: $chan{$chan} ($chan/$param)") if ($debug); + &DEBUG("ICC: $msgType: $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") { - 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); + &DEBUG("ICC: $msgType: $chan{_default} (_default/$param)") if ($debug); } else { - &DEBUG("ICC: private: 0 ($param)") if ($debug); + &DEBUG("ICC: $msgType: 0 ($param)") if ($debug); } - return $chan{$chan} || $chan{_default} || 0; } @@ -294,35 +300,38 @@ sub getChanConf { return 0; } - # this looks evil... + # 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; + $c = "_default" if ($c eq "*"); # FIXME + my @c = grep /^\Q$c\E$/i, keys %chanconf; if (@c) { if (0 and $c[0] ne $c) { &WARN("c ne chan ($c[0] ne $chan)"); } + if (!defined $chanconf{$c[0]}{$param} and ($c ne '_default')) { + return &getChanConf($param, '_default'); + } + &DEBUG("gCC: $param,$c \"" . $chanconf{$c[0]}{$param} . '"'); return $chanconf{$c[0]}{$param}; } -# &DEBUG("gCC: returning _default... "); + #&DEBUG("gCC: returning _default... " . $chanconf{"_default"}{$param}); return $chanconf{"_default"}{$param}; } sub getChanConfDefault { my($what, $default, $chan) = @_; - $chan ||= "_default"; if (exists $param{$what}) { if (!exists $cache{config}{$what}) { - &status("conf: backward-compat: found param{$what} ($param{$what}) for $chan instead."); + &status("config ($chan): backward-compatible option: found param{$what} ($param{$what}) instead of chan option"); $cache{config}{$what} = 1; } @@ -332,7 +341,7 @@ sub getChanConfDefault { return $val if (defined $val); $param{$what} = $default; - &status("conf: $chan auto-setting param{$what} = $default"); + &status("config ($chan): auto-setting param{$what} = $default"); $cache{config}{$what} = 1; return $default; } @@ -363,9 +372,9 @@ sub findChanConf { } sub showProc { - my ($prefix) = $_[0] || ""; + my ($prefix) = $_[0] || ''; - if ($^O eq "linux") { + if ($^O eq 'linux') { if (!open(IN, "/proc/$$/status")) { &ERROR("cannot open '/proc/$$/status'."); return; @@ -376,7 +385,7 @@ sub showProc { } close IN; - } elsif ($^O eq "netbsd") { + } elsif ($^O eq 'netbsd') { $memusage = int( (stat "/proc/$$/mem")[7]/1024 ); } elsif ($^O =~ /^(free|open)bsd$/) { @@ -384,24 +393,24 @@ sub showProc { $memusage = $info[20]; } else { - $memusage = "UNKNOWN"; + $memusage = 'UNKNOWN'; return; } - if (defined $memusageOld and &IsParam("DEBUG")) { + if (defined $memusageOld and &IsParam('DEBUG')) { # it's always going to be increase. my $delta = $memusage - $memusageOld; my $str; if ($delta == 0) { return; } elsif ($delta > 500) { - $str = "MEM:$prefix increased by $delta kB. (total: $memusage kB)"; + $str = "MEM:$prefix increased by $delta KiB. (total: $memusage KiB)"; } elsif ($delta > 0) { - $str = "MEM:$prefix increased by $delta kB"; + $str = "MEM:$prefix increased by $delta KiB"; } else { # delta < 0. $delta = -$delta; # never knew RSS could decrease, probably Size can't? - $str = "MEM:$prefix decreased by $delta kB."; + $str = "MEM:$prefix decreased by $delta KiB."; } &status($str); @@ -426,23 +435,22 @@ sub setup { &loadMyModulesNow(); # must be after chan file. $shm = &openSHM(); - &openSQLDebug() if (&IsParam("SQLDebug")); - &openDB($param{'DBName'}, $param{'DBType'}, $param{'SQLUser'}, + &openSQLDebug() if (&IsParam('SQLDebug')); + &sqlOpenDB($param{'DBName'}, $param{'DBType'}, $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); + &status("Setup: ". &countKeys('factoids') ." factoids."); + &getChanConfDefault('sendPrivateLimitLines', 3, $chan); + &getChanConfDefault('sendPrivateLimitBytes', 1000, $chan); + &getChanConfDefault('sendPublicLimitLines', 3, $chan); + &getChanConfDefault('sendPublicLimitBytes', 1000, $chan); + &getChanConfDefault('sendNoticeLimitLines', 3, $chan); + &getChanConfDefault('sendNoticeLimitBytes', 1000, $chan); $param{tempDir} =~ s#\~/#$ENV{HOME}/#; - &status("Initial memory usage: $memusage kB"); + &status("Initial memory usage: $memusage KiB"); &status("-------------------------------------------------------"); } @@ -476,9 +484,9 @@ sub setupConfig { } sub startup { - if (&IsParam("DEBUG")) { + if (&IsParam('DEBUG')) { &status("enabling debug diagnostics."); - ### I thought disabling this reduced memory usage by 1000 kB. + # I thought disabling this reduced memory usage by 1000 KiB. use diagnostics; } @@ -489,19 +497,24 @@ sub startup { } sub shutdown { + my ($sig) = @_; # reverse order of &setup(). &status("--- shutdown called."); - $ident ||= "blootbot"; # hack. + # hack. + $ident ||= 'blootbot'; + + if (!&isFileUpdated("$bot_state_dir/blootbot.users", $wtime_userfile)) { + &writeUserFile() + } - # opened files must be written to on shutdown/hup/whatever - # unless they're write-only, like uptime. - &writeUserFile(); - &writeChanFile(); - &News::writeNews() if (&ChanConfList("news")); + if (!&isFileUpdated("$bot_state_dir/blootbot.chan", $wtime_chanfile)) { + &writeChanFile(); + } - &closeDB(); - &closeSHM($shm); # aswell. TODO: use this in &doExit? + &sqlCloseDB(); + # aswell. TODO: use this in &doExit? + &closeSHM($shm); &closeLog(); } @@ -515,7 +528,7 @@ sub restart { my $delta = time() - $msgtime; &DEBUG("restart: dtime = $delta"); if (!$conn->connected or time() - $msgtime > 900) { - &status("reconnecting because of uncaught disconnect \@ ".scalar(localtime) ); + &status("reconnecting because of uncaught disconnect \@ ".scalar(gmtime) ); ### $irc->start; &clearIRCVars(); $conn->connect(); @@ -524,10 +537,10 @@ sub restart { &ircCheck(); # heh, evil! - &DCCBroadcast("-HUP called.","m"); - &shutdown(); + &DCCBroadcast("-HUP called.",'m'); + &shutdown($sig); &loadConfig($bot_config_dir."/blootbot.config"); - &reloadAllModules() if (&IsParam("DEBUG")); + &reloadAllModules() if (&IsParam('DEBUG')); &setup(); &status("--- End of $sig."); @@ -553,7 +566,7 @@ sub loadConfig { next unless /\S/; my ($set,$key,$val) = split(/\s+/, $_, 3); - if ($set ne "set") { + if ($set ne 'set') { &status("loadConfig: invalid line '$_'."); next; }