do "$main::data/hop_table.pl" if -e "$main::data/hop_table.pl";
confess $@ if $@;
$me->{sort} = 'S'; # S for spider
+ $me->{priv} = 9;
}
#
$self->{lastping} = $main::systime + ($self->pingint / 2);
}
$self->state('init');
- $self->pc50_t(time);
+ $self->{pc50_t} = $main::systime;
# send info to all logged in thingies
$self->tell_login('loginn');
return;
}
}
+
+ my @spot = Spot::prepare($field[1], $field[2], $d, $field[5], $field[6], $field[7]);
+ # global spot filtering on INPUT
+ if ($self->{inspotsfilter}) {
+ my ($filter, $hops) = $self->{inspotsfilter}->it(@spot);
+ unless ($filter) {
+ dbg('chan', "PCPROT: Rejected by filter");
+ return;
+ }
+ }
- my @spot = Spot::add($field[1], $field[2], $d, $field[5], $field[6], $field[7]);
+ # add it
+ Spot::add(@spot);
#
# @spot at this point contains:-
next if $dxchan == $me;
# send a pc50 out on this channel
- if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) {
+ if ($t >= $dxchan->{pc50_t} + $DXProt::pc50_interval) {
$dxchan->send(pc50(scalar DXChannel::get_all_users));
- $dxchan->pc50_t($t);
+ $dxchan->{pc50_t} = $t;
}
# send a ping out on this channel
sub disconnect
{
my $self = shift;
- my $nopc39 = shift;
+ my $pc39flag = shift;
my $call = $self->call;
- unless ($nopc39) {
+ unless ($pc39flag && $pc39flag == 1) {
$self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
}
my $mref = DXMsg::get_busy($call);
$mref->stop_msg($call) if $mref;
- # broadcast to all other nodes that all the nodes connected to via me are gone
- foreach my $node (grep { $_->dxchan == $self } DXNode::get_all) {
-# next if $node->call eq $call;
+ # create a list of all the nodes that have gone and delete them from the table
+ my @nodes;
+ foreach my $node (grep { $_->dxchancall eq $call } DXNode::get_all) {
+ next if $node->call eq $call;
next if $node->call eq $main::mycall;
- broadcast_ak1a(pc21($node->call, 'Gone.'), $self) unless $self->{isolate};
+ push @nodes, $node->call;
$node->del;
}
+ # broadcast to all other nodes that all the nodes connected to via me are gone
+ unless ($pc39flag && $pc39flag == 2) {
+ unless ($self->{isolate}) {
+ push @nodes, $call;
+ for (@nodes) {
+ broadcast_ak1a(pc21($_, 'Gone.'), $self);
+ }
+ }
+ }
+
+ # remove this node from the tables
+ my $node = DXCluster->get_exact($call);
+ $node->del if $node;
+
# remove outstanding pings
delete $pings{$call};
- # now broadcast to all other ak1a nodes that I have gone
- broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate};
-
# I was the last node visited
$self->user->node($main::mycall);