rearrange spot broadcast so that it copes according to terminal type
[spider.git] / perl / Spot.pm
index 074ae740b4aa7842b0a24ef4fa43e4cd709a9910..fb5683fb5e07b6e9e4656a31977afac323c6376c 100644 (file)
@@ -19,6 +19,13 @@ use DXDupe;
 use Data::Dumper;
 
 use strict;
+
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
 use vars qw($fp $statp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $filterdef);
 
 $fp = undef;
@@ -36,14 +43,14 @@ $filterdef = bless ([
                          ['call', 'c', 1],
                          ['info', 't', 3],
                          ['by', 'c', 4],
-                         ['call_dxcc', 'n', 5],
-                         ['by_dxcc', 'n', 6],
+                         ['call_dxcc', 'nc', 5],
+                         ['by_dxcc', 'nc', 6],
                          ['origin', 'c', 7, 9],
-                         ['call_itu', 'n', 8],
-                         ['call_zone', 'n', 9],
-                         ['by_itu', 'n', 10],
-                         ['by_zone', 'n', 11],
-                         ['channel', 'n', 12, 9],
+                         ['call_itu', 'ni', 8],
+                         ['call_zone', 'nz', 9],
+                         ['by_itu', 'ni', 10],
+                         ['by_zone', 'nz', 11],
+                         ['channel', 'c', 12],
                         ], 'Filter::Cmd');
 
 
@@ -90,7 +97,8 @@ sub init
 {
        mkdir "$dirprefix", 0777 if !-e "$dirprefix";
        $fp = DXLog::new($dirprefix, "dat", 'd');
-       $statp = DXLog::new($dirprefix, "bys", 'd');
+       $statp = DXLog::new($dirprefix, "cys", 'd');
+       system("rm -f $main::data/$dirprefix/2001/*.bys");
 }
 
 sub prefix
@@ -115,12 +123,12 @@ sub prepare
        
        # 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() : 0;
+       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;
        push @out, $spotted_dxcc;
        @dxcc = Prefix::extract($out[4]);
-       my $spotter_dxcc = (@dxcc > 0 ) ? $dxcc[1]->dxcc() : 0;
+       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;
        push @out, $spotter_dxcc;
@@ -167,15 +175,15 @@ sub search
        my $ref;
        my $i;
        my $count;
-       my @today = Julian::unixtoj(time());
-       my @fromdate;
-       my @todate;
+       my $today = Julian::Day->new(time());
+       my $fromdate;
+       my $todate;
 
        $dayfrom = 0 if !$dayfrom;
        $dayto = $maxdays unless $dayto;
        $dayto = $dayfrom + $maxdays if $dayto < $dayfrom;
-       @fromdate = Julian::sub(@today, $dayfrom);
-       @todate = Julian::sub(@fromdate, $dayto);
+       $fromdate = $today->sub($dayfrom);
+       $todate = $fromdate->sub($dayto);
        $from = 0 unless $from;
        $to = $defaultspots unless $to;
        $hint = $hint ? "next unless $hint" : "";
@@ -211,11 +219,11 @@ sub search
        $fp->close;                                     # close any open files
 
        for ($i = $count = 0; $i < $maxdays; ++$i) {    # look thru $maxdays worth of files only
-               my @now = Julian::sub(@fromdate, $i); # but you can pick which $maxdays worth
-               last if Julian::cmp(@now, @todate) <= 0;         
+               my $now = $fromdate->sub($i); # but you can pick which $maxdays worth
+               last if $now->cmp($todate) <= 0;         
        
                my @spots = ();
-               my $fh = $fp->open(@now); # get the next file
+               my $fh = $fp->open($now); # get the next file
                if ($fh) {
                        my $in;
                        eval $eval;                     # do the search on this file
@@ -243,7 +251,7 @@ sub ftor
        while (@b) {
                my $aa = shift @a;
                my $bb = shift @b;
-               if (@b < (length $d) - 1) {
+               if (@b < (length $d)) {
                        $out .= '\\d';
                } elsif ($aa eq $bb) {
                        $out .= $aa;
@@ -256,18 +264,6 @@ sub ftor
        return $out;
 }
 
-# format a spot for user output in 'broadcast' mode
-sub formatb
-{
-       my $wantgrid = shift;
-       my $t = ztime($_[2]);
-       my $ref = DXUser->get_current($_[4]);
-       my $loc = $ref->qra if $ref && $ref->qra && $wantgrid;
-       $loc = ' ' . substr($ref->qra, 0, 4) if $loc;
-       $loc = "" unless $loc;
-       return sprintf "DX de %-7.7s%11.1f  %-12.12s %-30s %s$loc", "$_[4]:", $_[0], $_[1], $_[3], $t ;
-}
-
 # format a spot for user output in list mode
 sub formatl
 {
@@ -279,11 +275,11 @@ sub formatl
 #
 # return all the spots from a day's file as an array of references
 # the parameter passed is a julian day
-sub readfile
+sub readfile($)
 {
        my @spots;
        
-       my $fh = $fp->open(@_); 
+       my $fh = $fp->open(shift); 
        if ($fh) {
                my $in;
                while (<$fh>) {
@@ -304,12 +300,19 @@ sub dup
  
        $freq = sprintf "%.1f", $freq;       # normalise frequency
        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 =~ s/[\\\%]\d+//g;
+       $text = pack("C*", map {$_ & 127} unpack("C*", $text));
        $text =~ s/[^a-zA-Z0-9]//g;
+       for (0,60,120,180,240,300) {
+               my $dt = $d - $_;
+               my $dupkey = "X$freq|$call|$dt|\L$text";
+               return 1 if DXDupe::find($dupkey);
+       }
        my $dupkey = "X$freq|$call|$d|\L$text";
-       return DXDupe::check($dupkey, $main::systime+$dupage);
+       DXDupe::add($dupkey, $main::systime+$dupage);
+       return 0;
 }
 
 sub listdups
@@ -317,11 +320,11 @@ sub listdups
        return DXDupe::listdups('X', $dupage, @_);
 }
 
-sub genstats
+sub genstats($)
 {
-       my @date = @_;
-       my $in = $fp->open(@date);
-       my $out = $statp->open(@date, 'w');
+       my $date = shift;
+       my $in = $fp->open($date);
+       my $out = $statp->open($date, 'w');
        my @freq = (
                                [0, Bands::get_freq('160m')],
                                [1, Bands::get_freq('80m')],
@@ -335,13 +338,15 @@ sub genstats
                                [9, Bands::get_freq('6m')],
                                [10, Bands::get_freq('4m')],
                                [11, Bands::get_freq('2m')],
-                               [12, Bands::get_freq('70cm')],
-                               [13, Bands::get_freq('13cm')],
-                               [14, Bands::get_freq('9cm')],
-                               [15, Bands::get_freq('6cm')],
-                               [16, Bands::get_freq('3cm')],
-                               [17, Bands::get_freq('12mm')],
-                               [18, Bands::get_freq('6cm')],
+                               [12, Bands::get_freq('220')],
+                               [13, Bands::get_freq('70cm')],
+                               [14, Bands::get_freq('23cm')],
+                               [15, Bands::get_freq('13cm')],
+                               [16, Bands::get_freq('9cm')],
+                               [17, Bands::get_freq('6cm')],
+                               [18, Bands::get_freq('3cm')],
+                               [19, Bands::get_freq('12mm')],
+                               [20, Bands::get_freq('6cm')],
                           );
        my %list;
        my @tot;
@@ -367,7 +372,7 @@ sub genstats
                for ($i = 0; $i < @freq+2; $i++) {
                        $tot[$i] ||= 0;
                }
-               $out->write(join('^', 'TOTALS', @tot) . "\n");
+               $statp->write($date, join('^', 'TOTALS', @tot));
 
                for (sort {$list{$b}->[0] <=> $list{$a}->[0]} keys %list) {
                        my $ref = $list{$_};
@@ -375,27 +380,26 @@ sub genstats
                        for ($i = 0; $i < @freq+2; ++$i) {
                                $ref->[$i] ||= 0;
                        }
-                       $out->write(join('^', $call, @$ref) . "\n");
+                       $statp->write($date, join('^', $call, @$ref));
                }
-               $out->close;
+               $statp->close;
        }
 }
 
 # return true if the stat file is newer than than the spot file
-sub checkstats
+sub checkstats($)
 {
-       my @date = @_;
-       my $in = $fp->mtime(@date);
-       my $out = $statp->mtime(@date);
+       my $date = shift;
+       my $in = $fp->mtime($date);
+       my $out = $statp->mtime($date);
        return defined $out && defined $in && $out >= $in;
 }
 
 # daily processing
 sub daily
 {
-       my @date = Julian::unixtoj($main::systime);
-       @date = Julian::sub(@date, 1);
-       genstats(@date) unless checkstats(@date);
+       my $date = Julian::Day->new($main::systime)->sub(1);
+       genstats($date) unless checkstats($date);
 }
 1;