X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=04d62e4b55b02c3c23820cb3761c047b44af99e1;hb=77727aa5c288b8b34cb0e05cea45a367fa1f9b6c;hp=7ef99411fd7d099d1de5e8838e867d02a2f6b5dd;hpb=80a2dd317e5d6b24250388b5177cbf85abee5a85;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 7ef99411..04d62e4b 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -30,14 +30,17 @@ use Carp; use strict; use vars qw($me $pc11_max_age $pc11_dup_age $pc23_dup_age %spotdup %wwvdup $last_hour %pings %rcmds - %nodehops @baddx $baddxfn); + %nodehops @baddx $baddxfn $pc12_dup_age + %anndup); $me = undef; # the channel id for this cluster $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 $pc11_dup_age = 24*3600; # the maximum time to keep the spot dup list for $pc23_dup_age = 24*3600; # the maximum time to keep the wwv dup list for +$pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for %spotdup = (); # the pc11 and 26 dup hash -%wwvdup = (); # the pc23 and 27 dup hash +%wwvdup = (); # the pc23 and 27 dup hash +%anndup = (); # the PC12 dup hash $last_hour = time; # last time I did an hourly periodic update %pings = (); # outstanding ping requests outbound %rcmds = (); # outstanding rcmd requests outbound @@ -235,6 +238,21 @@ sub normal } if ($pcno == 12) { # announces + # announce duplicate checking + my $text = uc unpad($field[3]); + my $dupkey = $field[1].$field[2].$text.$field[4].$field[6]; + if ($anndup{$dupkey}) { + dbg('chan', "Duplicate Announce ignored\n"); + return; + } + $anndup{$dupkey} = $main::systime; + + # global ann filtering + my ($filter, $hops) = Filter::it($self->{annfilter}, @field[1..6], $self->{call} ) if $self->{annfilter}; + if ($self->{annfilter} && !$filter) { + dbg('chan', "Rejected by filter"); + return; + } if ($field[2] eq '*' || $field[2] eq $main::mycall) { @@ -646,6 +664,10 @@ sub process while (($key, $val) = each %wwvdup) { delete $wwvdup{$key} if $val < $cutoff; } + $cutoff = $main::systime - $pc12_dup_age; + while (($key, $val) = each %anndup) { + delete $anndup{$key} if $val < $cutoff; + } $last_hour = $main::systime; } } @@ -713,10 +735,14 @@ sub send_dx_spot $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; } - } elsif ($dxchan->is_user) { + } elsif ($dxchan->is_user && $dxchan->{dx}) { my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]); - $buf .= "\a\a" if $dxchan->beep; - $dxchan->send($buf) if !$hops || ($hops && $filter); + $buf .= "\a\a" if $dxchan->{beep}; + if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') { + $dxchan->send($buf) if !$hops || ($hops && $filter); + } else { + $dxchan->delay($buf) if !$hops || ($hops && $filter); + } } } }