# Created: 20000117
#
-if (&IsParam("useStrict")) { use strict; }
+# 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);
&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.
# my $count = map { exists $sched{$_}{TIME} } keys %sched;
my $count = 0;
foreach (keys %sched) {
-# next unless (exists $sched{$_}{TIME});
my $time = $sched{$_}{TIME};
next unless (defined $time and $time > time());
}
sub randomFreshmeat {
- my $interval = &getChanConfDefault("randomFresheatInterval", 60);
+ my $interval = &getChanConfDefault("randomFreshmeatInterval", 60);
if (@_) {
&ScheduleThis($interval, "randomFreshmeat");
### check if current size is too large.
if ( -s $file{log} > $param{'maxLogSize'}) {
- my $date = sprintf("%04d%02d%02d", (localtime)[5,4,3]);
+ my $date = sprintf("%04d%02d%02d", (gmtime)[5,4,3]);
$file{log} = $param{'logfile'} ."-". $date;
&status("cycling log file.");
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) {
}
my $sth = $dbh->prepare($query);
- $sth->execute;
-
- while (my @row = $sth->fetchrow_array) {
- my ($nick,$time) = @row;
+ if ($sth->execute) {
+ while (my @row = $sth->fetchrow_array) {
+ my ($nick,$time) = @row;
- &dbDel("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++;
+ &sqlDelete("seen", { nick => $nick } );
+ $delete++;
+ }
+ $sth->finish;
}
} 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.");
}
}
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'},
- ) );
- delete $seencache{$nick};
- $flushed++;
-
- next;
-
- ###
- ### old code.
- ###
-
- my $exists = &dbGet("seen", "nick", "nick=".&dbQuote($nick) );
-
- if (defined $exists and $exists) {
- &dbUpdate("seen", "nick", $nick, (
- "time" => $seencache{$nick}{'time'},
- "host" => $seencache{$nick}{'host'},
- "channel" => $seencache{$nick}{'chan'},
- "message" => $seencache{$nick}{'msg'},
- ) );
- $stats{'old'}++;
- } else {
- my $retval = &dbInsert("seen", $nick, (
- "nick" => $seencache{$nick}{'nick'},
- "time" => $seencache{$nick}{'time'},
- "host" => $seencache{$nick}{'host'},
- "channel" => $seencache{$nick}{'chan'},
- "message" => $seencache{$nick}{'msg'},
- ) );
- $stats{'new'}++;
-
- ### TODO: put bad nick into a list and don't do it again!
- &FIXME("Should never happen! (nick => $nick)") if !$retval;
- }
-
- delete $seencache{$nick};
- $flushed++;
- }
-
- } elsif ($param{'DBType'} =~ /^dbm/i) {
-
- foreach $nick (keys %seencache) {
- my $retval = &dbInsert("seen", $nick, (
- "nick" => $seencache{$nick}{'nick'},
- "time" => $seencache{$nick}{'time'},
- "host" => $seencache{$nick}{'host'},
- "channel" => $seencache{$nick}{'chan'},
- "message" => $seencache{$nick}{'msg'},
- ) );
-
- ### TODO: put bad nick into a list and don't do it again!
- &FIXME("Should never happen! (nick => $nick)") if !$retval;
+ 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++;
delete $cache{connect};
} else {
&status("IRCTEST: possible lost in space; checking. ".
- scalar(localtime) );
+ scalar(gmtime) );
&msg($ident, "TEST");
$cache{connect} = time();
}
# compress logs that should have been compressed.
# todo: use strftime?
- my ($day,$month,$year) = (localtime(time()))[3,4,5];
+ my ($day,$month,$year) = (gmtime(time()))[3,4,5];
my $date = sprintf("%04d%02d%02d",$year+1900,$month+1,$day);
if (!opendir(DIR,"$bot_log_dir")) {
}
sub uptimeLoop {
- return unless &IsChanConf("uptime");
+ return if (!defined &uptimeWriteFile);
+# return unless &IsChanConf("uptime");
if (@_) {
&ScheduleThis(60, "uptimeLoop");
return if ($_[0] eq "2"); # defer.
}
- my $time = strftime("%H:%M", localtime(time()) );
+ my $time = strftime("%H:%M", gmtime(time()) );
my $c;
foreach (keys %channels) {