# use strict; # TODO
use POSIX qw(strftime);
-use vars qw(%sched);
+use vars qw(%sched %schedule);
+
+# format: function name = (
+# str chanconfdefault,
+# int internaldefault,
+# bool deferred,
+# int next run, (optional)
+# )
+
+#%schedule = {
+# uptimeLoop => ("", 60, 1),
+#};
+
+sub setupSchedulersII {
+ foreach (keys %schedule) {
+ &queueTask($_, @{ $schedule{$_} });
+ }
+}
+
+sub queueTask {
+ my($codename, $chanconfdef, $intervaldef, $defer) = @_;
+ my $t = &getChanConfDefault($chanconfdef, $intervaldef);
+ my $waittime = &getRandomInt($t);
+
+ if (!defined $waittime) {
+ &WARN("interval == waittime == UNDEF for $codename.");
+ return;
+ }
+
+ my $time = $schedule{$codename}[3];
+ if (defined $time and $time > time()) {
+ &WARN("Sched for $codename already exists.");
+ return;
+ }
+
+# &VERB("Scheduling \&$codename() for ".&Time2String($waittime),3);
+
+ my $retval = $conn->schedule($waittime, sub {
+ \&$codename;
+ }, @args );
+}
sub setupSchedulers {
&VERB("Starting schedulers...",2);
&uptimeLoop(1);
&randomQuote(2);
&randomFactoid(2);
- &randomFreshmeat(2);
&logLoop(1);
&chanlimitCheck(1);
&netsplitCheck(1); # mandatory
&shmFlush(1); # mandatory
&slashdotLoop(2);
&plugLoop(2);
- &freshmeatLoop(2);
&kernelLoop(2);
&wingateWriteFile(2);
&factoidCheck(2); # takes a couple of seconds on a 486. defer it
+# todo: convert to new format... or nuke altogether.
&newsFlush(1);
# todo: squeeze this into a one-liner.
}
}
-sub randomFreshmeat {
- my $interval = &getChanConfDefault("randomFreshmeatInterval", 60);
-
- if (@_) {
- &ScheduleThis($interval, "randomFreshmeat");
- return if ($_[0] eq "2"); # defer.
- }
-
- my @chans = &ChanConfList("randomFreshmeat");
- return unless (scalar @chans);
-
- &Forker("freshmeat", sub {
- my $retval = &Freshmeat::randPackage();
-
- foreach (@chans) {
- next unless (&validChan($_));
-
- &status("sending random Freshmeat to $_.");
- &say($_, $line);
- }
- } );
-}
-
sub logLoop {
if (@_) {
&ScheduleThis(60, "logLoop");
my $max_time = &getChanConfDefault("seenMaxDays", 30) *60*60*24;
my $delete = 0;
- if ($param{'DBType'} =~ /^pgsql|mysql|sqlite/i) {
+ if ($param{'DBType'} =~ /^(pgsql|mysql|sqlite)/i) {
my $query;
if ($param{'DBType'} =~ /^mysql|sqlite$/i) {
while (my @row = $sth->fetchrow_array) {
my ($nick,$time) = @row;
- &dbDel("seen",{"nick"=>$nick});
+ &sqlDelete("seen", { nick => $nick } );
$delete++;
}
$sth->finish;
}
- } elsif ($param{'DBType'} =~ /^dbm/i) {
- my $time = time();
-
- foreach (keys %seen) {
- my $delta_time = $time - &dbGet("seen", "time", "nick", $_);
- next unless ($delta_time > $max_time);
-
- &DEBUG("seenFlushOld: ".&Time2String($delta_time) );
- delete $seen{$_};
- $delete++;
- }
} else {
- &FIXME("seenFlushOld: for PG/NO-DB.");
+ &FIXME("seenFlushOld: for bad DBType:" . $param{'DBType'} . ".");
}
&VERB("SEEN deleted $delete seen entries.",2);
}
if ($delete or $duser) {
- &News::writeNews();
&status("NewsFlush: deleted: $delete news entries; $duser user cache.");
}
}
delete $cache{warn}{chanlimit}{$chan};
if (!defined $limit) {
- &status("chanlimit: setting for first time or from netsplit, for $chan");
+ &status("chanlimit: $chan: setting for first time or from netsplit.");
}
if (exists $cache{chanlimitChange}{$chan}) {
$stats{'new'} = 0;
$stats{'old'} = 0;
- if ($param{'DBType'} =~ /^(mysql|pgsql|sqlite|dbm)$/i) {
+ if ($param{'DBType'} =~ /^(mysql|pgsql|sqlite)$/i) {
foreach $nick (keys %seencache) {
- my $retval = &dbReplace("seen", "nick", (
- "nick" => lc $seencache{$nick}{'nick'},
- "time" => $seencache{$nick}{'time'},
- "host" => $seencache{$nick}{'host'},
- "channel" => $seencache{$nick}{'chan'},
- "message" => $seencache{$nick}{'msg'},
- ) );
+ my $retval = &sqlReplace("seen", {
+ nick => lc $seencache{$nick}{'nick'},
+ time => $seencache{$nick}{'time'},
+ host => $seencache{$nick}{'host'},
+ channel => $seencache{$nick}{'chan'},
+ message => $seencache{$nick}{'msg'},
+ } );
+
delete $seencache{$nick};
$flushed++;
}
&joinNextChan();
}
+ # debug. needed for testing
+ &TODO("conn->connected = " . scalar($conn->connected()));
+ &TODO("time()-msgtime = " . scalar(time() - $msgtime));
+
if (!$conn->connected or time() - $msgtime > 3600) {
# todo: shouldn't we use cache{connect} somewhere?
if (exists $cache{connect}) {
my ($shmid, $size) = ($2,$5);
next unless ($shmid != $shm and $size == 2000);
my $z = &shmRead($shmid);
- if ($z =~ /^(\d+): /) {
- my $time = $1;
+ if ($z =~ /^(\S+):(\d+):(\d+): /) {
+ my $n = $1;
+ my $pid = $2;
+ my $time = $3;
next if (time() - $time < 60*60);
-
+ # FIXME remove not-pid shm if parent process dead
+ next if ($pid == $bot_pid);
+ # don't touch other bots, if they're running.
+ next unless ($param{ircNick} =~ /^\Q$n\E$/);
} else {
# &DEBUG("shm: $shmid is not ours or old blootbot => ($z)");
# next;
}
sub uptimeLoop {
- return unless &IsChanConf("uptime");
+ return if (!defined &uptimeWriteFile);
+# return unless &IsChanConf("uptime");
if (@_) {
&ScheduleThis(60, "uptimeLoop");
} );
}
-sub freshmeatLoop {
- if (@_) {
- &ScheduleThis(60, "freshmeatLoop");
- return if ($_[0] eq "2");
- }
-
- my @chans = &ChanConfList("freshmeatAnnounce");
- return unless (scalar @chans);
-
- &Forker("freshmeat", sub {
- my $data = &Freshmeat::freshmeatAnnounce();
-
- foreach (@chans) {
- next unless (&::validChan($_));
-
- &::status("sending freshmeat update to $_.");
- &msg($_, $data);
- }
- } );
-}
-
sub kernelLoop {
if (@_) {
&ScheduleThis(240, "kernelLoop");