nospawnify some of the commands
authorDirk Koopman <djk@tobit.co.uk>
Thu, 16 Apr 2020 23:29:24 +0000 (00:29 +0100)
committerDirk Koopman <djk@tobit.co.uk>
Thu, 16 Apr 2020 23:29:24 +0000 (00:29 +0100)
cmd/nospawn.pl [new file with mode: 0644]
cmd/show/chat.pl
cmd/show/dx.pl
cmd/show/hftable.pl
cmd/show/isolate.pl
cmd/show/registered.pl
cmd/show/vhftable.pl
cmd/show/wx.pl
perl/DXCommandmode.pm
perl/DXCron.pm
perl/DXProt.pm

diff --git a/cmd/nospawn.pl b/cmd/nospawn.pl
new file mode 100644 (file)
index 0000000..ad81feb
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+#
+# pretend that you are another user, useful for reseting
+# those silly things that people insist on getting wrong
+# like set/homenode et al
+#
+# Copyright (c) 1999 Dirk Koopman G1TLH
+#
+my ($self, $line) = @_;
+
+my $mycall = $self->call;
+
+
+if ($self->priv < 2) {
+       Log('DXCommand', "$mycall is trying to nospawn $line locally");
+       return (1, $self->msg('e5'));
+}
+if ($self->remotecmd || $self->inscript) {
+       Log('DXCommand', "$mycall is trying to nospawn remotely");
+       return (1, $self->msg('e5'));
+}
+
+Log('DXCommand', "nospawn '$line' by $mycall");
+$self->{_nospawn} = 1;
+my @out = $self->run_cmd($line);
+delete $self->{_nospawn};
+
+return (1, @out);
index 38d5b38ab8af5b813e0bb0bc37028e3f9c167f15..9f543df58717b50aa4fbe707e7e9f62f20d5df57 100644 (file)
@@ -34,7 +34,9 @@ while ($f = shift @f) {                 # next field
 $to = 20 unless $to;
 $from = 0 unless $from;
 
-@out = $self->spawn_cmd("show/chat $cmdline", \&DXLog::print, args => [$from, $to, $main::systime, 'chat', $who]);
-       
-#@out = DXLog::print($from, $to, $main::systime, 'chat', $who);
+if ($self->{_nospawn}) {
+       @out = DXLog::print($from, $to, $main::systime, 'chat', $who);
+} else {
+       @out = $self->spawn_cmd("show/chat $cmdline", \&DXLog::print, args => [$from, $to, $main::systime, 'chat', $who]);
+}
 return (1, @out);
index 08f947eac68e8d53fba3949e43e52af9dcd4027b..1e14399fa794434beca2992f3d07e87fb43f6bc2 100644 (file)
@@ -424,7 +424,23 @@ dbg "expr: $expr from: $from to: $to fromday: $fromday today: $today" if isdbg('
   
 # now do the search
 
-push @out, $self->spawn_cmd("sh/dx $line", \&Spot::search, 
+if ($self->{_nospawn}) {
+       my @res = Spot::search($expr, $fromday, $today, $from, $to, $hint, $dofilter ? $self : undef);
+       my $ref;
+       my @dx;
+       foreach $ref (@res) {
+               if ($self && $self->ve7cc) {
+                       push @out, VE7CC::dx_spot($self, @$ref);
+               } else {
+                       if ($self && $real) {
+                               push @out, DXCommandmode::format_dx_spot($self, @$ref);
+                       } else {
+                               push @out, Spot::formatl(@$ref);
+                       }
+               }
+       }
+} else {
+       push @out, $self->spawn_cmd("sh/dx $line", \&Spot::search, 
                                                        args => [$expr, $fromday, $today, $from, $to, $hint, $dofilter ? $self : undef],
                                                        cb => sub {
                                                                my ($dxchan, @res) = @_; 
@@ -445,20 +461,7 @@ push @out, $self->spawn_cmd("sh/dx $line", \&Spot::search,
                                                                push @out, $self->msg('e3', "sh/dx", "'$line'") unless @out;
                                                                return @out;
                                                        });
+}
 
-#my @res = Spot::search($expr, $fromday, $today, $from, $to, $hint, $dofilter ? $self : undef);
-#my $ref;
-#my @dx;
-#foreach $ref (@res) {
-#      if ($self && $self->ve7cc) {
-#              push @out, VE7CC::dx_spot($self, @$ref);
-#      } else {
-#              if ($self && $real) {
-#                      push @out, DXCommandmode::format_dx_spot($self, @$ref);
-#              } else {
-#                      push @out, Spot::formatl(@$ref);
-#              }
-#      }
-#}
 
 return (1, @out);
index 40f8d2ca93f7580aa644bb6b967edd1340c4cb83..4ad679d2bd59cc995c992e76fcd322ab912298bb 100644 (file)
@@ -1,4 +1,4 @@
-#
+ #
 # do an HFSpot table 
 #
 # Copyright (c) 2001 Dirk Koopman G1TLH
 # 20021124
 #
 
-my ($self, $line) = @_;
-my @f = split /\s+/, $line;
-my @calls;
-my $days = 31;
-my @dxcc;
-my $limit = 100;
-my $now;
-my @pref;
-my @out;
-my $date;
-my $all;
+ my @calls;
+ my $days = 31;
+ my @dxcc;
+ my $limit = 100;
+ my $now;
+ my @pref;
+ my $date;
+ my $all;
 
-#$DB::single = 1;
+ sub handle
+ {
+        my ($self, $line) = @_;
 
-while (@f) {
-       my $f = shift @f;
+        my @out;
 
-       if ($f =~ /^\d+$/ && $f < 366) {                # no of days
-               $days = $f;
-               next;
-       }
-       if (my $utime = Date::Parse::str2time($f)) {    # is it a parseable date?
-               $utime += 3600;
-               $now = Julian::Day->new($utime);
-               $date = cldate($utime);
-               next;
-       }
-       $f = uc $f;
-       if (is_callsign($f)) {
-               push @dxcc, [$f, 0];
-               push @pref, $f;
-       } else {
-               if ($f eq 'ALL' ) {
-                       $all++;
-                       push @pref, $f;
-                       next;
-               }
-               if (my @ciz = Prefix::to_ciz('nc', $f)) {
-                       push @dxcc, map {[$_, 2]} @ciz;
-                       push @pref, $f;
-               } else {
-                       push @out, $self->msg('e27', $f);
-               }
-       }
-}
+        my @f = split /\s+/, $line;
 
-# return error messages if any
-return (1, @out) if @out;
+        #$DB::single = 1;
 
-# default prefixes
-unless (@pref) {                                       # no prefix or callsign, use default prefix
-       push @dxcc, [$_, 2] for @main::my_cc;
-       push @pref, $main::mycall;
-}
+        while (@f) {
+                my $f = shift @f;
 
-# default date
-unless ($now) {
-       $now = Julian::Day->new(time); #no starting date
-       $date = cldate(time);
-}
+                if ($f =~ /^\d+$/ && $f < 366) { # no of days
+                        $days = $f;
+                        next;
+                }
+                if (my $utime = Date::Parse::str2time($f)) { # is it a parseable date?
+                        $utime += 3600;
+                        $now = Julian::Day->new($utime);
+                        $date = cldate($utime);
+                        next;
+                }
+                $f = uc $f;
+                if (is_callsign($f)) {
+                        push @dxcc, [$f, 0];
+                        push @pref, $f;
+                }
+                else {
+                        if ($f eq 'ALL' ) {
+                                $all++;
+                                push @pref, $f;
+                                next;
+                        }
+                        if (my @ciz = Prefix::to_ciz('nc', $f)) {
+                                push @dxcc, map {[$_, 2]} @ciz;
+                                push @pref, $f;
+                        }
+                        else {
+                                push @out, $self->msg('e27', $f);
+                        }
+                }
+        }
 
-@out = $self->spawn_cmd("show/hftable $line", sub {
-                                                       my %list;
-                                                       my @out;
-                                                       my $i;
-                                                       
-                                                       # generate the spot list
-                                                       for ($i = 0; $i < $days; $i++) {
-                                                               my $fh = $Spot::statp->open($now); # get the next file
-                                                               unless ($fh) {
-                                                                       Spot::genstats($now);
-                                                                       $fh = $Spot::statp->open($now);
-                                                               }
-                                                               while (<$fh>) {
-                                                                       chomp;
-                                                                       my @l = split /\^/;
-                                                                       next if $l[0] eq 'TOTALS';
-                                                                       next unless $all || grep $l[$_->[1]] eq $_->[0], @dxcc;
-                                                                       my $ref = $list{$l[0]} || [0,0,0,0,0,0,0,0,0,0];
-                                                                       my $j = 1;
-                                                                       foreach my $item (@l[4..13]) {
-                                                                               $ref->[$j] += $item;
-                                                                               $ref->[0] += $item;
-                                                                               $j++;
-                                                                       }
-                                                                       $list{$l[0]} = $ref if $ref->[0];
-                                                               }
-                                                               $now = $now->sub(1);
-                                                       }
-                                                       
-                                                       my @tot;
-                                                       my $nocalls;
-                                                       
-                                                       my $l = join ',', @pref;
-                                                       push @out, $self->msg('stathft', $l, $date, $days);
-                                                       push @out, sprintf "%9s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|", qw(Callsign Tot 160m 80m 60m 40m 30m 20m 17m 15m 12m 10m);
-                                                       
-                                                       for (sort {$list{$b}->[0] <=> $list{$a}->[0] || $a cmp $b} keys %list) {
-                                                               my $ref = $list{$_};
-                                                               $nocalls++;
-                                                               my @list = (sprintf "%9s", $_);
-                                                               foreach my $j (0..11) {
-                                                                       my $r = $ref->[$j];
-                                                                       if ($r) {
-                                                                               $tot[$j] += $r;
-                                                                               $r = sprintf("%5d", $r);
-                                                                       } else {
-                                                                               $r = '     ';
-                                                                       }
-                                                                       push @list, $r;
-                                                               }
-                                                               push @out, join('|', @list);
-                                                               last if $limit && $nocalls >= $limit;
-                                                       }
+        # return error messages if any
+        return (1, @out) if @out;
 
-                                                       $nocalls = sprintf "%9s", "$nocalls calls";
-                                                       @tot = map {$_ ?  sprintf("%5d", $_) : '     ' } @tot;
-                                                       push @out, join('|', $nocalls, @tot,"");
-                                                       return @out;
-                                               });
+        # default prefixes
+        unless (@pref) {          # no prefix or callsign, use default prefix
+                push @dxcc, [$_, 2] for @main::my_cc;
+                push @pref, $main::mycall;
+        }
 
+        # default date
+        unless ($now) {
+                $now = Julian::Day->new(time); #no starting date
+                $date = cldate(time);
+        }
 
-return (1, @out);
+
+        if ($self->{_nospawn}) {
+                @out = generate($self);
+        } else {
+                @out = $self->spawn_cmd("show/hftable $line", sub { return (generate($self)); });
+        }
+
+        return (1, @out);
+ }
+
+sub generate
+ {
+        my $self = shift;
+        
+       my @out;
+       my %list;
+       my $i;
+       
+       # generate the spot list
+       for ($i = 0; $i < $days; $i++) {
+               my $fh = $Spot::statp->open($now); # get the next file
+               unless ($fh) {
+                       Spot::genstats($now);
+                       $fh = $Spot::statp->open($now);
+               }
+               while (<$fh>) {
+                       chomp;
+                       my @l = split /\^/;
+                       next if $l[0] eq 'TOTALS';
+                       next unless $all || grep $l[$_->[1]] eq $_->[0], @dxcc;
+                       my $ref = $list{$l[0]} || [0,0,0,0,0,0,0,0,0,0];
+                       my $j = 1;
+                       foreach my $item (@l[4..13]) {
+                               $ref->[$j] += $item;
+                               $ref->[0] += $item;
+                               $j++;
+                       }
+                       $list{$l[0]} = $ref if $ref->[0];
+               }
+               $now = $now->sub(1);
+       }
+       
+       my @tot;
+       my $nocalls;
+       
+       my $l = join ',', @pref;
+       push @out, $self->msg('stathft', $l, $date, $days);
+       push @out, sprintf "%9s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|%5s|", qw(Callsign Tot 160m 80m 60m 40m 30m 20m 17m 15m 12m 10m);
+       
+       for (sort {$list{$b}->[0] <=> $list{$a}->[0] || $a cmp $b} keys %list) {
+               my $ref = $list{$_};
+               $nocalls++;
+               my @list = (sprintf "%9s", $_);
+               foreach my $j (0..11) {
+                       my $r = $ref->[$j];
+                       if ($r) {
+                               $tot[$j] += $r;
+                               $r = sprintf("%5d", $r);
+                       }
+                       else {
+                               $r = '     ';
+                       }
+                       push @list, $r;
+               }
+               push @out, join('|', @list);
+               last if $limit && $nocalls >= $limit;
+       }
+       
+       $nocalls = sprintf "%9s", "$nocalls calls";
+       @tot = map {$_ ?  sprintf("%5d", $_) : '     ' } @tot;
+       push @out, join('|', $nocalls, @tot,"");
+       return @out;
+}
index 3c0939c9cdf6f9d5c3281573d5027004055b232d..cefae9dc6dfeab77d6cd30cfdd708002fd6e8e9d 100644 (file)
@@ -8,47 +8,56 @@
 #
 #
 
-my ($self, $line) = @_;
-return (1, $self->msg('e5')) unless $self->priv >= 1;
-
-my @out;
-
 use DB_File;
 
-@out = $self->spawn_cmd("show/isolate $line", sub {
-                                                       my @out;
-                                                       my @val;
+sub handle
+{
+       my ($self, $line) = @_;
+       return (1, $self->msg('e5')) unless $self->priv >= 1;
+
+       my @out;
+
+       if ($self->{_nospawn}) {
+               return (1, generate($self));
+       } else {
+               return (1, $self->spawn_cmd("show/isolate $line", sub { return (generate($self)); }));
+       }
+       
+}
+
+sub generate
+{
+       my $self = shift;
+       my @out;
+       my @val;
                                                        
-                                                       my ($action, $count, $key, $data) = (0,0,0,0);
-
-                                                       for ($action = DXUser::R_FIRST, $count=0; !$DXUser::dbm->seq($key, $data, $action); $action = DXUser::R_NEXT) {
-                                                               if ($data =~ m{isolate}) {
-                                                                       my $u = DXUser::get_current($key);
-                                                                       if ($u && $u->isolate) {
-                                                                               push @val, $key;
-                                                                               ++$count;
-                                                                       }
-                                                               }
-                                                       } 
-
-                                                       my @l;
-                                                       foreach my $call (@val) {
-                                                               if (@l >= 5) {
-                                                                       push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
-                                                                       @l = ();
-                                                               }
-                                                               push @l, $call;
-                                                       }
-                                                       if (@l) {
-                                                               push @l, "" while @l < 5;
-                                                               push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
-                                                       }
-
-                                                       push @out, , $self->msg('rec', $count);
-                                                       return @out;
-                                               });
-
-
-return (1, @out);
+       my ($action, $count, $key, $data) = (0,0,0,0);
+
+       for ($action = DXUser::R_FIRST, $count=0; !$DXUser::dbm->seq($key, $data, $action); $action = DXUser::R_NEXT) {
+               if ($data =~ m{isolate}) {
+                       my $u = DXUser::get_current($key);
+                       if ($u && $u->isolate) {
+                               push @val, $key;
+                               ++$count;
+                       }
+               }
+       } 
+
+       my @l;
+       foreach my $call (@val) {
+               if (@l >= 5) {
+                       push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
+                       @l = ();
+               }
+               push @l, $call;
+       }
+       if (@l) {
+               push @l, "" while @l < 5;
+               push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
+       }
+
+       push @out, , $self->msg('rec', $count);
+       return @out;    
+}
 
 
index 0b41164caea7f5cf1c5514773252c7c6cca400fe..b3f345d96317186b9d58e4ae56d08fc61a375a37 100644 (file)
@@ -8,25 +8,39 @@
 #
 #
 
-my ($self, $line) = @_;
-return (1, $self->msg('e5')) unless $self->priv >= 9;
+sub handle
+{
+       my ($self, $line) = @_;
+       return (1, $self->msg('e5')) unless $self->priv >= 9;
 
-my @out;
+       my @out;
 
-use DB_File;
+       use DB_File;
 
-if ($line) {
-       $line =~ s/[^\w\-\/]+//g;
-       $line = "^\U\Q$line";
+       if ($line) {
+               $line =~ s/[^\w\-\/]+//g;
+               $line = "^\U\Q$line";
+       }
+
+       if ($self->{_nospawn}) {
+               @out = generate($self, $line);
+       } else {
+               @out = $self->spawn_cmd("show/registered $line", sub { return (generate($self, $line)); });
+       }
+
+       return (1, @out);
 }
 
-@out = $self->spawn_cmd("show/registered $line", sub {
-                                                       my @out;
-                                                       my @val;
+sub generate
+{
+       my $self = shift;
+       my $line = shift;
+       my @out;
+       my @val;
                                                        
 
-                                                       my ($action, $count, $key, $data) = (0,0,0,0);
-                                                       eval qq{for (\$action = DXUser::R_FIRST, \$count = 0; !\$DXUser::dbm->seq(\$key, \$data, \$action); \$action = DXUser::R_NEXT) {
+       my ($action, $count, $key, $data) = (0,0,0,0);
+       eval qq{for (\$action = DXUser::R_FIRST, \$count = 0; !\$DXUser::dbm->seq(\$key, \$data, \$action); \$action = DXUser::R_NEXT) {
        if (\$data =~ m{registered}) {                                  
                if (!\$line || (\$line && \$key =~ /^$line/)) {
                        my \$u = DXUser::get_current(\$key);
@@ -37,24 +51,22 @@ if ($line) {
                }
        }
 } };
-                                                       my @l;
-                                                       foreach my $call (@val) {
-                                                               if (@l >= 5) {
-                                                                       push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
-                                                                       @l = ();
-                                                               }
-                                                               push @l, $call;
-                                                       }
-                                                       if (@l) {
-                                                               push @l, "" while @l < 5;
-                                                               push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
-                                                       }
-
-                                                       push @out, $@ if $@;
-                                                       push @out, , $self->msg('rec', $count);
-                                                       return @out;
-                                               });
-
-return (1, @out);
+       my @l;
+       foreach my $call (@val) {
+               if (@l >= 5) {
+                       push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
+                       @l = ();
+               }
+               push @l, $call;
+       }
+       if (@l) {
+               push @l, "" while @l < 5;
+               push @out, sprintf "%-12s %-12s %-12s %-12s %-12s", @l;
+       }
 
+       push @out, $@ if $@;
+       push @out, , $self->msg('rec', $count);
+       return @out;
+       
+}
 
index e7770e5c4c48286b96489b665d1682cd81e09bea..38c584a8498bbc4eaf6cc3fcebaa1e5e41203bab 100644 (file)
@@ -6,8 +6,6 @@
 #
 #
 
-my ($self, $line) = @_;
-my @f = split /\s+/, $line;
 my @calls;
 my $days = 31;
 my @dxcc;
@@ -18,116 +16,133 @@ my @out;
 my $date;
 my $all;
 
-#$DB::single = 1;
+sub handle
+{
+       my ($self, $line) = @_;
+       my @f = split /\s+/, $line;
 
-while (@f) {
-       my $f = shift @f;
+       #$DB::single = 1;
 
-       if ($f =~ /^\d+$/ && $f < 366) {                # no of days
-               $days = $f;
-               next;
-       }
-       if (my $utime = Date::Parse::str2time($f)) {    # is it a parseable date?
-               $utime += 3600;
-               $now = Julian::Day->new($utime);
-               $date = cldate($utime);
-               next;
-       }
-       $f = uc $f;
-       if (is_callsign($f)) {
-               push @dxcc, [$f, 0];
-               push @pref, $f;
-       } else {
-               if ($f eq 'ALL' ) {
-                       $all++;
-                       push @pref, $f;
+       while (@f) {
+               my $f = shift @f;
+
+               if ($f =~ /^\d+$/ && $f < 366) { # no of days
+                       $days = $f;
                        next;
                }
-               if (my @ciz = Prefix::to_ciz('nc', $f)) {
-                       push @dxcc, map {[$_, 2]} @ciz;
+               if (my $utime = Date::Parse::str2time($f)) { # is it a parseable date?
+                       $utime += 3600;
+                       $now = Julian::Day->new($utime);
+                       $date = cldate($utime);
+                       next;
+               }
+               $f = uc $f;
+               if (is_callsign($f)) {
+                       push @dxcc, [$f, 0];
                        push @pref, $f;
-               } else {
-                       push @out, $self->msg('e27', $f);
+               }
+               else {
+                       if ($f eq 'ALL' ) {
+                               $all++;
+                               push @pref, $f;
+                               next;
+                       }
+                       if (my @ciz = Prefix::to_ciz('nc', $f)) {
+                               push @dxcc, map {[$_, 2]} @ciz;
+                               push @pref, $f;
+                       }
+                       else {
+                               push @out, $self->msg('e27', $f);
+                       }
                }
        }
-}
 
-# return error messages if any
-return (1, @out) if @out;
+       # return error messages if any
+       return (1, @out) if @out;
 
-# default prefixes
-unless (@pref) {                                       # no prefix or callsign, use default prefix
-       push @dxcc, [$_, 2] for @main::my_cc;
-       push @pref, $main::mycall;
-}
+       # default prefixes
+       unless (@pref) {           # no prefix or callsign, use default prefix
+               push @dxcc, [$_, 2] for @main::my_cc;
+               push @pref, $main::mycall;
+       }
+
+       # default date
+       unless ($now) {
+               $now = Julian::Day->new(time); #no starting date
+               $date = cldate(time);
+       }
+       if ($self->{_nospawn}) {
+               @out = generate($self);
+       }
+       else {
+               @out = $self->spawn_cmd("show/vhftable $line", sub {return (generate($self))});
+       }
 
-# default date
-unless ($now) {
-       $now = Julian::Day->new(time); #no starting date
-       $date = cldate(time);
+       return (1, @out);
 }
 
-@out = $self->spawn_cmd("show/vhftable $line", sub {
-                                                       my %list;
-                                                       my @out;
-                                                       my $i;
+sub generate
+{
+       my $self = shift;
+       my %list;
+       my @out;
+       my $i;
                                                        
-                                                       # generate the spot list
-                                                       for ($i = 0; $i < $days; $i++) {
-                                                               my $fh = $Spot::statp->open($now); # get the next file
-                                                               unless ($fh) {
-                                                                       Spot::genstats($now);
-                                                                       $fh = $Spot::statp->open($now);
-                                                               }
-                                                               while (<$fh>) {
-                                                                       chomp;
-                                                                       my @l = split /\^/;
-                                                                       next if $l[0] eq 'TOTALS';
-                                                                       next unless $all || grep $l[$_->[1]] eq $_->[0], @dxcc;
-                                                                       my $ref = $list{$l[0]} || [0,0,0,0,0,0,0,0,0,0];
-                                                                       my $j = 1;
-                                                                       foreach my $item (@l[14..16, 18..23]) {
-                                                                               $ref->[$j] += $item;
-                                                                               $ref->[0] += $item;
-                                                                               $j++;
-                                                                       }
-                                                                       $list{$l[0]} = $ref if $ref->[0];
-                                                               }
-                                                               $now = $now->sub(1);
-                                                       }
-
-                                                       my @tot;
-                                                       my $nocalls;
-
-                                                       my $l = join ',', @pref;
-                                                       push @out, $self->msg('statvhft', $l, $date, $days);
-                                                       #push @out, $self->msg('statvhft', join(',', @dxcc), cldate(time));
-                                                       push @out, sprintf "%10s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|", qw(Callsign Tot 6m 4m 2m 70cm 23cm 13cm 9cm 6cm 3cm);
-
-                                                       for (sort {$list{$b}->[0] <=> $list{$a}->[0] || $a cmp $b} keys %list) {
-                                                               my $ref = $list{$_};
-                                                               $nocalls++;
-                                                               my @list = (sprintf "%10s", $_);
-                                                               foreach my $j (0..9) {
-                                                                       my $r = $ref->[$j];
-                                                                       if ($r) {
-                                                                               $tot[$j] += $r;
-                                                                               $r = sprintf("%4d", $r);
-                                                                       }
-                                                                       else {
-                                                                               $r = '    ';
-                                                                       }
-                                                                       push @list, $r;
-                                                               }
-                                                               push @out, join('|', @list, "");
-                                                               last if $limit && $nocalls >= $limit;
-                                                       }
-
-                                                       $nocalls = sprintf "%10s", "$nocalls calls";
-                                                       @tot = map {$_ ?  sprintf("%4d", $_) : '    ' } @tot;
-                                                       push @out, join('|', $nocalls, @tot, "");
-
-                                                       return @out;
-                                               });
-
-return (1, @out);
+       # generate the spot list
+       for ($i = 0; $i < $days; $i++) {
+               my $fh = $Spot::statp->open($now); # get the next file
+               unless ($fh) {
+                       Spot::genstats($now);
+                       $fh = $Spot::statp->open($now);
+               }
+               while (<$fh>) {
+                       chomp;
+                       my @l = split /\^/;
+                       next if $l[0] eq 'TOTALS';
+                       next unless $all || grep $l[$_->[1]] eq $_->[0], @dxcc;
+                       my $ref = $list{$l[0]} || [0,0,0,0,0,0,0,0,0,0];
+                       my $j = 1;
+                       foreach my $item (@l[14..16, 18..23]) {
+                               $ref->[$j] += $item;
+                               $ref->[0] += $item;
+                               $j++;
+                       }
+                       $list{$l[0]} = $ref if $ref->[0];
+               }
+               $now = $now->sub(1);
+       }
+
+       my @tot;
+       my $nocalls;
+
+       my $l = join ',', @pref;
+       push @out, $self->msg('statvhft', $l, $date, $days);
+       #push @out, $self->msg('statvhft', join(',', @dxcc), cldate(time));
+       push @out, sprintf "%10s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|%4s|", qw(Callsign Tot 6m 4m 2m 70cm 23cm 13cm 9cm 6cm 3cm);
+
+       for (sort {$list{$b}->[0] <=> $list{$a}->[0] || $a cmp $b} keys %list) {
+               my $ref = $list{$_};
+               $nocalls++;
+               my @list = (sprintf "%10s", $_);
+               foreach my $j (0..9) {
+                       my $r = $ref->[$j];
+                       if ($r) {
+                               $tot[$j] += $r;
+                               $r = sprintf("%4d", $r);
+                       }
+                       else {
+                               $r = '    ';
+                       }
+                       push @list, $r;
+               }
+               push @out, join('|', @list, "");
+               last if $limit && $nocalls >= $limit;
+       }
+
+       $nocalls = sprintf "%10s", "$nocalls calls";
+       @tot = map {$_ ?  sprintf("%4d", $_) : '    ' } @tot;
+       push @out, join('|', $nocalls, @tot, "");
+
+       return @out;
+
+}
index 6b43268e89be34cc12c15ad1509dfa5f7dfda131..807b88fdbaa892434ef150158677a2b769ca4322 100644 (file)
@@ -28,7 +28,10 @@ while ($f = shift @f) {                 # next field
 $to = 20 unless $to;
 $from = 0 unless $from;
 
-@out = $self->spawn_cmd("show/wx $cmdline", \&DXLog::print, args => [$from, $to, $main::systime, 'ann', 'WX']);
+if ($self->{_nospawn}) {
+       @out = $self->spawn_cmd("show/wx $cmdline", \&DXLog::print, args => [$from, $to, $main::systime, 'ann', 'WX']);
+} else {
+       @out = DXLog::print($from, $to, $main::systime, 'ann', 'WX');
+}
        
-#@out = DXLog::print($from, $to, $main::systime, 'ann', $who);
 return (1, @out);
index 1b08b36e6a149d4a9c82070a47e8b3f328e09c04..d5271313960a1f6f42f6142a883923aa7e9afabd 100644 (file)
@@ -1309,14 +1309,17 @@ sub spawn_cmd
        my $t0 = [gettimeofday];
 
        no strict 'refs';
-               
+
+       # just behave normally if something has set the "one-shot" _nospawn in the channel
+       return ($cmdref->(@$args)) if $self->{_nospawn};
+       
        my $fc = Mojo::IOLoop::Subprocess->new;
 #      $fc->serializer(\&encode_json);
 #      $fc->deserializer(\&decode_json);
        $fc->run(
                         sub {
                                 my $subpro = shift;
-                                if (isdbg('chan')) {
+                                if (isdbg('spawn_cmd')) {
                                         my $s = "line: $line";
                                         $s .= ", args: " . join(', ', @$args) if $args && @$args;
                                 }
index e60d36b4ba8f02f934c2842a030c57cde11c4cfb..0cc6ce88d85ec36e7fa8617627fb724f41d9bb68 100644 (file)
@@ -249,7 +249,6 @@ sub spawn
        my $fc = Mojo::IOLoop::Subprocess->new();
        $fc->run(
                         sub {my @res = `$line`; return @res},
-#                       [],
                         sub {
                                 my ($fc, $err, @res) = @_; 
                                 if ($err) {
@@ -272,8 +271,12 @@ sub spawn_cmd
        dbg("spawn_cmd run: $line") if isdbg('cron');
        my $fc = Mojo::IOLoop::Subprocess->new();
        $fc->run(
-                        sub {my @res = DXCommandmode::run_cmd($main::me, $line); return @res},
-#                       [],
+                        sub {
+                                $main::me->{_nospawn} = 1;
+                                my @res = $main::me->run_cmd($line);
+                                delete $main::me->{_nospawn};
+                                return @res;
+                        },
                         sub {
                                 my ($fc, $err, @res) = @_; 
                                 if ($err) {
@@ -305,7 +308,7 @@ sub rcmd
 sub run_cmd
 {
        my $line = shift;
-       my @in = DXCommandmode::run_cmd($main::me, $line);
+       my @in = $main::me->run_cmd($line);
        dbg("cmd run: $line") if isdbg('cron');
        for (@in) {
                s/\s*$//og;
index 7c1ed1a4e0d2a976015d465abfb465e2409357f2..8b9026c1f700e71945feda5329efcf9b2b431f95 100644 (file)
@@ -1216,6 +1216,9 @@ sub spawn_cmd
                
        my $fc = Mojo::IOLoop::Subprocess->new;
 
+       # just behave normally if something has set the "one-shot" _nospawn in the channel
+       return ($cmdref->(@$args)) if $self->{_nospawn};
+
        #       $fc->serializer(\&encode_json);
 #      $fc->deserializer(\&decode_json);
        $fc->run(