]> git.donarmstrong.com Git - infobot.git/blobdiff - src/modules.pl
A round of fixes:
[infobot.git] / src / modules.pl
index 6802e32d088bc6df30adb28b666f68bb0aceb523..30c5a40c8d9d2d2113ab89e7d0f159ec9bf4e5c4 100644 (file)
@@ -6,6 +6,7 @@
 #
 
 if (&IsParam("useStrict")) { use strict; }
+use vars qw($AUTOLOAD);
 
 ###
 ### REQUIRED MODULES.
@@ -21,7 +22,6 @@ if ($@) {
 ### MODULES.
 %myModules = (
        "countdown"     => "Countdown.pl",
-       "allowDNS"      => "DNS.pl",
        "debian"        => "Debian.pl",
        "debianExtra"   => "DebianExtra.pl",
        "dict"          => "Dict.pl",
@@ -31,6 +31,7 @@ if ($@) {
        "kernel"        => "Kernel.pl",
        "ircdcc"        => "UserDCC.pl",
        "perlMath"      => "Math.pl",
+       "news"          => "News.pl",
        "quote"         => "Quote.pl",
        "rootwarn"      => "RootWarn.pl",
        "search"        => "Search.pl",
@@ -44,9 +45,13 @@ if ($@) {
        "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)) {
@@ -54,18 +59,28 @@ sub loadCoreModules {
        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 {
@@ -121,7 +136,12 @@ sub loadFactoidsModules {
        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"));
     }
@@ -137,6 +157,7 @@ sub loadIRCModules {
            exit 1;
        }
        &showProc(" (Net::IRC)");
+
     } else {
        &status("IRC support DISABLED.");
        return;
@@ -166,25 +187,35 @@ sub loadMyModulesNow {
     &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("Modules: reloading all.");
+###    &status("Module: reloading all.");
     foreach (map { substr($_,2) } keys %moduleAge) {
         &reloadModule($_);
     }
-    &status("Modules: reloading done.");
+###    &status("Module: reloading done.");
 }
 
 ### rename to modulesReload?
@@ -192,25 +223,48 @@ 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;
+    }
+
     if (!defined $file) {
-       &DEBUG("rM: mod '$mod' was not found in \%INC.");
+       &WARN("rM: Cannot reload $mod since it was not loaded anyway.");
        return;
     }
 
     if (! -f $file) {
-       &DEBUG("rM: file '$file' does not exist?");
+       &ERROR("rM: file '$file' does not exist?");
        return;
     }
 
-    my $age = (stat $file)[9];
-    return if ($age == $moduleAge{$file});
-
     if (grep /$mod/, @myModulesReloadNot) {
        &DEBUG("rM: SHOULD NOT RELOAD $mod!!!");
        return;
     }
 
+    my $age = (stat $file)[9];
+
+    if (!exists $moduleAge{$file}) {
+       &DEBUG("Looks like $file was not loaded; fixing.");
+    } else {
+       return if ($age == $moduleAge{$file});
+
+       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 (@$) {
@@ -218,7 +272,7 @@ sub reloadModule {
     } else {
        my $basename = $file;
        $basename =~ s/^.*\///;
-       &status("Modules: reloaded $basename");
+       &status("Module: reloaded $basename");
        $moduleAge{$file} = $age;
     }
 }
@@ -232,10 +286,8 @@ local %perlModulesMissing = ();
 
 sub loadPerlModule {
     return 0 if (exists $perlModulesMissing{$_[0]});
-    return 1 if (exists $perlModulesLoaded{$_[0]});
-
-    &DEBUG("lPM: _ => '$_[0]'.");
     &reloadModule($_[0]);
+    return 1 if (exists $perlModulesLoaded{$_[0]});
 
     eval "use $_[0]";
     if ($@) {
@@ -269,14 +321,19 @@ sub loadMyModule {
     }
     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;
@@ -285,13 +342,13 @@ sub loadMyModule {
     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];
 
@@ -301,14 +358,22 @@ sub loadMyModule {
     }
 }
 
-### 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;