]> git.donarmstrong.com Git - infobot.git/blobdiff - src/modules.pl
- unified hook changes.
[infobot.git] / src / modules.pl
index 51a51df63cca04e9e213fafef22469bae7560546..75b64ba4e64141416fd3996550e4bb24ae301dad 100644 (file)
@@ -1,11 +1,12 @@
 #
 #  modules.pl: pseudo-Module handler
-#      Author: xk <xk@leguin.openprojects.net>
+#      Author: dms
 #     Version: v0.2 (20000629)
 #     Created: 20000624
 #
 
 if (&IsParam("useStrict")) { use strict; }
+use vars qw($AUTOLOAD);
 
 ###
 ### REQUIRED MODULES.
@@ -49,8 +50,8 @@ if ($@) {
 @myModulesReloadNot    = ('IRC/Irc.pl','IRC/Schedulers.pl');
 
 sub loadCoreModules {
-    if (!opendir(DIR, $infobot_src_dir)) {
-       &ERROR("can't open source directory $infobot_src_dir: $!");
+    if (!opendir(DIR, $bot_src_dir)) {
+       &ERROR("can't open source directory $bot_src_dir: $!");
        exit 1;
     }
 
@@ -59,7 +60,7 @@ sub loadCoreModules {
     while (defined(my $file = readdir DIR)) {
        next unless $file =~ /\.pl$/;
        next unless $file =~ /^[A-Z]/;
-       my $mod = "$infobot_src_dir/$file";
+       my $mod = "$bot_src_dir/$file";
        ### TODO: use eval and exit gracefully?
        require $mod;
        $moduleAge{$mod} = (stat $mod)[9];
@@ -80,7 +81,7 @@ sub loadDBModules {
        &showProc(" (DBI // mysql)");
 
        &status("  using MySQL support.");
-       require "$infobot_src_dir/db_mysql.pl";
+       require "$bot_src_dir/db_mysql.pl";
 
     } elsif ($param{'DBType'} =~ /^pgsql$/i) {
        eval "use Pg";
@@ -91,11 +92,11 @@ sub loadDBModules {
        &showProc(" (Pg // postgreSQLl)");
 
        &status("  using PostgreSQL support.");
-       require "$infobot_src_dir/db_pgsql.pl";
+       require "$bot_src_dir/db_pgsql.pl";
     } elsif ($param{'DBType'} =~ /^dbm$/i) {
 
        &status("  using Berkeley DBM 1.85/2.0 support.");
-       require "$infobot_src_dir/db_dbm.pl";
+       require "$bot_src_dir/db_dbm.pl";
     } else {
 
        &status("DB support DISABLED.");
@@ -111,7 +112,7 @@ sub loadFactoidsModules {
        return;
     }
 
-    if (!opendir(DIR, "$infobot_src_dir/Factoids")) {
+    if (!opendir(DIR, "$bot_src_dir/Factoids")) {
        &ERROR("can't open source directory Factoids: $!");
        exit 1;
     }
@@ -119,7 +120,7 @@ sub loadFactoidsModules {
     while (defined(my $file = readdir DIR)) {
        next unless $file =~ /\.pl$/;
        next unless $file =~ /^[A-Z]/;
-       my $mod = "$infobot_src_dir/Factoids/$file";
+       my $mod = "$bot_src_dir/Factoids/$file";
        ### TODO: use eval and exit gracefully?
        require $mod;
        $moduleAge{$mod} = (stat $mod)[9];
@@ -142,7 +143,7 @@ sub loadIRCModules {
        return;
     }
 
-    if (!opendir(DIR, "$infobot_src_dir/IRC")) {
+    if (!opendir(DIR, "$bot_src_dir/IRC")) {
        &ERROR("can't open source directory Factoids: $!");
        exit 1;
     }
@@ -150,7 +151,7 @@ sub loadIRCModules {
     while (defined(my $file = readdir DIR)) {
        next unless $file =~ /\.pl$/;
        next unless $file =~ /^[A-Z]/;
-       my $mod = "$infobot_src_dir/IRC/$file";
+       my $mod = "$bot_src_dir/IRC/$file";
        ### TODO: use eval and exit gracefully?
        require $mod;
        $moduleAge{$mod} = (stat $mod)[9];
@@ -175,52 +176,69 @@ sub loadMyModulesNow {
        $loaded++;
     }
 
-    &status("Modules: Loaded/Total [$loaded/$total]");
+    &status("Module: 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;
-       }
+    my $age = (stat $file)[9];
+    return if ($age == $moduleAge{$file});
 
-       my $age = (stat $file)[9];
-       next if ($age == $moduleAge{$file});
+    if ($age < $moduleAge{$file}) {
+       &WARN("rM: we're not gonna downgrade the file. use 'touch'.");
+       return;
+    }
 
-       if (grep /$mod/, @myModulesReloadNot) {
-           &DEBUG("rM: SHOULD NOT RELOAD $mod!!!");
-           next;
-       }
+    if (grep /$mod/, @myModulesReloadNot) {
+       &DEBUG("rM: SHOULD NOT RELOAD $mod!!!");
+       return;
+    }
 
-       &DEBUG("rM: (loading) => '$mod' or ($_).");
-       delete $INC{$file};
-       eval "require \"$file\"";
-       if (@$) {
-           &DEBUG("rM: failure: @$");
-       } else {
-           &DEBUG("rM: good! (reloaded)");
-       }
+    my $dc  = &Time2String($age   - $moduleAge{$file});
+    my $ago = &Time2String(time() - $moduleAge{$file});
+
+    &status("Module: Loading $mod...");
+    &VERB("Module:  delta change: $dc",2);
+    &VERB("Module:           ago: $ago",2);
+
+    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.");
 }
 
 ###
@@ -232,6 +250,7 @@ local %perlModulesMissing = ();
 
 sub loadPerlModule {
     return 0 if (exists $perlModulesMissing{$_[0]});
+    &reloadModule($_[0]);
     return 1 if (exists $perlModulesLoaded{$_[0]});
 
     eval "use $_[0]";
@@ -259,17 +278,26 @@ sub loadMyModule {
        ($modulename, $modulebase) = ($tmp, $myModules{$tmp});
     } else {
        $modulebase = $tmp;
+       if ($tmp = grep /^$modulebase$/, keys %myModules) {
+           &DEBUG("lMM: lame hack, file => name => $tmp.");
+           $modulename = $tmp;
+       }
     }
-    my $modulefile = "$infobot_src_dir/Modules/$modulebase";
+    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 ($$ == $infobot_pid) {       # parent.
+       if ($$ == $bot_pid) {   # parent.
            &shutdown() if (defined $shm and defined $dbh);
        } else {                        # child.
-           &delForked($modulename);
+           &DEBUG("b4 delfork 1");
+           &delForked($modulebase);
        }
 
        exit 1;
@@ -278,16 +306,15 @@ sub loadMyModule {
     eval "require \"$modulefile\"";
     if ($@) {
        &ERROR("cannot load my module: $modulebase");
-       if ($infobot_pid == $$) {       # parent.
-           &shutdown() if (defined $shm and defined $dbh);
-       } else {                        # child.
+       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)");
@@ -305,4 +332,11 @@ $no_syscall = 0;
 #}
 #&showProc(" (syscall)");
 
+sub AUTOLOAD {
+    &ERROR("UNKNOWN FUNCTION CALLED: $AUTOLOAD");
+    foreach (@_) {
+       &status("  => $_");
+    }
+}
+
 1;