X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=966f0eefb0d88f4a5f4d7d8a105329542deef3df;hb=3e075e9d00d74fd477c44db2b29eb3eac9d6d88a;hp=fb6ba02a66dc8e1a805f7e23ecfdd68706e692a6;hpb=e514a048764b07970b03e490b560de73c2489902;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index fb6ba02a..966f0eef 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -316,7 +316,8 @@ sub normal } else { $call = $to = $field[2]; } - $dxchan = DXChannel->get($call); + $dxchan = DXChannel->get($main::myalias) if $call eq $main::mycall; + $dxchan = DXChannel->get($call) unless $dxchan; if ($dxchan && $dxchan->is_user) { $field[3] =~ s/\%5E/^/g; $dxchan->talk($field[1], $to, $via, $field[3]); @@ -421,7 +422,7 @@ sub normal my $node; my $to = $user->homenode; my $last = $user->lastoper || 0; - if ($send_opernam && $main::systime > $last + $DXUser::lastoperinterval && $to && ($node = Route::Node::get($to)) ) { + if ($to ne $main::mycall && $send_opernam && $main::systime > $last + $DXUser::lastoperinterval && $to && ($node = Route::Node::get($to)) ) { my $cmd = "forward/opernam $spot[4]"; # send the rcmd but we aren't interested in the replies... my $dxchan = $node->dxchan; @@ -554,15 +555,20 @@ sub normal for ($i = 2; $i < $#field; $i++) { my ($call, $conf, $here) = $field[$i] =~ /^(\S+) (\S) (\d)/o; next unless $call && $conf && defined $here && is_callsign($call); + next if $call eq $main::mycall; + $conf = $conf eq '*'; 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) { + if ($r) { + if ($r->flags != $flags) { + $r->flags($flags); + push @rout, $r; + } + $r->addparent($ncall); + } else { push @rout, $parent->add_user($call, $flags); } @@ -630,6 +636,11 @@ sub normal # new routing list my @rout; my $parent = Route::Node::get($self->{call}); + unless ($parent) { + dbg("DXPROT: my parent $self->{call} has disappeared"); + $self->disconnect; + return; + } # parse the PC19 for ($i = 1; $i < $#field-1; $i += 4) { @@ -642,6 +653,7 @@ sub normal $ver = 5000 if $ver eq '0000'; next if $ver < 5000; # only works with version 5 software next if length $call < 3; # min 3 letter callsigns + next if $call eq $main::mycall; # update it if required my $r = Route::Node::get($call); @@ -662,7 +674,10 @@ sub normal push @rout, $r unless $ar; } } else { - next if $call eq $main::mycall || $call eq $self->{call}; + if ($call eq $self->{call}) { + dbg("DXPROT: my channel route for $call has disappeared"); + next; + }; my $new = Route->new($call); # throw away if ($self->in_filter_route($new)) { @@ -707,7 +722,8 @@ sub normal my @rout; my $parent = Route::Node::get($self->{call}); unless ($parent) { - dbg("PCPROT: Route::Node $call not in config") if isdbg('chanerr'); + dbg("DXPROT: my parent $self->{call} has disappeared"); + $self->disconnect; return; } my $node = Route::Node::get($call); @@ -1198,41 +1214,45 @@ sub send_dx_spot # taking into account filtering and so on foreach $dxchan (@dxchan) { next if $dxchan == $me; - my $routeit; - my ($filter, $hops); + next if $dxchan == $self; + $dxchan->dx_spot($line, $self->{isolate}, @_, $self->{call}); + } +} - if ($dxchan->{spotsfilter}) { - ($filter, $hops) = $dxchan->{spotsfilter}->it(@_, $self->{call} ); - next unless $filter; - } - - if ($dxchan->is_node) { - next if $dxchan == $self; - if ($hops) { - $routeit = $line; - $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; - } else { - $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - next unless $routeit; - } - if ($filter) { - $dxchan->send($routeit) if $routeit; - } else { - $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; - } - } elsif ($dxchan->is_user && $dxchan->{dx}) { - my $buf = Spot::formatb($dxchan->{user}->wantgrid, $_[0], $_[1], $_[2], $_[3], $_[4]); - $buf .= "\a\a" if $dxchan->{beep}; - $buf =~ s/\%5E/^/g; - if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { - $dxchan->send($buf); - } else { - $dxchan->delay($buf); - } - } +sub dx_spot +{ + my $self = shift; + my $line = shift; + my $isolate = shift; + my ($filter, $hops); + + if ($self->{spotsfilter}) { + ($filter, $hops) = $self->{spotsfilter}->it(@_); + return unless $filter; + } + send_prot_line($self, $filter, $hops, $isolate, $line) +} + +sub send_prot_line +{ + my ($self, $filter, $hops, $isolate, $line) = @_; + my $routeit; + + if ($hops) { + $routeit = $line; + $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; + } else { + $routeit = adjust_hops($self, $line); # adjust its hop count by node name + next unless $routeit; + } + if ($filter) { + $self->send($routeit) if $routeit; + } else { + $self->send($routeit) unless $self->{isolate} || $isolate; } } + sub send_wwv_spot { my $self = shift; @@ -1261,34 +1281,23 @@ sub send_wwv_spot my $routeit; my ($filter, $hops); - if ($dxchan->{wwvfilter}) { - ($filter, $hops) = $dxchan->{wwvfilter}->it(@_, $self->{call}, $wwv_dxcc, $wwv_itu, $wwv_cq, $org_dxcc, $org_itu, $org_cq); - next unless $filter; - } - if ($dxchan->is_node) { - if ($hops) { - $routeit = $line; - $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; - } else { - $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - next unless $routeit; - } - if ($filter) { - $dxchan->send($routeit) if $routeit; - } else { - $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; - - } - } elsif ($dxchan->is_user && $dxchan->{wwv}) { - my $buf = "WWV de $_[6] <$_[1]>: SFI=$_[2], A=$_[3], K=$_[4], $_[5]"; - $buf .= "\a\a" if $dxchan->{beep}; - if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { - $dxchan->send($buf); - } else { - $dxchan->delay($buf); - } - } + $dxchan->wwv($line, $self->{isolate}, @_, $self->{call}, $wwv_dxcc, $wwv_itu, $wwv_cq, $org_dxcc, $org_itu, $org_cq); } + +} + +sub wwv +{ + my $self = shift; + my $line = shift; + my $isolate = shift; + my ($filter, $hops); + + if ($self->{wwvfilter}) { + ($filter, $hops) = $self->{wwvfilter}->it(@_); + return unless $filter; + } + send_prot_line($self, $filter, $hops, $isolate, $line) } sub send_wcy_spot @@ -1315,36 +1324,24 @@ sub send_wcy_spot # taking into account filtering and so on foreach $dxchan (@dxchan) { next if $dxchan == $me; - my $routeit; - my ($filter, $hops); + next if $dxchan == $self; - if ($dxchan->{wcyfilter}) { - ($filter, $hops) = $dxchan->{wcyfilter}->it(@_, $self->{call}, $wcy_dxcc, $wcy_itu, $wcy_cq, $org_dxcc, $org_itu, $org_cq); - next unless $filter; - } - if ($dxchan->is_clx || $dxchan->is_spider || $dxchan->is_dxnet) { - if ($hops) { - $routeit = $line; - $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; - } else { - $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - next unless $routeit; - } - if ($filter) { - $dxchan->send($routeit) if $routeit; - } else { - $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; - } - } elsif ($dxchan->is_user && $dxchan->{wcy}) { - my $buf = "WCY de $_[10] <$_[1]> : K=$_[4] expK=$_[5] A=$_[3] R=$_[6] SFI=$_[2] SA=$_[7] GMF=$_[8] Au=$_[9]"; - $buf .= "\a\a" if $dxchan->{beep}; - if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { - $dxchan->send($buf); - } else { - $dxchan->delay($buf); - } - } + $dxchan->wcy($line, $self->{isolate}, @_, $self->{call}, $wcy_dxcc, $wcy_itu, $wcy_cq, $org_dxcc, $org_itu, $org_cq); + } +} + +sub wcy +{ + my $self = shift; + my $line = shift; + my $isolate = shift; + my ($filter, $hops); + + if ($self->{wcyfilter}) { + ($filter, $hops) = $self->{wcyfilter}->it(@_); + return unless $filter; } + send_prot_line($self, $filter, $hops, $isolate, $line) if $self->is_clx || $self->is_spider || $self->is_dxnet; } # send an announce @@ -1354,9 +1351,9 @@ sub send_announce my $line = shift; my @dxchan = DXChannel->get_all(); my $dxchan; - my $text = unpad($_[2]); my $target; my $to = 'To '; + my $text = unpad($_[2]); if ($_[3] eq '*') { # sysops $target = "SYSOP"; @@ -1396,41 +1393,27 @@ sub send_announce my $routeit; my ($filter, $hops); - if ($dxchan->{annfilter}) { - ($filter, $hops) = $dxchan->{annfilter}->it(@_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq); - next unless $filter; - } - if ($dxchan->is_node && $_[1] ne $main::mycall) { # i.e not specifically routed to me - if ($hops) { - $routeit = $line; - $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/; - } else { - $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - next unless $routeit; - } - if ($filter) { - $dxchan->send($routeit) if $routeit; - } else { - $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate}; - - } - } elsif ($dxchan->is_user) { - unless ($dxchan->{ann}) { - next if $_[0] ne $main::myalias && $_[0] ne $main::mycall; - } - next if $target eq 'SYSOP' && $dxchan->{priv} < 5; - my $buf = "$to$target de $_[0]: $text"; - $buf =~ s/\%5E/^/g; - $buf .= "\a\a" if $dxchan->{beep}; - if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { - $dxchan->send($buf); - } else { - $dxchan->delay($buf); - } - } + $dxchan->announce($line, $self->{isolate}, $to, $target, $text, @_, $self->{call}, $ann_dxcc, $ann_itu, $ann_cq, $org_dxcc, $org_itu, $org_cq) + } +} + +sub announce +{ + my $self = shift; + my $line = shift; + my $isolate = shift; + my $to = shift; + my $target = shift; + my ($filter, $hops); + + if ($self->{annfilter}) { + ($filter, $hops) = $self->{annfilter}->it(@_); + return unless $filter; } + send_prot_line($self, $filter, $hops, $isolate, $line) unless $_[1] eq $main::mycall; } + sub send_local_config { my $self = shift; @@ -1500,7 +1483,7 @@ sub route if ($dxchan) { my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name if ($routeit) { - $dxchan->send($routeit); + $dxchan->send($routeit) unless $dxchan == $me; } } else { dbg("PCPROT: No route available, dropped") if isdbg('chanerr'); @@ -1678,10 +1661,10 @@ sub addrcmd $r->{t} = $main::systime; $r->{cmd} = $cmd; $rcmds{$to} = $r; - + my $ref = Route::Node::get($to); my $dxchan = $ref->dxchan; - if ($dxchan && $dxchan->is_clx) { + if ($dxchan && $dxchan->is_clx) { route(undef, $to, pc84($main::mycall, $to, $self->{call}, $cmd)); } else { route(undef, $to, pc34($main::mycall, $to, $cmd));