X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FSpot.pm;h=67d8a6580aae023dfc6664c3985babfad0c7f9e5;hb=a9fb1f86dd478133c73deb76fc89442cbdd9443b;hp=4c7ab06e3bd94b15b7f6be5afcc4a6f5085244f2;hpb=211b54d504170a8c9dad2bf25b9ed686d5eeac11;p=spider.git diff --git a/perl/Spot.pm b/perl/Spot.pm index 4c7ab06e..67d8a658 100644 --- a/perl/Spot.pm +++ b/perl/Spot.pm @@ -23,13 +23,14 @@ use vars qw($fp $maxspots $defaultspots $maxdays $dirprefix $duplth $dupage $fil $fp = undef; $maxspots = 50; # maximum spots to return $defaultspots = 10; # normal number of spots to return -$maxdays = 35; # normal maximum no of days to go back +$maxdays = 365; # normal maximum no of days to go back $dirprefix = "spots"; $duplth = 20; # the length of text to use in the deduping $dupage = 3*3600; # the length of time to hold spot dups $filterdef = bless ([ # tag, sort, field, priv, special parser ['freq', 'r', 0, 0, \&decodefreq], + ['on', 'r', 0, 0, \&decodefreq], ['call', 'c', 1], ['info', 't', 3], ['by', 'c', 4], @@ -44,6 +45,14 @@ $filterdef = bless ([ ], 'Filter::Cmd'); +# create a Spot Object +sub new +{ + my $class = shift; + my $self = [ @_ ]; + return bless $self, $class; +} + sub decodefreq { my $dxchan = shift; @@ -113,7 +122,7 @@ sub add my $spotter_cq = (@dxcc > 0 ) ? $dxcc[1]->cq() : 0; push @out, $spotter_dxcc; push @out, $spot[5]; - + my $buf = join("\^", @out); # compare dates to see whether need to open another save file (remember, redefining $fp @@ -150,7 +159,7 @@ sub add sub search { - my ($expr, $dayfrom, $dayto, $from, $to) = @_; + my ($expr, $dayfrom, $dayto, $from, $to, $hint) = @_; my $eval; my @out; my $ref; @@ -166,6 +175,8 @@ sub search @todate = Julian::sub(@fromdate, $dayto); $from = 0 unless $from; $to = $defaultspots unless $to; + $hint = $hint ? "next unless $hint" : ""; + $expr = "1" unless $expr; $to = $from + $maxspots if $to - $from > $maxspots || $to - $from <= 0; @@ -176,6 +187,11 @@ sub search # build up eval to execute $eval = qq( + while (<\$fh>) { + $hint; + chomp; + push \@spots, [ split '\\^' ]; + } my \$c; my \$ref; for (\$c = \$#spots; \$c >= 0; \$c--) { @@ -199,10 +215,6 @@ sub search my $fh = $fp->open(@now); # get the next file if ($fh) { my $in; - while (<$fh>) { - chomp; - push @spots, [ split '\^' ]; - } eval $eval; # do the search on this file last if $count >= $to; # stop after to return ("Spot search error", $@) if $@; @@ -212,6 +224,32 @@ sub search return @out; } +# change a freq range->regular expression +sub ftor +{ + my ($a, $b) = @_; + return undef unless $a < $b; + $b--; + my @a = split //, $a; + my @b = split //, $b; + my $out; + while (@b > @a) { + $out .= shift @b; + } + while (@b) { + my $aa = shift @a; + my $bb = shift @b; + if ($aa eq $bb) { + $out .= $aa; + } elsif ($aa < $bb) { + $out .= "[$aa-$bb]"; + } else { + $out .= "[$bb-$aa]"; + } + } + return $out; +} + # format a spot for user output in 'broadcast' mode sub formatb {