release 1.5
[spider.git] / perl / DXMsg.pm
index e9097d9ca4f8fa159b2ecce5092e08689a8d8a3f..bbda05cb5571c5c8718e28708c6456350a9a87d7 100644 (file)
@@ -19,16 +19,19 @@ use DXCluster;
 use DXProtVars;
 use DXProtout;
 use DXDebug;
+use DXLog;
 use FileHandle;
 use Carp;
 
 use strict;
-use vars qw(%work @msg $msgdir %valid %busy);
+use vars qw(%work @msg $msgdir %valid %busy $maxage $last_clean);
 
 %work = ();                # outstanding jobs
 @msg = ();                 # messages we have
 %busy = ();                # station interlocks
 $msgdir = "$main::root/msg";              # directory contain the msgs
+$maxage = 30 * 86400;      # the maximum age that a message shall live for if not marked 
+$last_clean = 0;           # last time we did a clean
 
 %valid = (
   fromnode => '9,From Node',
@@ -50,6 +53,7 @@ $msgdir = "$main::root/msg";              # directory contain the msgs
   read => '9,Times read',
   size => '0,Size',
   msgno => '0,Msgno',
+  keep => '0,Keep this?,yesno',
 );
 
 # allocate a new object
@@ -167,6 +171,9 @@ sub process
              push @{$ref->{gotit}}, $f[2];           # mark this up as being received
                  $ref->store($ref->{lines});
                  add_dir($ref);
+                 my $dxchan = DXChannel->get($ref->{to});
+                 $dxchan->send("New mail has arrived for you") if $dxchan;
+                 Log('msg', "Message $ref->{msgno} from $ref->{from} received from $f[2] for $ref->{to}");
                }
                $ref->stop_msg($self);
                queue_msg();
@@ -181,10 +188,12 @@ sub process
          my $ref = $work{"$f[2]$f[3]"};
          if ($ref) {
                if ($ref->{private}) {                   # remove it if it private and gone off site#
-             $ref->del_msg;
+                       Log('msg', "Message $ref->{msgno} from $ref->{from} sent to $f[2] and deleted");
+                       $ref->del_msg;
            } else {
-             push @{$ref->{gotit}}, $f[2];           # mark this up as being received
-                 $ref->store($ref->{lines});             # re- store the file
+                       Log('msg', "Message $ref->{msgno} from $ref->{from} sent to $f[2]");
+                       push @{$ref->{gotit}}, $f[2];           # mark this up as being received
+                       $ref->store($ref->{lines});             # re- store the file
            }
        $ref->stop_msg($self);
          } else {
@@ -239,6 +248,8 @@ sub process
          last SWITCH;
        }
   }
+
+  clean_old() if $main::systime - $last_clean > 3600 ;    # clean the message queue
 }
 
 
@@ -266,6 +277,7 @@ sub store
          }
          $fh->close;
          dbg('msg', "file $ref->{to} stored\n");
+         Log('msg', "file $ref->{to} from $ref->{from} stored" );
     } else {
       confess "can't open file $ref->{to} $!";  
     }
@@ -292,6 +304,7 @@ sub store
          }
          $fh->close;
          dbg('msg', "msg $ref->{msgno} stored\n");
+         Log('msg', "msg $ref->{msgno} from $ref->{from} to $ref->{to} stored" );
     } else {
       confess "can't open msg file $fn $!";  
     }
@@ -315,6 +328,27 @@ sub del_msg
   dbg('msg', "deleting $self->{msgno}\n");
 }
 
+# clean out old messages from the message queue
+sub clean_old
+{
+       my $ref;
+       
+       # mark old messages for deletion
+       foreach $ref (@msg) {
+               if (!$ref->{keep} && $ref->{t} < $main::systime - $maxage) {
+                       $ref->{deleteme} = 1;
+                       delete $ref->{gotit};
+                       delete $ref->{list};
+                       unlink filename($ref->{msgno});
+                       dbg('msg', "deleting old $ref->{msgno}\n");
+               }
+       }
+
+       # remove them all from the active message list
+       @msg = map { $_->{deleteme} ? () : $_ } @msg;
+       $last_clean = $main::systime;
+}
+
 # read in a message header
 sub read_msg_header
 { 
@@ -633,6 +667,8 @@ sub do_send_stuff
                  $ref->add_dir();
                  #push @out, $self->msg('sendsent', $to);
                  push @out, "msgno $ref->{msgno} sent to $to";
+                 my $dxchan = DXChannel->get(uc $to);
+                 $dxchan->send("New mail has arrived for you") if $dxchan;
            }
          }
          delete $loc->{lines};
@@ -658,6 +694,15 @@ sub do_send_stuff
   return (1, @out);
 }
 
+# return the standard directory line for this ref 
+sub dir
+{
+  my $ref = shift;
+  return sprintf "%6d%s%s%5d %8.8s %8.8s %-6.6s %5.5s %-30.30s", 
+    $ref->msgno, $ref->read ? '-' : ' ', $ref->private ? 'p' : ' ', $ref->size,
+       $ref->to, $ref->from, cldate($ref->t), ztime($ref->t), $ref->subject;
+}
+
 no strict;
 sub AUTOLOAD
 {