1. Upped the version no !!!!
[spider.git] / perl / DXProt.pm
index c1fad11126edbc072d6681e71a70834ef5856f8e..01b64372b8d4d1cf55847b76d229fea3b65e984c 100644 (file)
@@ -22,6 +22,8 @@ use DXLog;
 use Spot;
 use DXProtout;
 use DXDebug;
+use Local;
+
 use Carp;
 
 use strict;
@@ -118,8 +120,11 @@ sub start
 sub normal
 {
        my ($self, $line) = @_;
-       my @field = split /[\^\~]/, $line;
+       my @field = split /\^/, $line;
+       pop @field if $field[-1] eq '~';
        
+#      print join(',', @field), "\n";
+                                               
        # ignore any lines that don't start with PC
        return if !$field[0] =~ /^PC/;
        
@@ -128,6 +133,14 @@ sub normal
        return unless $pcno;
        return if $pcno < 10 || $pcno > 51;
        
+       # local processing 1
+       my $pcr;
+       eval {
+               $pcr = Local::pcprot($self, $pcno, @field);
+       };
+       dbg('local', "Local::pcprot error $@") if $@;
+       return if $pcr;
+       
  SWITCH: {
                if ($pcno == 10) {              # incoming talk
                        
@@ -177,8 +190,16 @@ sub normal
                        
                        $spotdup{$dupkey} = $d;
                        
-                       my $spot = Spot::add($freq, $field[2], $d, $text, $spotter);
+                       my $spot = Spot::add($freq, $field[2], $d, $text, $spotter, $field[7]);
                        
+                       # local processing 
+                       my $r;
+                       eval {
+                               $r = Local::spot1($self, $freq, $field[2], $d, $text, $spotter, $field[7]);
+                       };
+                       dbg('local', "Local::spot1 error $@") if $@;
+                       return if $r;
+
                        # send orf to the users
                        if ($spot && $pcno == 11) {
                                my $buf = Spot::formatb($field[1], $field[2], $d, $text, $spotter);
@@ -244,12 +265,13 @@ sub normal
                if ($pcno == 16) {              # add a user
                        my $node = DXCluster->get_exact($field[1]); 
                        last SWITCH if !$node; # ignore if havn't seen a PC19 for this one yet
+                       last SWITCH unless $node->isa('DXNode');
                        my $i;
                        
                        
                        for ($i = 2; $i < $#field; $i++) {
-                               my ($call, $confmode, $here) = $field[$i] =~ /^(\S+) (-) (\d)/o;
-                               next if length $call < 3;
+                               my ($call, $confmode, $here) = $field[$i] =~ /^(\S+) (\S) (\d)/o;
+                               next if length $call < 3 || length $call > 8;
                                next if !$confmode;
                                $call = uc $call;
                                next if DXCluster->get_exact($call); # we already have this (loop?)
@@ -367,6 +389,13 @@ sub normal
                        $wwvdup{$dupkey} = $d;
                        Geomag::update($field[1], $field[2], $sfi, $k, $i, @field[6..$#field]);
 
+                       my $r;
+                       eval {
+                               $r = Local::wwv2($self, $field[1], $field[2], $sfi, $k, $i, @field[6..$#field]);
+                       };
+                       dbg('local', "Local::wwv2 error $@") if $@;
+                       return if $r;
+
                        # DON'T be silly and send on PC27s!
                        return if $pcno == 27;
                        
@@ -380,8 +409,32 @@ sub normal
                        last SWITCH;
                }
                
-               if ($pcno == 25) {
-                       last SWITCH;
+               if ($pcno == 25) {      # merge request
+                       unless ($field[1] eq $main::mycall) {
+                               dbg('chan', "merge request to $field[1] from $field[2] ignored");
+                               return;
+                       }
+
+                       Log('DXProt', "Merge request for $field[3] spots and $field[4] WWV from $field[1]");
+                       
+                       # spots
+                       if ($field[3] > 0) {
+                               my @in = reverse Spot::search(1, undef, undef, 0, $field[3]-1);
+                               my $in;
+                               foreach $in (@in) {
+                                       $self->send(pc26(@{$in}[0..4], $in->[7]));
+                               }
+                       }
+
+                       # wwv
+                       if ($field[4] > 0) {
+                               my @in = reverse Geomag::search(0, $field[4], time, 1);
+                               my $in;
+                               foreach $in (@in) {
+                                       $self->send(pc27(@{$in}));
+                               }
+                       }
+                       return;
                }
                
                if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling