X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fcore.pl;h=b49d9b2dbbbfa7dec62356dfab07a30bdb3806eb;hb=58298d359360a1de27212a1ec0838dbfb7f0b53b;hp=8ce2a7bbc8678ccb42d0e2dcc901978a257396f4;hpb=a2dd9453db40a0641a4cdd606710ef6dd4ce4598;p=infobot.git diff --git a/src/core.pl b/src/core.pl index 8ce2a7b..b49d9b2 100644 --- a/src/core.pl +++ b/src/core.pl @@ -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. @@ -29,7 +32,7 @@ use vars qw(@joinchan @ircServers @wingateBad @wingateNow @wingateCache # use vars qw(%count %netsplit %netsplitservers %flood %dcc %orig %nuh %talkWho %seen %floodwarn %param %dbh %ircPort - %jointime %topic %joinverb %moduleAge %last %time %mask %file + %topic %moduleAge %last %time %mask %file %forked %chanconf %channels ); @@ -45,7 +48,6 @@ $last{buflen} = 0; $last{say} = ""; $last{msg} = ""; $userHandle = "default"; -$msgtime = time(); $wingaterun = time(); $firsttime = 1; $utime_userfile = 0; @@ -54,9 +56,24 @@ $ucount_userfile = 0; $utime_chanfile = 0; $wtime_chanfile = 0; $ucount_chanfile = 0; - -### CHANGE TO STATIC. -$bot_version = "blootbot cvs (20001212) -- $^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"; ########## @@ -78,6 +95,7 @@ sub doExit { &status("parent caught SIG$sig (pid $$).") if (defined $sig); &status("--- Start of quit."); + $ident ||= "blootbot"; # lame hack. &closeDCC(); &closePID(); @@ -86,6 +104,7 @@ sub doExit { &writeUserFile(); &writeChanFile(); &uptimeWriteFile() if (&ChanConfList("uptime")); + &News::writeNews() if (&ChanConfList("news")); &closeDB(); &closeSHM($shm); &dumpallvars() if (&IsParam("dumpvarsAtExit")); @@ -131,8 +150,11 @@ sub ChanConfList { return unless (defined $param); my %chan = &getChanConfList($param); - ### TODO: -option is included aswell though. - return keys %chan; + if (exists $chan{_default}) { + return keys %chanconf; + } else { + return keys %chan; + } } ##### @@ -172,31 +194,74 @@ 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; } + $chan ||= "_default"; + + 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); + } - &DEBUG("param => $param, msgType => $msgType."); - foreach (keys %chan) { - &DEBUG(" $_ => $chan{$_}"); + return $chan{$chan} || $chan{_default} || 0; } + &DEBUG("ICC: no-match: 0/$param (msgType = $msgType)"); + return 0; } @@ -205,21 +270,32 @@ 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 { @@ -236,29 +312,37 @@ sub showProc { } close IN; - 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)"; - } elsif ($delta > 0) { - $str = "MEM:$prefix increased by $delta kB"; - } else { # delta < 0. - $delta = -$delta; - # never knew RSS could decrease, probably Size can't? - $str = "MEM:$prefix decreased by $delta kB. YES YES YES"; - } - - &status($str); - } - $memusageOld = $memusage; + } elsif ($^O eq "netbsd") { + $memusage = (stat "/proc/$$/mem")[7]/1024; + + } elsif ($^O =~ /^(free|open)bsd$/) { + my @info = split /\s+/, `/bin/ps -l -p $$`; + $memusage = $info[20]; + } else { $memusage = "UNKNOWN"; + return; } - ### TODO: FreeBSD/*BSD support. + + 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)"; + } elsif ($delta > 0) { + $str = "MEM:$prefix increased by $delta kB"; + } else { # delta < 0. + $delta = -$delta; + # never knew RSS could decrease, probably Size can't? + $str = "MEM:$prefix decreased by $delta kB. YES YES YES"; + } + + &status($str); + } + $memusageOld = $memusage; } ###### @@ -279,7 +363,7 @@ sub setup { # read. &loadLang($bot_misc_dir. "/blootbot.lang"); - &loadIRCServers($bot_misc_dir. "/ircII.servers"); + &loadIRCServers(); &readUserFile(); &readChanFile(); &loadMyModulesNow(); # must be after chan file. @@ -287,12 +371,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 { @@ -339,14 +432,19 @@ 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? &closeLog(); - ### is this valid? - &writeUserFile(); - &writeChanFile(); } sub restart { @@ -358,11 +456,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");