#
if (&IsParam("useStrict")) { use strict; }
+use vars qw($AUTOLOAD);
###
### REQUIRED MODULES.
### MODULES.
%myModules = (
"countdown" => "Countdown.pl",
- "allowDNS" => "DNS.pl",
"debian" => "Debian.pl",
"debianExtra" => "DebianExtra.pl",
"dict" => "Dict.pl",
"kernel" => "Kernel.pl",
"ircdcc" => "UserDCC.pl",
"perlMath" => "Math.pl",
+ "news" => "News.pl",
"quote" => "Quote.pl",
"rootwarn" => "RootWarn.pl",
"search" => "Search.pl",
"wingate" => "Wingate.pl",
"insult" => "insult.pl",
"nickometer" => "nickometer.pl",
+ "babelfish" => "babel.pl",
);
-@myModulesLoadNow = ('topic', 'uptime',);
-@myModulesReloadNot = ('IRC/Irc.pl','IRC/Schedulers.pl');
+### THIS IS NOT LOADED ON RELOAD :(
+BEGIN {
+ @myModulesLoadNow = ('topic', 'uptime', 'news');
+ @myModulesReloadNot = ('IRC/Irc.pl','IRC/Schedulers.pl');
+}
sub loadCoreModules {
if (!opendir(DIR, $bot_src_dir)) {
exit 1;
}
- &status("Loading CORE modules...");
-
+ my @mods;
while (defined(my $file = readdir DIR)) {
next unless $file =~ /\.pl$/;
next unless $file =~ /^[A-Z]/;
- my $mod = "$bot_src_dir/$file";
- ### TODO: use eval and exit gracefully?
- require $mod;
- $moduleAge{$mod} = (stat $mod)[9];
- &showProc(" ($file)") if (&IsParam("DEBUG"));
+ push(@mods, $file);
}
closedir DIR;
+ &status("Loading ".scalar(@mods)." CORE modules...");
+
+ foreach (sort @mods) {
+ my $mod = "$bot_src_dir/$_";
+
+ eval "require \"$mod\"";
+ if ($@) {
+ &ERROR("lCM => $@");
+ &shutdown();
+ exit 1;
+ }
+
+ $moduleAge{$mod} = (stat $mod)[9];
+ &showProc(" ($_)") if (&IsParam("DEBUG"));
+ }
}
sub loadDBModules {
next unless $file =~ /^[A-Z]/;
my $mod = "$bot_src_dir/Factoids/$file";
### TODO: use eval and exit gracefully?
- require $mod;
+ eval "require \"$mod\"";
+ if ($@) {
+ &WARN("lFM: $@");
+ exit 1;
+ }
+
$moduleAge{$mod} = (stat $mod)[9];
&showProc(" ($file)") if (&IsParam("DEBUG"));
}
exit 1;
}
&showProc(" (Net::IRC)");
+
} else {
&status("IRC support DISABLED.");
return;
&status("Loading MyModules...");
foreach (@myModulesLoadNow) {
$total++;
+ if (!defined $_) {
+ &WARN("mMLN: null element.");
+ next;
+ }
+
+ if (!&IsParam($_) and !&IsChanConf($_) and !&getChanConfList($_)) {
+ if (exists $myModules{$_}) {
+ &status("myModule: $myModules{$_} or $_ (1) not loaded.");
+ } else {
+ &DEBUG("myModule: $_ (2) not loaded.");
+ }
- if (!exists $param{$_}) {
- &DEBUG("myModule: $myModules{$_} not loaded.");
next;
}
+
&loadMyModule($myModules{$_});
$loaded++;
}
- &status("Modules: Loaded/Total [$loaded/$total]");
+ &status("Module: Runtime: Loaded/Total [$loaded/$total]");
+}
+
+### rename to moduleReloadAll?
+sub reloadAllModules {
+### &status("Module: reloading all.");
+ foreach (map { substr($_,2) } keys %moduleAge) {
+ &reloadModule($_);
+ }
+### &status("Module: reloading done.");
}
### rename to modulesReload?
-sub reloadModules {
-## my @check = map { $myModules{$_} } keys %myModules;
-## push(@check, map { substr($_,2) } keys %moduleAge);
- my @check = map { substr($_,2) } keys %moduleAge;
-
- &DEBUG("rM: moduleAge must be in src/BLAH format?");
- foreach (keys %moduleAge) {
- &DEBUG("rM: moduleAge{$_} => '...'.");
+sub reloadModule {
+ my ($mod) = @_;
+ my $file = (grep /\/$mod/, keys %INC)[0];
+
+ # don't reload if it's not our module.
+ if ($mod =~ /::/ or $mod !~ /pl$/) {
+ &VERB("Not reloading $mod.",3);
+ return;
}
- foreach (@check) {
- my $mod = $_;
- my $file = (grep /\/$mod/, keys %INC)[0];
+ if (!defined $file) {
+ &WARN("rM: Cannot reload $mod since it was not loaded anyway.");
+ return;
+ }
- if (!defined $file) {
- &DEBUG("rM: mod '$mod' was not found in \%INC.");
- next;
- }
+ if (! -f $file) {
+ &ERROR("rM: file '$file' does not exist?");
+ return;
+ }
- if (! -f $file) {
- &DEBUG("rM: file '$file' does not exist?");
- next;
- }
+ if (grep /$mod/, @myModulesReloadNot) {
+ &DEBUG("rM: SHOULD NOT RELOAD $mod!!!");
+ return;
+ }
- my $age = (stat $file)[9];
- next if ($age == $moduleAge{$file});
+ my $age = (stat $file)[9];
- if (grep /$mod/, @myModulesReloadNot) {
- &DEBUG("rM: SHOULD NOT RELOAD $mod!!!");
- next;
- }
+ if (!exists $moduleAge{$file}) {
+ &DEBUG("Looks like $file was not loaded; fixing.");
+ } else {
+ return if ($age == $moduleAge{$file});
- &DEBUG("rM: (loading) => '$mod' or ($_).");
- delete $INC{$file};
- eval "require \"$file\"";
- if (@$) {
- &DEBUG("rM: failure: @$");
- } else {
- &DEBUG("rM: good! (reloaded)");
+ if ($age < $moduleAge{$file}) {
+ &WARN("rM: we're not gonna downgrade the file. use 'touch'.");
+ return;
}
+
+ my $dc = &Time2String($age - $moduleAge{$file});
+ my $ago = &Time2String(time() - $moduleAge{$file});
+
+ &VERB("Module: delta change: $dc",2);
+ &VERB("Module: ago: $ago",2);
+ }
+
+ &status("Module: Loading $mod...");
+
+ delete $INC{$file};
+ eval "require \"$file\""; # require or use?
+ if (@$) {
+ &DEBUG("rM: failure: @$");
+ } else {
+ my $basename = $file;
+ $basename =~ s/^.*\///;
+ &status("Module: reloaded $basename");
+ $moduleAge{$file} = $age;
}
- &DEBUG("rM: Done.");
}
###
sub loadPerlModule {
return 0 if (exists $perlModulesMissing{$_[0]});
+ &reloadModule($_[0]);
return 1 if (exists $perlModulesLoaded{$_[0]});
eval "use $_[0]";
if (!defined $tmp) {
&WARN("loadMyModule: module is NULL.");
return 0;
- } else {
- &DEBUG("lMM: arg = '$tmp'.");
}
my ($modulebase, $modulefile);
}
my $modulefile = "$bot_src_dir/Modules/$modulebase";
- return 1 if (grep /$modulefile/, keys %INC);
+ # call reloadModule() which checks age of file and reload.
+ if (grep /\/$modulebase$/, keys %INC) {
+ &reloadModule($modulebase);
+ return 1; # depend on reloadModule?
+ }
if (! -f $modulefile) {
&ERROR("lMM: module ($modulebase) does not exist.");
if ($$ == $bot_pid) { # parent.
&shutdown() if (defined $shm and defined $dbh);
} else { # child.
- &delForked($modulename);
+ &DEBUG("b4 delfork 1");
+ &delForked($modulebase);
}
exit 1;
eval "require \"$modulefile\"";
if ($@) {
&ERROR("cannot load my module: $modulebase");
- if ($bot_pid == $$) { # parent.
- &shutdown() if (defined $shm and defined $dbh);
- } else { # child.
- &delForked($modulename);
+ if ($bot_pid != $$) { # child.
+ &DEBUG("b4 delfork 2");
+ &delForked($modulebase);
+ exit 1;
}
- exit 1;
+ return 0;
} else {
$moduleAge{$modulefile} = (stat $modulefile)[9];
- &DEBUG("lMM: setting moduleAge{$modulefile} = time();");
&status("myModule: Loaded $modulebase ...");
&showProc(" ($modulebase)");
}
}
-### this chews 3megs on potato, 300 kB on slink.
-$no_syscall = 0;
-###eval "require 'sys/syscall.ph'";
-#if ($@) {
-# &WARN("sys/syscall.ph has not been installed//generated. gettimeofday
-#will use time() instead");
- $no_syscall = 1;
-#}
-#&showProc(" (syscall)");
+$no_timehires = 0;
+eval "use Time::HiRes qw(gettimeofday tv_interval)";
+if ($@) {
+ &WARN("No Time::HiRes?");
+ $no_timehires = 1;
+}
+&showProc(" (Time::HiRes)");
+
+sub AUTOLOAD {
+ return if ($AUTOLOAD =~ /__/); # internal.
+
+ &ERROR("UNKNOWN FUNCTION CALLED: $AUTOLOAD");
+ foreach (@_) {
+ next unless (defined $_);
+ &status(" => $_");
+ }
+}
1;