X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=6550f90885edb2289b3a18c04bbe991cbad7d00f;hb=2edc1b59ddce231771947ff0f31adbae015ff6c7;hp=dbe7faf8e7f63340b3ee4ef262e8ea7505ed6380;hpb=ea7e97b115dd46656a5aa7fabd19990e98a50df5;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index dbe7faf8..6550f908 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -35,7 +35,7 @@ use Route::Node; use strict; use vars qw($me $pc11_max_age $pc23_max_age - $last_hour $last10 %emph %pings %rcmds + $last_hour $last10 %eph %pings %rcmds %nodehops $baddx $badspotter $badnode $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist); @@ -554,7 +554,15 @@ sub normal next unless $call && $conf && defined $here && is_callsign($call); $conf = $conf eq '*'; - push @rout, $parent->add_user($call, Route::here($here)|Route::conf($conf)); + my $r = Route::User::get($call); + my $flags = Route::here($here)|Route::conf($conf); + + if ($r && $r->flags != $flags) { + $r->$flags($flags); + push @rout, $r; + } elsif (!$r) { + push @rout, $parent->add_user($call, $flags); + } # add this station to the user database, if required $call =~ s/-\d+$//o; # remove ssid for users @@ -570,7 +578,6 @@ sub normal # queue up any messages (look for privates only) DXMsg::queue_msg(1) if $self->state eq 'normal'; - dbg('route', "B/C PC16 on $ncall for: " . join(',', map{$_->call} @rout)) if @rout; $self->route_pc16($parent, @rout) if @rout; return; } @@ -578,6 +585,7 @@ sub normal if ($pcno == 17) { # remove a user my $dxchan; my $ncall = $field[2]; + my $ucall = $field[1]; if ($ncall eq $main::mycall) { dbg('chan', "PCPROT: trying to alter config on this node from outside!"); return; @@ -592,8 +600,8 @@ sub normal dbg('chan', "PCPROT: Route::Node $ncall not in config"); return; } - my @rout = $parent->del_user($field[1]); - dbg('route', "B/C PC17 on $ncall for: $field[1]"); + my $r = Route::User::get($ucall); + my @rout = $parent->del_user($ucall) if $r; $self->route_pc17($parent, @rout) if @rout; return; } @@ -636,9 +644,10 @@ sub normal # update it if required my $r; - if ($parent->call eq $call && !$parent->version) { + my $flags = Route::here($here)|Route::conf($conf); + if ($parent->call eq $call && ($parent->version ne $ver || $parent->flags != $flags)) { $parent->version($ver); - $parent->flags(Route::here($here)|Route::conf($conf)); + $parent->flags($flags); push @rout, $parent; } elsif ($parent->call ne $call) { next if $call eq $main::mycall || $call eq $self->{call}; @@ -647,7 +656,7 @@ sub normal push @rout, $r if $r; } else { $r = Route::Node::get($call); - if ($r && (!$r->version || $r->version eq '0000')) { + if ($r && ($r->version ne $ver || $r->flags != $flags)) { $r->version($ver); $r->flags(Route::here($here)|Route::conf($conf)); push @rout, $r; @@ -672,8 +681,6 @@ sub normal $user->put; } - dbg('route', "B/C PC19 for: " . join(',', map{$_->call} @rout)) if @rout; - $self->route_pc19(@rout) if @rout; return; } @@ -706,8 +713,6 @@ sub normal dbg('chan', "PCPROT: I WILL _NOT_ be disconnected!"); return; } - dbg('route', "B/C PC21 for: " . join(',', (map{$_->call} @rout))) if @rout; - $self->route_pc21(@rout) if @rout; return; } @@ -1072,7 +1077,7 @@ sub normal # REBROADCAST!!!! # - if (emph_dup($line)) { + if (eph_dup($line)) { dbg('chan', "PCPROT: Ephemeral dup, dropped"); } else { unless ($self->{isolate}) { @@ -1098,7 +1103,9 @@ sub process # send a pc50 out on this channel $dxchan->{pc50_t} = $main::systime unless exists $dxchan->{pc50_t}; if ($t >= $dxchan->{pc50_t} + $DXProt::pc50_interval) { - $dxchan->send(pc50(scalar DXChannel::get_all_users)); + my $s = pc50(scalar DXChannel::get_all_users); + eph_dup($s); + $dxchan->send($s); $dxchan->{pc50_t} = $t; } @@ -1116,9 +1123,9 @@ sub process # every ten seconds if ($t - $last10 >= 10) { - # clean out emphemera + # clean out ephemera - emph_clean(); + eph_clean(); $last10 = $t; } @@ -1756,24 +1763,24 @@ sub route_pc21 broadcast_route($self, \&pc21, scalar @_, @_); } -sub emph_dup +sub eph_dup { my $s = shift; # chop the end off $s =~ s/\^H\d\d?\^?~?@//; - return 1 if exists $emph{$s}; - $emph{$s} = $main::systime; + return 1 if exists $eph{$s}; + $eph{$s} = $main::systime; return undef; } -sub emph_clean +sub eph_clean { my ($key, $val); - while (($key, $val) = each %emph) { + while (($key, $val) = each %eph) { if ($main::systime - $val > 90) { - delete $emph{$key}; + delete $eph{$key}; } } }