fix ipv4 addresses masquerading as ipv6
[spider.git] / perl / RBN.pm
index b95f637288b4af1d3be834186c94b39af91b0449..6773118f0315ea621c4b658d1e9318141b76a03f 100644 (file)
@@ -37,8 +37,7 @@ our $beacontime = 5*60;                       # same as minspottime, but for beacons (and shorter)
 our $dwelltime = 6;                    # the amount of time to wait for duplicates before issuing
                                 # a spot to the user (no doubt waiting with bated breath).
 
-our $filterdef = $Spot::filterdef; # we use the same filter as the Spot system. Can't think why.
-
+our $filterdef = $Spot::filterdef; # we use the same filter as the Spot system. Can't think why :-).
 
 sub new 
 {
@@ -48,8 +47,7 @@ sub new
        my $pkg = shift;
        my $call = shift;
 
-       DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], );
-       $self->{d} = {};
+#      DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], );
        $self->{spot} = {};
        $self->{last} = 0;
        $self->{noraw} = 0;
@@ -60,6 +58,8 @@ sub new
        $self->{minspottime} = $minspottime;
        $self->{beacontime} = $beacontime;
        $self->{showstats} = 0;
+       $self->{pingint} = 0;
+       $self->{nopings} = 0;
 
        return $self;
 }
@@ -70,8 +70,6 @@ sub start
        my $user = $self->{user};
        my $call = $self->{call};
        my $name = $user->{name};
-       my $dref = $self->{d};
-       my $spotref = $self->{spot};
                
        # log it
        my $host = $self->{conn}->peerhost;
@@ -88,7 +86,10 @@ sub start
                        ($h) = $line =~ /host=([\da..fA..F:]+)/;
                        $line =~ s/\s*host=[\da..fA..F:]+// if $h;
                }
-               $self->{hostname} = $h if $h;
+               if ($h) {
+                       $h =~ s/^::ffff://;
+                       $self->{hostname} = $h;
+               }
        }
        $self->{width} = 80 unless $self->{width} && $self->{width} > 80;
        $self->{consort} = $line;       # save the connection type
@@ -103,11 +104,10 @@ sub start
        # get the filters
        my $nossid = $call;
        $nossid =~ s/-\d+$//;
-       
-       $self->{spotsfilter} = Filter::read_in('spots', $call, 0) 
-               || Filter::read_in('spots', $nossid, 0)
-                       || Filter::read_in('spots', 'user_default', 0);
 
+       $self->{inrbnfilter} = Filter::read_in('rbn', $call, 1) 
+               || Filter::read_in('rbn', 'node_default', 1);
+       
        # clean up qra locators
        my $qra = $user->qra;
        $qra = undef if ($qra && !DXBearing::is_qra($qra));
@@ -260,6 +260,12 @@ sub normal
                # create record and add into the buildup
                my $r = [$origin, nearest(.1, $qrg), $call, $mode, $s, $t, $utz, $respot, $u];
                dbg("RBN: key: '$sp' ADD RECORD call: $call qrg: $qrg origin: $origin") if isdbg('rbn');
+               my @s =  Spot::prepare($r->[1], $r->[2], $r->[6], '', $r->[0]);
+               if ($self->{inrbnfilter}) {
+                       my ($want, undef) = $self->{inrbnfilter}->it($s);
+                       next unless $want;      
+               }
+               $r->[9] = \@s;
 
                push @$spot, $r;
 
@@ -391,27 +397,29 @@ sub dx_spot
                $respot = 1 if $r->[7];
                $qra = $r->[8] if !$qra && $r->[8] && is_qra($r->[8]);
 
-               my @s =  Spot::prepare($r->[1], $r->[2], $r->[6], $comment, $r->[0]);
-
-               ++$zone{$s[11]};                # save the spotter's zone
-               ++$qrg{$s[0]};                  # and the qrg
+               my $s = $r->[9];                # the prepared spot
+               $s->[3] = $comment;             # apply new generated comment
+               
+               
+               ++$zone{$s->[11]};              # save the spotter's zone
+               ++$qrg{$s->[0]};                # and the qrg
 
  
-               my $filter = 0;
-
-               if ($dxchan->{rbnfilter}) {
-                       ($filter, undef) = $dxchan->{rbnfilter}->it(\@s);
-                       next unless $filter;
-                       $saver = \@s;
-                       dbg("RBN: FILTERED call: $s[1] qrg: $s[0] origin: $s[4] dB: $r->[4]") if isdbg 'rbn';
+               my $want = 0;
+               my $rf = $dxchan->{rbnfilter} || $dxchan->{spotsfilter};
+               if ($rf) {
+                       ($want, undef) = $rf->it($s);
+                       next unless $want;
+                       $saver = $s;
+                       dbg("RBN: FILTERED call: $s->[1] qrg: $s->[0] origin: $s->[4] dB: $r->[4]") if isdbg 'rbn';
                        last;
                }
 
                # save the lowest strength one
                if ($r->[4] < $strength) {
                        $strength = $r->[4];
-                       $saver = \@s;
-                       dbg("RBN: STRENGTH call: $s[1] qrg: $s[0] origin: $s[4] dB: $r->[4]") if isdbg 'rbn';
+                       $saver = $s;
+                       dbg("RBN: STRENGTH call: $s->[1] qrg: $s->[0] origin: $s->[4] dB: $r->[4]") if isdbg 'rbn';
                }
        }
 
@@ -436,10 +444,10 @@ sub dx_spot
                
                dbg("RBN: SENDING call: $saver->[1] qrg: $saver->[0] origin: $saver->[4] $saver->[3]") if isdbg 'rbn';
                if ($dxchan->{ve7cc}) {
-                       my $call = $saver->[1];
-                       $saver->[1] .= '-#';
+                       my $call = $saver->[4];
+                       $saver->[4] .= '-#';
                        $buf = VE7CC::dx_spot($dxchan, @$saver);
-                       $saver->[1] = $call;
+                       $saver->[4] = $call;
                } else {
                        $buf = $dxchan->format_dx_spot(@$saver);
                }