fix the pagelth problem if it zero and also have a changeable default
[spider.git] / perl / DXCommandmode.pm
index e49498574415692f7543d95cf89e5c6050db791d..79ba03b0b8f63ac3f189534677f9d4d55cb7c5e2 100644 (file)
@@ -37,7 +37,8 @@ use DB_File;
 use VE7CC;
 
 use strict;
-use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors %nothereslug $maxbadcount);
+use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase $maxerrors %nothereslug
+       $maxbadcount $msgpolltime $default_pagelth);
 
 %Cache = ();                                   # cache of dynamically loaded routine's mod times
 %cmd_cache = ();                               # cache of short names
@@ -46,6 +47,7 @@ $errstr = ();                                 # error string from eval
 $scriptbase = "$main::root/scripts"; # the place where all users start scripts go
 $maxerrors = 20;                               # the maximum number of concurrent errors allowed before disconnection
 $maxbadcount = 3;                              # no of bad words allowed before disconnection
+$msgpolltime = 3600;                   # the time between polls for new messages 
 
 
 use vars qw($VERSION $BRANCH);
@@ -86,7 +88,9 @@ sub start
        my $name = $user->{name};
        
        # log it
-       my $host = $self->{conn}->{peerhost} || "unknown";
+       my $host = $self->{conn}->{peerhost};
+       $host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport};
+       $host ||= "unknown";
        Log('DXCommand', "$call connected from $host");
 
        $self->{name} = $name ? $name : $call;
@@ -94,7 +98,9 @@ sub start
        $self->state('prompt');         # a bit of room for further expansion, passwords etc
        $self->{priv} = $user->priv || 0;
        $self->{lang} = $user->lang || $main::lang || 'en';
-       $self->{pagelth} = $user->pagelth || 20;
+       my $pagelth = $user->pagelth;
+       $pagelth = $default_pagelth unless defined $pagelth;
+       $self->{pagelth} = $pagelth;
        ($self->{width}) = $line =~ /width=(\d+)/; $line =~ s/\s*width=\d+\s*//;
        $self->{width} = 80 unless $self->{width} && $self->{width} > 80;
        $self->{consort} = $line;       # save the connection type
@@ -128,7 +134,12 @@ sub start
 
 
        # decide which motd to send
-       my $motd = "${main::motd}_nor" unless $self->{registered};
+       my $motd;
+       unless ($self->{registered}) {
+               $motd = "${main::motd}_nor_$self->{lang}";
+               $motd = "${main::motd}_nor" unless -e $motd;
+       }
+       $motd = "${main::motd}_$self->{lang}" unless $motd && -e $motd;
        $motd = $main::motd unless $motd && -e $motd;
        $self->send_file($motd) if -e $motd;
 
@@ -182,6 +193,7 @@ sub start
        $self->send($self->msg('qll')) if !$user->qra || (!$user->lat && !$user->long);
        $self->send($self->msg('hnodee1')) if !$user->qth;
        $self->send($self->msg('m9')) if DXMsg::for_me($call);
+       $self->lastmsgpoll($main::systime);
        $self->prompt;
 }
 
@@ -426,6 +438,8 @@ sub run_cmd
        if ($cmd) {
                # strip out // on command only
                $cmd =~ s|//|/|g;
+               $cmd =~ s|^/||g;                # no leading / either
+               $cmd =~ s|[^-?\w/]||g;          # and no funny characters either
                                        
                my ($path, $fcmd);
                        
@@ -441,7 +455,7 @@ sub run_cmd
                        
                # first expand out the entry to a command
                ($path, $fcmd) = search($main::localcmd, $cmd, "pl");
-               ($path, $fcmd) = search($main::cmd, $cmd, "pl") if !$path || !$fcmd;
+               ($path, $fcmd) = search($main::cmd, $cmd, "pl") unless $path && $fcmd;
 
                if ($path && $cmd) {
                        dbg("path: $cmd cmd: $fcmd") if isdbg('command');
@@ -487,11 +501,17 @@ sub run_cmd
 sub process
 {
        my $t = time;
-       my @dxchan = DXChannel->get_all();
+       my @dxchan = DXChannel::get_all();
        my $dxchan;
        
        foreach $dxchan (@dxchan) {
                next if $dxchan->sort ne 'U';  
+       
+               # send a outstanding message prompt if required
+               if ($t >= $dxchan->lastmsgpoll + $msgpolltime) {
+                       $dxchan->send($dxchan->msg('m9')) if DXMsg::for_me($dxchan->call);
+                       $dxchan->lastmsgpoll($t);
+               }
                
                # send a prompt if no activity out on this channel
                if ($t >= $dxchan->t + $main::user_interval) {
@@ -549,11 +569,18 @@ sub disconnect
 sub prompt
 {
        my $self = shift;
-       if ($self->{prompt}) {
-               $self->send($self->{prompt});
-       } else {
-               $self->send($self->msg($self->here ? 'pr' : 'pr2', $self->call, cldate($main::systime), ztime($main::systime)));
-       }
+       my $call = $self->call;
+       my $date = cldate($main::systime);
+       my $time = ztime($main::systime);
+       my $prompt = $self->{prompt} || $self->msg('pr');
+
+       $call = "($call)" unless $self->here;
+       $prompt =~ s/\%C/$call/g;
+       $prompt =~ s/\%D/$date/g;
+       $prompt =~ s/\%T/$time/g;
+       $prompt =~ s/\%M/$main::mycall/g;
+       
+       $self->send($prompt);
 }
 
 # broadcast a message to all users [except those mentioned after buffer]
@@ -562,7 +589,7 @@ sub broadcast
        my $pkg = shift;                        # ignored
        my $s = shift;                          # the line to be rebroadcast
        
-    foreach my $dxchan (DXChannel->get_all()) {
+    foreach my $dxchan (DXChannel::get_all()) {
                next unless $dxchan->{sort} eq 'U'; # only interested in user channels  
                next if grep $dxchan == $_, @_;
                $dxchan->send($s);                      # send it
@@ -572,7 +599,7 @@ sub broadcast
 # gimme all the users
 sub get_all
 {
-       return grep {$_->{sort} eq 'U'} DXChannel->get_all();
+       return grep {$_->{sort} eq 'U'} DXChannel::get_all();
 }
 
 # run a script for this user
@@ -610,40 +637,42 @@ sub search
        my @parts = split '/', $short_cmd;
        my $dirfn;
        my $curdir = $path;
-       my $p;
-       my $i;
-       my @lparts;
        
-       for ($i = 0; $i < @parts; $i++) {
-               my  $p = $parts[$i];
-               opendir(D, $curdir) or confess "can't open $curdir $!";
-               my @ls = readdir D;
-               closedir D;
-               my $l;
-               foreach $l (sort @ls) {
-                       next if $l =~ /^\./;
-                       if ($i < $#parts) {             # we are dealing with directories
-                               if ((-d "$curdir/$l") && $p eq substr($l, 0, length $p)) {
-                                       dbg("got dir: $curdir/$l\n") if isdbg('command');
-                                       $dirfn .= "$l/";
-                                       $curdir .= "/$l";
-                                       last;
-                               }
-                       } else {                        # we are dealing with commands
-                               @lparts = split /\./, $l;                  
-                               next if $lparts[$#lparts] ne $suffix;        # only look for .$suffix files
-                               if ($p eq substr($l, 0, length $p)) {
-                                       pop @lparts; #  remove the suffix
-                                       $l = join '.', @lparts;
-                                       #                 chop $dirfn;               # remove trailing /
-                                       $dirfn = "" unless $dirfn;
-                                       $cmd_cache{$short_cmd} = join(',', ($path, "$dirfn$l")); # cache it
-                                       dbg("got path: $path cmd: $dirfn$l\n") if isdbg('command');
-                                       return ($path, "$dirfn$l"); 
-                               }
-                       }
-               }
-       }
+        while (my $p = shift @parts) {
+                opendir(D, $curdir) or confess "can't open $curdir $!";
+                my @ls = readdir D;
+                closedir D;
+
+                # if this isn't the last part
+                if (@parts) {
+                        my $found;
+                        foreach my $l (sort @ls) {
+                                next if $l =~ /^\./;
+                                if ((-d "$curdir/$l") && $p eq substr($l, 0, length $p)) {
+                                        dbg("got dir: $curdir/$l\n") if isdbg('command');
+                                        $dirfn .= "$l/";
+                                        $curdir .= "/$l";
+                                        $found++;
+                                        last;
+                                }
+                        }
+                        # only proceed if we find the directory asked for
+                        return () unless $found;
+                } else {
+                        foreach my $l (sort @ls) {
+                                next if $l =~ /^\./;
+                                next unless $l =~ /\.$suffix$/;
+                                if ($p eq substr($l, 0, length $p)) {
+                                        $l =~ s/\.$suffix$//;
+                                        $dirfn = "" unless $dirfn;
+                                        $cmd_cache{$short_cmd} = join(',', ($path, "$dirfn$l")); # cache it
+                                        dbg("got path: $path cmd: $dirfn$l\n") if isdbg('command');
+                                        return ($path, "$dirfn$l");
+                                }
+                        }
+                }
+        }
+
        return ();  
 }  
 
@@ -894,7 +923,7 @@ sub wwv
        return unless $self->{wwv};
        
        if ($self->{wwvfilter}) {
-               ($filter, $hops) = $self->{wwvfilter}->it(@_ );
+               ($filter, $hops) = $self->{wwvfilter}->it(@_[7..$#_] );
                return unless $filter;
        }
 
@@ -927,12 +956,60 @@ sub broadcast_debug
 {
        my $s = shift;                          # the line to be rebroadcast
        
-       foreach my $dxchan (DXChannel->get_all) {
+       foreach my $dxchan (DXChannel::get_all) {
                next unless $dxchan->{enhanced} && $dxchan->{senddbg};
                $dxchan->send_later('L', $s);
        }
 }
 
+sub do_entry_stuff
+{
+       my $self = shift;
+       my $line = shift;
+       my @out;
+       
+       if ($self->state eq 'enterbody') {
+               my $loc = $self->{loc} || confess "local var gone missing" ;
+               if ($line eq "\032" || $line eq '%1A' || uc $line eq "/EX") {
+                       no strict 'refs';
+                       push @out, &{$loc->{endaction}}($self);          # like this for < 5.8.0
+                       $self->func(undef);
+                       $self->state('prompt');
+               } elsif ($line eq "\031" || uc $line eq "/ABORT" || uc $line eq "/QUIT") {
+                       push @out, $self->msg('m10');
+                       delete $loc->{lines};
+                       delete $self->{loc};
+                       $self->func(undef);
+                       $self->state('prompt');
+               } else {
+                       push @{$loc->{lines}}, length($line) > 0 ? $line : " ";
+                       # i.e. it ain't and end or abort, therefore store the line
+               }
+       } else {
+               confess "Invalid state $self->{state}";
+       }
+       return @out;
+}
+
+sub store_startup_script
+{
+       my $self = shift;
+       my $loc = $self->{loc} || confess "local var gone missing" ;
+       my @out;
+       my $call = $loc->{call} || confess "callsign gone missing";
+       confess "lines array gone missing" unless ref $loc->{lines};
+       my $r = Script::store($call, $loc->{lines});
+       if (defined $r) {
+               if ($r) {
+                       push @out, $self->msg('m19', $call, $r);
+               } else {
+                       push @out, $self->msg('m20', $call);
+               }
+       } else {
+               push @out, "error opening startup script $call $!";
+       } 
+       return @out;
+}
 
 1;
 __END__