1. added wantgrid (to control display of grid square info on DX Broadcasts)
[spider.git] / perl / DXProt.pm
index fb1b4b95b85e1b28ae0b2e40ae27164f42070699..532322d0f506f6731988ddc695a68ef25d11e174 100644 (file)
@@ -37,7 +37,6 @@ use vars qw($me $pc11_max_age $pc23_max_age
                        $allowzero $decode_dk0wcy);
 
 $me = undef;                                   # the channel id for this cluster
-$decode_dk0wcy = undef;                        # if set use this callsign to decode announces from the EU WWV data beacon
 $pc11_max_age = 1*3600;                        # the maximum age for an incoming 'real-time' pc11
 $pc23_max_age = 1*3600;                        # the maximum age for an incoming 'real-time' pc23
 
@@ -223,12 +222,13 @@ sub normal
                        }
 
                        # are any of the crucial fields invalid?
-            if ($field[2] =~ /[a-z]/ || $field[6] =~ /[a-z]/ || $field[7] =~ /[a-z]/) {
-                               dbg('chan', "Spot contains lower case callsigns, rejected");
+            if ($field[2] =~ /(?:^\s*$|[a-z])/ || $field[6] =~ /(?:^\s*$|[a-z])/ || $field[7] =~ /(?:^\s*$|[a-z])/) {
+                               dbg('chan', "Spot contains lower case callsigns or blanks, rejected");
                                return;
                        }
                        
                        # do some de-duping
+                       $field[5] =~ s/^\s+//;      # take any leading blanks off
                        if (Spot::dup($field[1], $field[2], $d, $field[5])) {
                                dbg('chan', "Duplicate Spot ignored\n");
                                return;
@@ -243,6 +243,20 @@ sub normal
                        # you should be able to route on any of these
             #
                        
+                       # fix up qra locators of known users 
+                       my $user = DXUser->get_current($spot[4]);
+                       if ($user) {
+                               my $qra = $user->qra;
+                               unless ($qra && DXBearing::is_qra($qra)) {
+                                       my $lat = $user->lat;
+                                       my $long = $user->long;
+                                       if (defined $lat && defined $long) {
+                                               $user->qra(DXBearing::lltoqra($lat, $long)); 
+                                               $user->put;
+                                       }
+                               }
+                       }
+                               
                        # local processing 
                        my $r;
                        eval {
@@ -261,6 +275,7 @@ sub normal
                
                if ($pcno == 12) {              # announces
                        # announce duplicate checking
+                       $field[3] =~ s/^\s+//;  # remove leading blanks
                        if (AnnTalk::dup($field[1], $field[2], $field[3])) {
                                dbg('chan', "Duplicate Announce ignored\n");
                                return;
@@ -279,13 +294,6 @@ sub normal
 
                                # send it
                                $self->send_announce($line, @field[1..6]);
-                               
-                               if ($decode_dk0wcy && $field[1] eq $decode_dk0wcy) {
-                                       my ($hour, $k, $next, $a, $r, $sfi, $alarm) = $field[3] =~ /^Aurora Beacon\s+(\d+)UTC,\s+Kiel\s+K=(\d+),.*ed\s+K=(\d+),\s+A=(\d+),\s+R=(\d+),\s+SFI=(\d+),.*larm:\s+(\w+)/;
-                                       $alarm = ($alarm =~ /^Y/i) ? ', Aurora in DE' : ''; 
-                                       my $wwv = Geomag::update($main::systime, $hour, $sfi, $a, $k, "R=$r, Next K=$next$alarm", $decode_dk0wcy, $field[5], $r) if $sfi && $r;
-                               }
-                               
                        } else {
                                $self->route($field[2], $line);
                        }
@@ -660,6 +668,8 @@ sub normal
                                my ($lat, $long) = DXBearing::stoll($field[3]);
                                $user->lat($lat);
                                $user->long($long);
+                               my $qra = $user->qra || DXBearing::lltoqra($lat, $long);
+                               $qra = DXBearing::lltoqra($lat, $long) unless DXBearing::is_qra($qra);
                        } elsif ($field[2] == 4) {
                                $user->homenode($field[3]);
                        }
@@ -947,7 +957,7 @@ sub send_dx_spot
                                $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
                        }
                } elsif ($dxchan->is_user && $dxchan->{dx}) {
-                       my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]);
+                       my $buf = Spot::formatb($dxchan->{user}->wantgrid, $_[0], $_[1], $_[2], $_[3], $_[4]);
                        $buf .= "\a\a" if $dxchan->{beep};
                        if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
                                $dxchan->send($buf);