fix the double annoucement of disconnection of nodes?
[spider.git] / perl / DXProt.pm
index 6332b8bd7ff19f1a2eade9c8c6e972231b481002..736cab4d41d1a58496cb0b7bfcb305dec26f557d 100644 (file)
@@ -34,7 +34,14 @@ use Route;
 use Route::Node;
 
 use strict;
-use vars qw($me $pc11_max_age $pc23_max_age
+
+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($me $pc11_max_age $pc23_max_age $last_pc50
                        $last_hour $last10 %eph  %pings %rcmds
                        %nodehops $baddx $badspotter $badnode $censorpc
                        $allowzero $decode_dk0wcy $send_opernam @checklist);
@@ -52,7 +59,7 @@ $censorpc = 1;                                        # Do a BadWords::check on text fields and reject things
 $baddx = new DXHash "baddx";
 $badspotter = new DXHash "badspotter";
 $badnode = new DXHash "badnode";
-$last10 = time;
+$last10 = $last_pc50 = time;
 
 @checklist = 
 (
@@ -220,13 +227,14 @@ sub start
        $self->{isolate} = $user->{isolate};
        $self->{consort} = $line;       # save the connection type
        $self->{here} = 1;
+       $self->{width} = 80;
 
        # get the output filters
        $self->{spotsfilter} = Filter::read_in('spots', $call, 0) || Filter::read_in('spots', 'node_default', 0);
        $self->{wwvfilter} = Filter::read_in('wwv', $call, 0) || Filter::read_in('wwv', 'node_default', 0);
        $self->{wcyfilter} = Filter::read_in('wcy', $call, 0) || Filter::read_in('wcy', 'node_default', 0);
        $self->{annfilter} = Filter::read_in('ann', $call, 0) || Filter::read_in('ann', 'node_default', 0) ;
-       $self->{routefilter} = Filter::read_in('route', $call, 0) || Filter::read_in('route', 'node_default', 0) ;
+       $self->{routefilter} = Filter::read_in('route', $call, 0) || Filter::read_in('route', 'node_default', 0) unless $self->{isolate} ;
 
 
        # get the INPUT filters (these only pertain to Clusters)
@@ -234,7 +242,7 @@ sub start
        $self->{inwwvfilter} = Filter::read_in('wwv', $call, 1) || Filter::read_in('wwv', 'node_default', 1);
        $self->{inwcyfilter} = Filter::read_in('wcy', $call, 1) || Filter::read_in('wcy', 'node_default', 1);
        $self->{inannfilter} = Filter::read_in('ann', $call, 1) || Filter::read_in('ann', 'node_default', 1);
-       $self->{inroutefilter} = Filter::read_in('route', $call, 1) || Filter::read_in('route', 'node_default', 1);
+       $self->{inroutefilter} = Filter::read_in('route', $call, 1) || Filter::read_in('route', 'node_default', 1) unless $self->{isolate};
        
        # set unbuffered and no echo
        $self->send_now('B',"0");
@@ -571,7 +579,7 @@ sub normal
                                                $r->flags($flags);
                                                push @rout, $r;
                                        }
-                                       $r->addparent($ncall);
+                                       $r->addparent($parent);
                                } else {
                                        push @rout, $parent->add_user($call, $flags);
                                }
@@ -619,11 +627,17 @@ sub normal
                                dbg("PCPROT: Route::Node $ncall not in config") if isdbg('chanerr');
                                return;
                        }
+                       my $uref = Route::User::get($ucall);
+                       unless ($uref) {
+                               dbg("PCPROT: Route::User $ucall not in config") if isdbg('chanerr');
+                               return;
+                       }
+                       
 
                        # input filter if required
                        return unless $self->in_filter_route($parent);
-
-                       my @rout = $parent->del_user($ucall);
+                       
+                       my @rout = $parent->del_user($uref);
 
                        if (eph_dup($line)) {
                                dbg("PCPROT: dup PC17 detected") if isdbg('chanerr');
@@ -640,7 +654,7 @@ sub normal
                        # first clear out any nodes on this dxchannel
                        my $parent = Route::Node::get($self->{call});
                        my @rout = $parent->del_nodes;
-                       $self->route_pc21(@rout, $parent);
+                       $self->route_pc21(@rout, $parent) if @rout;
                        $self->send_local_config();
                        $self->send(pc20());
                        return;             # we don't pass these on
@@ -1115,20 +1129,22 @@ sub process
        my $t = time;
        my @dxchan = DXChannel->get_all();
        my $dxchan;
+       my $pc50s;
        
+       # send out a pc50 on EVERY channel all at once
+       if ($t >= $last_pc50 + $DXProt::pc50_interval) {
+               $pc50s = pc50($me, scalar DXChannel::get_all_users);
+               eph_dup($pc50s);
+               $last_pc50 = $t;
+       }
+
        foreach $dxchan (@dxchan) {
                next unless $dxchan->is_node();
                next if $dxchan == $me;
-               
-               # 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) {
-                       my $s = pc50($me, scalar DXChannel::get_all_users);
-                       eph_dup($s);
-                       $dxchan->send($s);
-                       $dxchan->{pc50_t} = $t;
-               } 
 
+               # send the pc50
+               $dxchan->send($pc50s) if $pc50s;
+               
                # send a ping out on this channel
                if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) {
                        if ($dxchan->{nopings} <= 0) {
@@ -1350,10 +1366,7 @@ sub send_announce
        foreach $dxchan (@dxchan) {
                next if $dxchan == $me;
                next if $dxchan == $self && $self->is_node;
-               my $routeit;
-               my ($filter, $hops);
-
-               $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq)
+               $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq);
        }
 }
 
@@ -1364,6 +1377,7 @@ sub announce
        my $isolate = shift;
        my $to = shift;
        my $target = shift;
+       my $text = shift;
        my ($filter, $hops);
 
        if ($self->{annfilter}) {
@@ -1391,7 +1405,7 @@ sub send_local_config
                # create a list of all the nodes that are not connected to this connection
                # and are not themselves isolated, this to make sure that isolated nodes
         # don't appear outside of this node
-               my @dxchan = grep { $_->call ne $main::mycall && $_->call ne $self->{call} } DXChannel::get_all_nodes();
+               my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes();
                @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan;
                my @intcalls = map { $_->nodes } @localnodes if @localnodes;
                my $ref = Route::Node::get($self->{call});
@@ -1712,6 +1726,8 @@ sub disconnect
        my $pc39flag = shift;
        my $call = $self->call;
 
+       return if $self->{disconnecting}++;
+       
        unless ($pc39flag && $pc39flag == 1) {
                $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
        }
@@ -1720,7 +1736,6 @@ sub disconnect
        my $node = Route::Node::get($call);
        my @rout;
        if ($node) {
-#              @rout = $node->del_nodes;    # at the next level
                @rout = $node->del($main::routeroot);
        }