$last_hour $last10 %eph %pings %rcmds $ann_to_talk
$pingint $obscount %pc19list $chatdupeage $chatimportfn
$investigation_int $pc19_version $myprot_version
- %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck
+ %nodehops $baddx $badspotter $badnode $censorpc
$allowzero $decode_dk0wcy $send_opernam @checklist
$eph_pc15_restime $pc92_update_period $pc92_obs_timeout
%pc92_find $pc92_find_timeout $pc92_short_update_period
$badnode = new DXHash "badnode";
$last10 = $last_pc50 = time;
$ann_to_talk = 1;
-$rspfcheck = 1;
-$eph_restime = 180;
+$eph_restime = 60;
$eph_info_restime = 60*60;
$eph_pc15_restime = 6*60;
$eph_pc34_restime = 30;
}
}
- if (AnnTalk::dup($from, $target, $_[2])) {
+ # the sysop ('*') thing is an attempt to minimise the damage caused by non-updated PC93 generators
+ if (AnnTalk::dup($from, $target, $_[2]) || ($_[3] eq '*' && AnnTalk::dup($from, 'ALL', $_[2]))) {
my $dxchan = DXChannel::get($from);
if ($self == $main::me && $dxchan && $dxchan->is_user) {
if ($dxchan->priv < 5) {
sub chat
{
- goto &announce;
+ my $self = shift;
+ my $line = shift;
+ my $isolate = shift;
+ my $to = shift;
+ my $target = shift;
+ my $text = shift;
+ my ($filter, $hops);
+
+ if ($self->{annfilter}) {
+ ($filter, $hops) = $self->{annfilter}->it(@_);
+ return unless $filter;
+ }
+ if (($self->is_spider || $self->is_ak1a) && $_[1] ne $main::mycall) {
+ send_prot_line($self, $filter, $hops, $isolate, $line);
+ }
}
my $node;
my @rawintcalls = map { $_->nodes } @localnodes if @localnodes;
my @intcalls;
- for $node (@rawintcalls) {
- push @intcalls, $node unless grep $node eq $_, @intcalls;
+ foreach $node (@rawintcalls) {
+ push @intcalls, $node if grep $_ && $node != $_, @intcalls;
}
my $ref = Route::Node::get($self->{call});
my @rnodes = $ref->nodes;
- for $node (@intcalls) {
- push @remotenodes, Route::Node::get($node) unless grep $node eq $_, @rnodes, @remotenodes;
+ foreach $node (@intcalls) {
+ push @remotenodes, Route::Node::get($node) if grep $_ && $node != $_, @rnodes, @remotenodes;
}
$self->send_route($main::mycall, \&pc19, scalar(@remotenodes), @remotenodes);
}
dbg("ROUTE: broadcast_pc92_update $call") if isdbg('obscount');
my $nref = Route::Node::get($call);
+ unless ($nref) {
+ dbg("ERROR: broadcast_pc92_update - Route::Node $call disappeared");
+ return;
+ }
my $l = $nref->last_PC92C(gen_my_pc92_config($nref));
$main::me->broadcast_route_pc9x($main::mycall, undef, $l, 0);
$self->update_pc92_next($pc92_update_period);
my $call = $self->{call};
my $hops;
- if (($hops) = $s =~ /\^H(\d+)\^?~?$/o) {
+ if (($hops) = $s =~ /\^H([-\d]+)\^?~?$/o) {
my ($pcno) = $s =~ /^PC(\d\d)/o;
confess "$call called adjust_hops with '$s'" unless $pcno;
my $ref = $nodehops{$call} if %nodehops;
return "" if defined $newhops && $newhops == 0;
$newhops = $ref->{default} unless $newhops;
return "" if defined $newhops && $newhops == 0;
- $newhops = $hops if !$newhops;
- $s =~ s/\^H(\d+)(\^~?)$/\^H$newhops$2/ if $newhops;
+ $newhops = $hops unless $newhops;
+ return "" unless $newhops > 0;
+ $s =~ s/\^H(\d+)(\^~?)$/\^H$newhops$2/ if $newhops != $hops;
+ } else {
+ return "" unless $hops > 0;
}
}
return $s;
# do routing stuff, remove me from routing table
my $node = Route::Node::get($call);
- my @rout;
- if ($node) {
- @rout = $node->del($main::routeroot);
-
- # and all my ephemera as well
- for (@rout) {
- my $c = $_->call;
- eph_del_regex("^PC1[679].*$c");
- }
- }
RouteDB::delete_interface($call);
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
- unless ($pc39flag && $pc39flag == 2) {
- $self->route_pc21($main::mycall, undef, @rout) if @rout;
- $self->route_pc92d($main::mycall, undef, $main::routeroot, $node) if $node;
- }
-
# remove outstanding pings
delete $pings{$call};
Log('DXProt', $call . " Disconnected");
$self->SUPER::disconnect;
+
+ # here we determine what needs to go out of the routing table
+ my @rout;
+ if ($node) {
+ dbg('%Route::Node::List = ' . join(',', sort keys %Route::Node::list)) if isdbg('routedisc');
+
+ @rout = $node->del($main::routeroot);
+
+ dbg('@rout = ' . join(',', sort map {$_->call} @rout)) if isdbg('routedisc');
+
+ # now we need to see what can't be routed anymore and came
+ # in via this node (probably).
+ my $n = 0;
+ while ($n != @rout) {
+ $n = @rout;
+ for (Route::Node::get_all()) {
+ unless ($_->dxchan) {
+ push @rout, $_->delete;
+ }
+ }
+ dbg('@rout = ' . join(',', sort map {$_->call} @rout)) if isdbg('routedisc');
+ }
+
+ dbg('%Route::Node::List = ' . join(',', sort keys %Route::Node::list)) if isdbg('routedisc');
+
+ # and all my ephemera as well
+ for (@rout) {
+ my $c = $_->call;
+ eph_del_regex("^PC1[679].*$c");
+ }
+ }
+
+ # broadcast to all other nodes that all the nodes connected to via me are gone
+ unless ($pc39flag && $pc39flag == 2) {
+ $self->route_pc21($main::mycall, undef, @rout) if @rout;
+ $self->route_pc92d($main::mycall, undef, $main::routeroot, $node) if $node;
+ }
}
for (; @_ && $no; $no--) {
my $r = shift;
+ # don't send messages with $self's call in back to them
+ if ($r->call eq $self->{call}) {
+ dbg("PCPROT: trying to send $self->{call} back itself") if isdbg('chanerr');
+ next;
+ }
+
if (!$self->{isolate} && $self->{routefilter}) {
$filter = undef;
if ($r) {
next if $origin eq $dxchan->{call}; # don't route some from this call back again.
next unless $dxchan->isa('DXProt');
next if $dxchan->{do_pc9x};
- next if ($generate == \&pc16 || $generate==\&pc17) && !$dxchan->user->wantsendpc16;
-
+ if ($generate == \&pc16 || $generate==\&pc17) {
+ next unless $dxchan->user->wantsendpc16;
+ }
$dxchan->send_route($origin, $generate, @_);
}
}
Log('ann', $target, $main::mycall, $text);
$main::me->normal(DXProt::pc93($target, $main::mycall, $via, $text));
} else {
- $main::me->send_chats($target, $text);
+ DXCommandmode::send_chats($main::me, $target, $text);
}
}
}