X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=b4d80ab09957fccdea84ccceeaa7d5ef077a587e;hb=dcb4f4b5aa1d99180127681af8996fff1160922c;hp=d55e15e362ecec7b5e83d8f5cac7ee563d548019;hpb=05bed9a172a48255aff58f64ab01df58a4d87891;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index d55e15e3..b4d80ab0 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -4,7 +4,7 @@ # # Copyright (c) 1998-2006 Dirk Koopman G1TLH # -# $Id$ +# # package DXProt; @@ -107,40 +107,6 @@ sub handle_10 # convert this to a PC93 and process it as such $self->normal(pc93($to, $from, $via, $_[3], $_[6])); - return; - - # this is all redundant but kept for now for reference - - # it is here and logged on - $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall; - $dxchan = DXChannel::get($to) unless $dxchan; - if ($dxchan && $dxchan->is_user) { - $_[3] =~ s/\%5E/^/g; - $dxchan->talk($from, $to, $via, $_[3]); - return; - } - - # is it elsewhere, visible on the cluster via the to address? - # note: this discards the via unless the to address is on - # the via address - my ($ref, $vref); - if ($ref = Route::get($to)) { - $vref = Route::Node::get($via) if $via; - $vref = undef unless $vref && grep $to eq $_, $vref->users; - $ref->dxchan->talk($from, $to, $vref ? $via : undef, $_[3], $_[6]); - return; - } - - # can we see an interface to send it down? - - # not visible here, send a message of condolence - $vref = undef; - $ref = Route::get($from); - $vref = $ref = Route::Node::get($_[6]) unless $ref; - if ($ref) { - $dxchan = $ref->dxchan; - $dxchan->talk($main::mycall, $from, $vref ? $vref->call : undef, $dxchan->msg('talknh', $to) ); - } } # DX Spot handling @@ -495,18 +461,17 @@ sub handle_16 push @rout, @ans if $h && @ans; } - # send info to all logged in thingies - $self->tell_login('loginu', "$ncall: $call") if DXUser->get_current($ncall)->is_local_node; - $self->tell_buddies('loginb', $call, $ncall); - # add this station to the user database, if required -# $call =~ s/-\d+$//o; # remove ssid for users - my $user = DXUser->get_current($call); - $user = DXUser->new($call) if !$user; + my $user = DXUser->get_current($ncall); + $user = DXUser->new($call) unless $user; $user->homenode($parent->call) if !$user->homenode; $user->node($parent->call); $user->lastin($main::systime) unless DXChannel::get($call); $user->put; + + # send info to all logged in thingies + $self->tell_login('loginu', "$ncall: $call") if $user->is_local_node; + $self->tell_buddies('loginb', $call, $ncall); } if (@rout) { $self->route_pc16($origin, $line, $parent, @rout) if @rout; @@ -574,7 +539,8 @@ sub handle_17 $parent->del_user($uref); # send info to all logged in thingies - $self->tell_login('logoutu', "$ncall: $ucall") if DXUser->get_current($ncall)->is_local_node; + my $user = DXUser->get_current($ncall); + $self->tell_login('logoutu', "$ncall: $ucall") if $user && $user->is_local_node; $self->tell_buddies('logoutb', $ucall, $ncall); if (eph_dup($line)) { @@ -1587,8 +1553,13 @@ sub handle_92 # reparent to external node (note that we must have received a 'C' or 'A' record # from the true parent node for this external before we get one for the this node unless ($parent = Route::Node::get($call)) { - dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); - return; + if ($is_extnode && $oparent) { + @radd = _add_thingy($oparent, $ent[0]); + $parent = $radd[0]; + } else { + dbg("PCPROT: no previous C or A for this external node received, ignored") if isdbg('chanerr'); + return; + } } $parent = check_pc9x_t($call, $t, 92) || return; $parent->via_pc92(1); @@ -1628,10 +1599,12 @@ sub handle_92 # we only reset obscounts on config records $oparent->reset_obs; - dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('route'); + $oparent->PC92C_dxchan($self->{call}) unless $self->{call} eq $oparent->call; + dbg("ROUTE: reset obscount on $pcall now " . $oparent->obscount) if isdbg('obscount'); if ($oparent != $parent) { $parent->reset_obs; - dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('route'); + $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call; + dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('obscount'); } # @@ -1723,6 +1696,11 @@ sub handle_93 } } + # this is catch loops caused by bad software ... + if (eph_dup("PC93|$from|$text|$onode")) { + return; + } + # if this is a 'bad spotter' user then ignore it my $nossid = $from; $nossid =~ s/-\d+$//; @@ -1788,9 +1766,7 @@ sub handle_default my $line = shift; my $origin = shift; - if (eph_dup($line)) { - dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr'); - } else { + unless (eph_dup($line)) { if ($pcno >= 90) { my $pcall = $_[1]; unless (is_callsign($pcall)) {