$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) {
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);
# 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;
+ }
}
foreach my $text (@msg) {
next unless $text && $text !~ /^\s*#/;
- if ($target eq 'ALL' || $target eq 'LOCAL' || $target eq 'SYSOP') {
- my $sysopflag = $target eq 'SYSOP' ? '*' : ' ';
- if ($target ne 'LOCAL') {
- send_announce($main::me, pc12($main::mycall, $text, '*', $sysopflag), $main::mycall, '*', $text, $sysopflag, $main::mycall, '0');
- } else {
- Log('ann', 'LOCAL', $main::mycall, $text);
- DXChannel::broadcast_list("To LOCAL de ${main::mycall}: $text\a", 'ann', undef, DXCommandmode->get_all());
- }
+ if ($target eq 'ALL' || $target eq 'LOCAL' || $target eq 'SYSOP' || $target eq 'WX') {
+ my $sysop = uc $target eq 'SYSOP' ? '*' : ' ';
+ my $wx = uc $target eq 'WX' ? '1' : '0';
+ my $via = $target;
+ $via = '*' if $target eq 'ALL' || $target eq 'SYSOP';
+ Log('ann', $target, $main::mycall, $text);
+ $main::me->normal(DXProt::pc93($target, $main::mycall, $via, $text));
} else {
- my $msgid = nextchatmsgid();
- $text = "#$msgid $text";
- send_chat($main::me, pc12($main::mycall, $text, '*', $target), $main::mycall, '*', $text, $target, $main::mycall, '0');
+ DXCommandmode::send_chats($main::me, $target, $text);
}
}
}