back fix spots
[spider.git] / perl / Spot.pm
index 9b67cc5fb54f3a7d9e562e8247fc46c40b2ca29e..72a898079617c35a7f73fabef374475b6ed895b5 100644 (file)
@@ -17,6 +17,7 @@ use Julian;
 use Prefix;
 use DXDupe;
 use Data::Dumper;
+use QSL;
 
 use strict;
 
@@ -26,7 +27,7 @@ $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0))
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
-use vars qw($fp $statp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $filterdef $totalspots $hfspots $vhfspots);
+use vars qw($fp $statp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $filterdef $totalspots $hfspots $vhfspots );
 
 $fp = undef;
 $statp = undef;
@@ -50,7 +51,10 @@ $filterdef = bless ([
                          ['call_zone', 'nz', 9],
                          ['by_itu', 'ni', 10],
                          ['by_zone', 'nz', 11],
-                         ['channel', 'c', 12],
+                         ['call_state', 'ns', 12],
+                         ['by_state', 'ns', 13],
+                         ['channel', 'c', 14],
+                                        
                         ], 'Filter::Cmd');
 $totalspots = $hfspots = $vhfspots = 0;
 
@@ -98,8 +102,9 @@ sub init
        mkdir "$dirprefix", 0777 if !-e "$dirprefix";
        $fp = DXLog::new($dirprefix, "dat", 'd');
        $statp = DXLog::new($dirprefix, "dys", 'd');
-       system("rm -f $main::data/$dirprefix/200?/*.bys");
-       system("rm -f $main::data/$dirprefix/200?/*.cys");
+       my $rm = $main::is_win ? 'del' : 'rm -f';
+       system("$rm $main::data/$dirprefix/*/*.bys");
+       system("$rm $main::data/$dirprefix/*/*.cys");
 }
 
 sub prefix
@@ -122,24 +127,33 @@ sub prepare
        # remove leading and trailing spaces
        $_[3] = unpad($_[3]);
        
+       my ($spotted_dxcc, $spotted_itu, $spotted_cq, $spotted_state) = (666, 0, 0, "");
+       my ($spotter_dxcc, $spotter_itu, $spotter_cq, $spotter_state) = (666, 0, 0, "");
+       
        # add the 'dxcc' country on the end for both spotted and spotter, then the cluster call
        my @dxcc = Prefix::extract($out[1]);
-       my $spotted_dxcc = (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 666;
-       my $spotted_itu = (@dxcc > 0 ) ? $dxcc[1]->itu() : 0;
-       my $spotted_cq = (@dxcc > 0 ) ? $dxcc[1]->cq() : 0;
+       if (@dxcc) {
+               $spotted_dxcc = $dxcc[1]->dxcc();
+               $spotted_itu = $dxcc[1]->itu();
+               $spotted_cq = $dxcc[1]->cq();
+               $spotted_state = $dxcc[1]->state();
+       }
        push @out, $spotted_dxcc;
        @dxcc = Prefix::extract($out[4]);
-       my $spotter_dxcc = (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 666;
-       my $spotter_itu = (@dxcc > 0 ) ? $dxcc[1]->itu() : 0;
-       my $spotter_cq = (@dxcc > 0 ) ? $dxcc[1]->cq() : 0;
+       if (@dxcc) {
+               $spotter_dxcc = $dxcc[1]->dxcc();
+               $spotter_itu = $dxcc[1]->itu();
+               $spotter_cq = $dxcc[1]->cq();
+               $spotter_state = $dxcc[1]->state();
+       }
        push @out, $spotter_dxcc;
        push @out, $_[5];
-       return (@out, $spotted_itu, $spotted_cq, $spotter_itu, $spotter_cq);
+       return (@out, $spotted_itu, $spotted_cq, $spotter_itu, $spotter_cq, $spotted_state, $spotter_state);
 }
 
 sub add
 {
-       my $buf = join("\^", @_[0..7]);
+       my $buf = join("\^", @_);
        $fp->writeunix($_[2], $buf);
        $totalspots++;
        if ($_[0] <= 30000) {
@@ -147,6 +161,10 @@ sub add
        } else {
                $vhfspots++;
        }
+       if ($_[3] =~ /(?:QSL|VIA)/i) {
+               my $q = QSL::get($_[1]) || new QSL $_[1];
+               $q->update($_[3], $_[2], $_[4]);
+       }
 }
 
 # search the spot database for records based on the field no and an expression
@@ -176,7 +194,7 @@ sub add
 
 sub search
 {
-       my ($expr, $dayfrom, $dayto, $from, $to, $hint) = @_;
+       my ($expr, $dayfrom, $dayto, $from, $to, $hint, $dxchan) = @_;
        my $eval;
        my @out;
        my $ref;
@@ -215,6 +233,22 @@ sub search
                           for (\$c = \$#spots; \$c >= 0; \$c--) {
                                        \$ref = \$spots[\$c];
                                        if ($expr) {
+                           if (\$dxchan && \$dxchan->{inspotsfilter}) {
+                            if (\@\$ref < 9) {
+                                my \@dxcc = Prefix::cty_data(\$ref->[1]);
+                                if (\@dxcc) {
+                                    pop \@dxcc;
+                                    push \@\$ref, \@dxcc;
+                                }
+                                \@dxcc = Prefix::cty_data(\$ref->[4]);
+                                if (\@dxcc) {
+                                    pop \@dxcc;
+                                    push \@\$ref, \@dxcc;
+                                }
+                            }
+                                   my (\$filter, \$hops) = \$dxchan->{inspotsfilter}->it(\@\$ref);
+                                   next unless (\$filter);
+                        }
                                                \$count++;
                                                next if \$count < \$from; # wait until from 
                                                push(\@out, \$ref);
@@ -222,6 +256,9 @@ sub search
                                        }
                                }
                          );
+    
+       dbg("Spot eval: $eval") if isdbg('searcheval');
+       
 
        $fp->close;                                     # close any open files
 
@@ -300,7 +337,7 @@ sub readfile($)
 # enter the spot for dup checking and return true if it is already a dup
 sub dup
 {
-       my ($freq, $call, $d, $text) = @_; 
+       my ($freq, $call, $d, $text, $by) = @_; 
 
        # dump if too old
        return 2 if $d < $main::systime - $dupage;
@@ -311,19 +348,27 @@ sub dup
 
        $freq = sprintf "%.1f", $freq;       # normalise frequency
        $call = substr($call, 0, 12) if length $call > 12;
+
+       # quick test now for simple case
+       my $sdupkey = "X$freq|$call|$d|$by";
+       return 1 if DXDupe::find($sdupkey);
+       
        chomp $text;
        $text =~ s/\%([0-9A-F][0-9A-F])/chr(hex($1))/eg;
        $text = substr($text, 0, $duplth) if length $text > $duplth; 
        unpad($text);
        $text = pack("C*", map {$_ & 127} unpack("C*", $text));
        $text =~ s/[^a-zA-Z0-9]//g;
-       for (0,60,120,180,240,300) {
+       for (-60, -120, -180, -240, 0, 60, 120, 180, 240, 300) {
                my $dt = $d - $_;
-               my $dupkey = "X$freq|$call|$dt|\L$text";
-               return 1 if DXDupe::find($dupkey);
+               my $ldupkey = "X$freq|$call|$dt|\L$text";
+               my $sdupkey = "X$freq|$call|$dt|$by";
+               return 1 if DXDupe::find($ldupkey) || DXDupe::find($sdupkey);
        }
-       my $dupkey = "X$freq|$call|$d|\L$text";
-       DXDupe::add($dupkey, $main::systime+$dupage);
+       my $ldupkey = "X$freq|$call|$d|\L$text";
+       $sdupkey = "X$freq|$call|$d|$by";
+       DXDupe::add($ldupkey, $main::systime+$dupage);
+       DXDupe::add($sdupkey, $main::systime+$dupage);
        return 0;
 }
 
@@ -349,6 +394,7 @@ sub genstats($)
                        my ($freq, $by, $dxcc) = (split /\^/)[0,4,6];
                        my $ref = $list{$by} || [0, $dxcc];
                        for (@freq) {
+                               next unless defined $_;
                                if ($freq >= $_->[1] && $freq <= $_->[2]) {
                                        $$ref[$_->[0]+2]++;
                                        $tot[$_->[0]+2]++;