spider/cmd/dx.pl
minima 363580155c fix swearing logging so that it is better.
fix badspotters being able to send dx spots.
add LogDbg() routine to both log and dbg at the same time (at last).
2006-01-07 16:53:03 +00:00

153 lines
3.3 KiB
Perl

#
# the DX command
#
# this is where the fun starts!
#
# Copyright (c) 1998 Dirk Koopman G1TLH
#
# $Id$
#
my ($self, $line) = @_;
my @f = split /\s+/, $line, 3;
my $spotter = $self->call;
my $spotted;
my $freq;
my @out;
my $valid = 0;
my $localonly;
return (1, $self->msg('e5')) if $self->remotecmd || $self->inscript;
return (1, $self->msg('e28')) unless $self->registered;
my @bad;
if (@bad = BadWords::check($line)) {
$self->badcount(($self->badcount||0) + @bad);
LogDbg('DXCommand', "$self->{call} swore: $line (with words:" . join(',', @bad) . ")");
$localonly++;
}
# do we have at least two args?
return (1, $self->msg('dx2')) unless @f >= 2;
# as a result of a suggestion by Steve K9AN, I am changing the syntax of
# 'spotted by' things to "dx by g1tlh <freq> <call>" <freq> and <call>
# can be in any order
if ($f[0] =~ /^by$/i) {
return (1, $self->msg('e5')) unless $main::allowdxby || $self->priv;
$spotter = uc $f[1];
$line =~ s/\s*$f[0]\s+$f[1]\s+//;
# $line = $f[2];
@f = split /\s+/, $line, 3;
return (1, $self->msg('dx2')) unless @f >= 2;
}
# get the freq and callsign either way round
if (is_freq($f[1]) && $f[0] =~ m{^[\w\d]+(?:/[\w\d]+){0,2}$}) {
$spotted = uc $f[0];
$freq = $f[1];
} elsif (is_freq($f[0]) && $f[1] =~ m{^[\w\d]+(?:/[\w\d]+){0,2}$}) {
$freq = $f[0];
$spotted = uc $f[1];
} else {
return (1, $self->msg('dx3'));
}
# check some other things
# remove ssid from calls
my $callnoid = $self->call;
$callnoid =~ s/-\d+$//;
my $spotternoid = $spotter;
$spotternoid =~ s/-\d+$//;
if ($DXProt::baddx->in($spotted)) {
$localonly++;
}
if ($DXProt::badspotter->in($callnoid)) {
LogDbg('DXCommand', "$self->{call} badspotter with $callnoid ($line)");
$localonly++;
}
if ($callnoid ne $spotternoid && $DXProt::badspotter->in($spotternoid)) {
LogDbg('DXCommand', "$self->{call} badspotter with $spotternoid ($line)");
$localonly++;
}
# make line the rest of the line
$line = $f[2] || " ";
@f = split /\s+/, $line;
# bash down the list of bands until a valid one is reached
my $bandref;
my @bb;
my $i;
# first in KHz
L1:
foreach $bandref (Bands::get_all()) {
@bb = @{$bandref->band};
for ($i = 0; $i < @bb; $i += 2) {
if ($freq >= $bb[$i] && $freq <= $bb[$i+1]) {
$valid = 1;
last L1;
}
}
}
unless ($valid) {
# try again in MHZ
$freq = $freq * 1000 if $freq;
L2:
foreach $bandref (Bands::get_all()) {
@bb = @{$bandref->band};
for ($i = 0; $i < @bb; $i += 2) {
if ($freq >= $bb[$i] && $freq <= $bb[$i+1]) {
$valid = 1;
last L2;
}
}
}
}
push @out, $self->msg('dx1', $freq) unless $valid;
# check we have a callsign :-)
if ($spotted le ' ') {
push @out, $self->msg('dx2');
$valid = 0;
}
return (1, @out) unless $valid;
# Store it here (but only if it isn't baddx)
my $t = (int ($main::systime/60)) * 60;
return (1, $self->msg('dup')) if Spot::dup($freq, $spotted, $t, $line, $spotter);
my @spot = Spot::prepare($freq, $spotted, $t, $line, $spotter, $main::mycall);
if ($freq =~ /^69/ || $localonly) {
# heaven forfend that we get a 69Mhz band :-)
if ($freq =~ /^69/) {
$self->badcount(($self->badcount||0) + 1);
}
$self->dx_spot(undef, undef, @spot);
return (1);
} else {
if (@spot) {
# store it
Spot::add(@spot);
# send orf to the users
DXProt::send_dx_spot($self, DXProt::pc11($spotter, $freq, $spotted, $line), @spot);
}
}
return (1, @out);