# 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
$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.
$last{say} = "";
$last{msg} = "";
$userHandle = "default";
-$msgtime = time();
$wingaterun = time();
$firsttime = 1;
$utime_userfile = 0;
$utime_chanfile = 0;
$wtime_chanfile = 0;
$ucount_chanfile = 0;
-
-$bot_version = "blootbot cvs (20010214) -- $^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";
##########
&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();
# 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);
+ }
+
+ 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;
}
# 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};
+}
+
+#####
+# 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 {
$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 {
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.
### 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");