X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=65b666a2fed8a5315e4b641ec1527314bb0e98ef;hb=27b6e9691f9985830388bbb8fc0a04357fa4f11f;hp=5580a2bee408fb954168a7ef6d4dc410683c0a30;hpb=5b3c2c5e342c23fbab96b7573c5963344617878f;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 5580a2be..65b666a2 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -37,14 +37,17 @@ use Investigate; use RouteDB; use Thingy; use Thingy::Dx; +use Thingy::Rt; +use Thingy::Ping; +use Thingy::T; +use Thingy::Hello; +use Thingy::Bye; use strict; use vars qw($VERSION $BRANCH); -$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); -$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); -$main::build += $VERSION; -$main::branch += $BRANCH; + +main::mkver($VERSION = q$Revision$); use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk @@ -220,7 +223,7 @@ sub init $main::me->{metric} = 0; $main::me->{pingave} = 0; $main::me->{registered} = 1; - $main::me->{version} = 5251 + $main::version; + $main::me->{version} = 5252 + $main::version; $main::me->{build} = $main::build; } @@ -236,7 +239,11 @@ sub new my $pkg = shift; my $call = shift; $main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall; - + if ($self->{call} ne $main::mycall) { + my $thing = Thingy::Hello->new(user=>$call); + $thing->broadcast($self); + } + return $self; } @@ -306,6 +313,9 @@ sub start $self->state('init'); $self->{pc50_t} = $main::systime; + my $thing = Thingy::Hello->new(origin=>$main::mycall, user=>$call); + $thing->broadcast($self); + # send info to all logged in thingies $self->tell_login('loginn'); @@ -431,8 +441,8 @@ sub handle_10 # RouteDB::update($to, $_[6]); # it is here and logged on - $dxchan = DXChannel->get($main::myalias) if $to eq $main::mycall; - $dxchan = DXChannel->get($to) unless $dxchan; + $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]); @@ -504,7 +514,7 @@ sub handle_11 } # is it 'baddx' - if ($baddx->in($_[2]) || BadWords::check($_[2]) || $_[2] =~ /COCK/) { + if ($baddx->in($_[2]) || BadWords::check($_[2])) { dbg("PCPROT: Bad DX spot, ignored") if isdbg('chanerr'); return; } @@ -530,9 +540,9 @@ sub handle_11 my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $_[6], $_[7]); - my $thing = Thingy::Dx->new(origin=>$main::mycall, group=>'DX'); + my $thing = Thingy::Dx->new(origin=>$main::mycall); $thing->from_DXProt(DXProt=>$line,spotdata=>\@spot); - $thing->queue($self); + $thing->process($self); # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup @@ -590,20 +600,6 @@ sub handle_11 } } } - - # local processing - my $r; - eval { - $r = Local::spot($self, @spot); - }; - # dbg("Local::spot1 error $@") if isdbg('local') if $@; - return if $r; - - # DON'T be silly and send on PC26s! - return if $pcno == 26; - - # send out the filtered spots -# send_dx_spot($self, $line, @spot) if @spot; } # announces @@ -644,7 +640,7 @@ sub handle_12 my $dxchan; - if ((($dxchan = DXChannel->get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){ + if ((($dxchan = DXChannel::get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){ $self->send_chat($line, @_[1..6]); } elsif ($_[2] eq '*' || $_[2] eq $main::mycall) { @@ -704,14 +700,14 @@ sub handle_16 return; } - RouteDB::update($ncall, $origin); + RouteDB::update($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -751,16 +747,16 @@ sub handle_16 $parent = Route::Node::get($_->[0]); $dxchan = $parent->dxchan if $parent; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC19 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC19 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); $parent = undef; } - if ($parent) { + if ($parent) { my $r = $parent->add($ncall, $_->[1], $_->[2]); push @nrout, $r unless @nrout; } } $user->wantroutepc19(1) unless defined $wantpc19; # for now we work on the basis that pc16 = real route - $user->lastin($main::systime) unless DXChannel->get($ncall); + $user->lastin($main::systime) unless DXChannel::get($ncall); $user->put; # route the pc19 - this will cause 'stuttering PC19s' for a while @@ -780,25 +776,25 @@ sub handle_16 return; } } else { - + $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC16 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC16 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } # input filter if required return unless $self->in_filter_route($parent); } - - my $i; + + my $i; my @rout; - for ($i = 2; $i < $#_; $i++) { - my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o; - next unless $call && $conf && defined $here && is_callsign($call); - next if $call eq $main::mycall; - - eph_del_regex("^PC17\\^$call\\^$ncall"); + for ($i = 2; $i < $#_; $i++) { + my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o; + next unless $call && $conf && defined $here && is_callsign($call); + next if $call eq $main::mycall; + + eph_del_regex("^PC17\\^$call\\^$ncall"); $conf = $conf eq '*'; @@ -809,18 +805,18 @@ sub handle_16 dbg("PCPROT: $call is a node") if isdbg('chanerr'); next; } - + $r = Route::User::get($call); my $flags = Route::here($here)|Route::conf($conf); - + if ($r) { my $au = $r->addparent($parent); if ($r->flags != $flags) { $r->flags($flags); $au = $r; - } + } push @rout, $r if $au; - } else { + } else { push @rout, $parent->add_user($call, $flags); } @@ -831,7 +827,7 @@ sub handle_16 $user = DXUser->new($call) if !$user; $user->homenode($parent->call) if !$user->homenode; $user->node($parent->call); - $user->lastin($main::systime) unless DXChannel->get($call); + $user->lastin($main::systime) unless DXChannel::get($call); $user->put; } $self->route_pc16($origin, $line, $parent, @rout) if @rout; @@ -852,7 +848,7 @@ sub handle_17 # do I want users from this channel? unless ($self->user->wantpc16) { - dbg("PCPROT: don't send users to $origin") if isdbg('chanerr'); + dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr'); return; } if ($ncall eq $main::mycall) { @@ -860,14 +856,14 @@ sub handle_17 return; } - RouteDB::delete($ncall, $origin); + RouteDB::delete($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -883,7 +879,7 @@ sub handle_17 $dxchan = $parent->dxchan if $parent; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC17 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } @@ -997,7 +993,7 @@ sub handle_19 next if $call eq $main::mycall; # check that this PC19 isn't trying to alter the wrong dxchan - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan && $dxchan != $self) { dbg("PCPROT: PC19 from $origin trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr'); next; @@ -1079,7 +1075,7 @@ sub handle_19 my $mref = DXMsg::get_busy($call); $mref->stop_msg($call) if $mref; - $user->lastin($main::systime) unless DXChannel->get($call); + $user->lastin($main::systime) unless DXChannel::get($call); $user->put; } @@ -1098,6 +1094,9 @@ sub handle_20 $self->send(pc22()); $self->state('normal'); $self->{lastping} = 0; + my $thing = Thingy::Rt->new_cf(user=>$self->{call}); + my $nref = Route::Node::get($self->{call}); + $thing->broadcast if $thing->copy_pc16_data($nref); } # delete a cluster from the list @@ -1148,7 +1147,7 @@ sub handle_21 my $node = Route::Node::get($call); if ($node) { - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan && $dxchan != $self) { dbg("PCPROT: PC21 from $origin trying to alter locally connected $call, ignored!") if isdbg('chanerr'); return; @@ -1178,6 +1177,9 @@ sub handle_22 my $origin = shift; $self->state('normal'); $self->{lastping} = 0; + my $thing = Thingy::Rt->new_cf(user=>$self->{call}); + my $nref = Route::Node::get($self->{call}); + $thing->broadcast if $thing->copy_pc16_data($nref); } # WWV info @@ -1530,10 +1532,10 @@ sub handle_51 # it's a reply, look in the ping list for this one my $ref = $pings{$from}; if ($ref) { - my $tochan = DXChannel->get($from); + my $tochan = DXChannel::get($from); while (@$ref) { my $r = shift @$ref; - my $dxchan = DXChannel->get($r->{call}); + my $dxchan = DXChannel::get($r->{call}); next unless $dxchan; my $t = tv_interval($r->{t}, [ gettimeofday ]); if ($dxchan->is_user) { @@ -1681,7 +1683,7 @@ sub handle_default sub process { my $t = time; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $pc50s; @@ -1738,36 +1740,6 @@ sub process # -sub send_dx_spot -{ - my $self = shift; - my $line = shift; - my @dxchan = DXChannel->get_all(); - my $dxchan; - - # send it if it isn't the except list and isn't isolated and still has a hop count - # taking into account filtering and so on - foreach $dxchan (@dxchan) { - next if $dxchan == $main::me; - next if $dxchan == $self && $self->is_node; - $dxchan->dx_spot($line, $self->{isolate}, @_, $self->{call}); - } -} - -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) = @_; @@ -1793,7 +1765,7 @@ sub send_wwv_spot { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my @dxcc = ((Prefix::cty_data($_[6]))[0..2], (Prefix::cty_data($_[7]))[0..2]); @@ -1827,7 +1799,7 @@ sub send_wcy_spot { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my @dxcc = ((Prefix::cty_data($_[10]))[0..2], (Prefix::cty_data($_[11]))[0..2]); @@ -1860,7 +1832,7 @@ sub send_announce { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $target; my $to = 'To '; @@ -1925,7 +1897,7 @@ sub send_chat { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $target = $_[3]; my $text = unpad($_[2]); @@ -2021,7 +1993,7 @@ sub send_local_config # don't appear outside of this node # send locally connected nodes - my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes(); + my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && ($_->is_node || $_->is_aranea) } DXChannel::get_all(); @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan; $self->send_route($main::mycall, \&pc19, scalar(@localnodes)+1, $main::routeroot, @localnodes); @@ -2066,7 +2038,7 @@ sub route } # always send it down the local interface if available - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan) { dbg("route: $call -> $dxchan->{call} direct" ) if isdbg('route'); } else { @@ -2089,7 +2061,7 @@ sub route dbg("PCPROT: Trying to route back to source, dropped") if isdbg('chanerr'); return; } - $dxchan = DXChannel->get($rcall); + $dxchan = DXChannel::get($rcall); dbg("route: $call -> $rcall using RouteDB" ) if isdbg('route') && $dxchan; } } @@ -2170,7 +2142,7 @@ sub addping my $r = {}; $r->{call} = $from; $r->{t} = [ gettimeofday ]; - if ($via && (my $dxchan = DXChannel->get($via))) { + if ($via && (my $dxchan = DXChannel::get($via))) { $dxchan->send(pc51($to, $main::mycall, 1)); } else { route(undef, $to, pc51($to, $main::mycall, 1)); @@ -2222,13 +2194,13 @@ sub process_rcmd_reply if ($tonode eq $main::mycall) { my $s = $rcmds{$fromnode}; if ($s) { - my $dxchan = DXChannel->get($s->{call}); - my $ref = $user eq $tonode ? $dxchan : (DXChannel->get($user) || $dxchan); + my $dxchan = DXChannel::get($s->{call}); + my $ref = $user eq $tonode ? $dxchan : (DXChannel::get($user) || $dxchan); $ref->send($line) if $ref; delete $rcmds{$fromnode} if !$dxchan; } else { # send unsolicited ones to the sysop - my $dxchan = DXChannel->get($main::myalias); + my $dxchan = DXChannel::get($main::myalias); $dxchan->send($line) if $dxchan; } } else { @@ -2328,6 +2300,9 @@ sub disconnect # broadcast to all other nodes that all the nodes connected to via me are gone unless ($pc39flag && $pc39flag == 2) { + my $thing = Thingy::Bye->new(user=>$call); + $thing->broadcast($self); + $self->route_pc21($main::mycall, undef, @rout) if @rout; }