X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=ecb6cfc638edad38d15fc4b509fb838cc748b595;hb=f7ce6f45eae627c1368ffea0e1e56e84fec676be;hp=64727b8a7d993b3e9ba480ac1871ae780dcaf922;hpb=bca5cd40374f12da5e0d46980e54bffc61fdc9c9;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 64727b8a..ecb6cfc6 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -27,11 +27,9 @@ use Local; use DXDb; use Time::HiRes qw(gettimeofday tv_interval); -use Carp; - use strict; use vars qw($me $pc11_max_age $pc23_max_age $pc11_dup_age $pc23_dup_age - %spotdup %wwvdup $last_hour %pings %rcmds + %spotdup %wwvdup $last_hour %pings %rcmds $pc11duptext %nodehops @baddx $baddxfn $pc12_dup_age %anndup $allowzero $pc12_dup_lth $decode_dk0wcy); @@ -43,6 +41,8 @@ $pc11_dup_age = 3*3600; # the maximum time to keep the spot dup list for $pc23_dup_age = 3*3600; # the maximum time to keep the wwv dup list for $pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for $pc12_dup_lth = 60; # the length of ANN text to save for deduping +$pc11duptext = 20; # maximum lth of the text field in PC11 to use for duduping + %spotdup = (); # the pc11 and 26 dup hash %wwvdup = (); # the pc23 and 27 dup hash %anndup = (); # the PC12 dup hash @@ -72,7 +72,8 @@ sub init @today = Julian::sub(@today, 1); push @spots, Spot::readfile(@today); for (@spots) { - my $dupkey = "$_->[0]$_->[1]$_->[2]$_->[3]$_->[4]"; + my $duptext = length $_->[3] > $pc11duptext ? substr($_->[3], 0, $pc11duptext) : $_->[3] ; + my $dupkey = "$_->[0]$_->[1]$_->[2]$duptext$_->[4]"; $spotdup{$dupkey} = $_->[2]; } @@ -129,19 +130,20 @@ sub start # ping neighbour node stuff my $ping = $user->pingint; $ping = 5*60 unless defined $ping; - $self->pingint($ping); - $self->nopings($user->nopings || 2); - $self->pingtime([ ]); + $self->{pingint} = $ping; + $self->{nopings} = $user->nopings || 2; + $self->{pingtime} = [ ]; + $self->{pingave} = 0; # send initialisation string unless ($self->{outbound}) { $self->send(pc38()) if DXNode->get_all(); $self->send(pc18()); - $self->lastping($main::systime); + $self->{lastping} = $main::systime; } else { # remove from outstanding connects queue @main::outstanding_connects = grep {$_->{call} ne $call} @main::outstanding_connects; - $self->lastping($main::systime + $self->pingint / 2); + $self->{lastping} = $main::systime + $self->pingint / 2; } $self->state('init'); $self->pc50_t(time); @@ -190,7 +192,7 @@ sub normal # is it for me or one of mine? my $call = ($field[5] gt ' ') ? $field[5] : $field[2]; - if ($call eq $main::mycall || grep $_ eq $call, get_all_user_calls()) { + if ($call eq $main::mycall || grep $_ eq $call, DXChannel::get_all_user_calls()) { # yes, it is my $text = unpad($field[3]); @@ -229,6 +231,7 @@ sub normal } # strip off the leading & trailing spaces from the comment + my $duptext = length $field[5] > $pc11duptext ? substr($field[5], 0, $pc11duptext) : $field[5]; my $text = unpad($field[5]); # store it away @@ -656,7 +659,7 @@ sub normal } if ($pcno == 39) { # incoming disconnect - $self->disconnect(); + $self->disconnect(1); return; } @@ -687,7 +690,7 @@ sub normal if ($pcno == 43) { last SWITCH; } - if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47) { + if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47 || $pcno == 48) { DXDb::process($self, $line); return; } @@ -721,18 +724,18 @@ sub normal my $t = tv_interval($r->{t}, [ gettimeofday ]); if ($dxchan->is_user) { my $s = sprintf "%.2f", $t; - my $ave = sprintf "%.2f", $tochan ? ($tochan->pingave || $t) : $t; + my $ave = sprintf "%.2f", $tochan ? ($tochan->{pingave} || $t) : $t; $dxchan->send($dxchan->msg('pingi', $field[2], $s, $ave)) } elsif ($dxchan->is_ak1a) { if ($tochan) { - $tochan->nopings(3); # pump up the timer - push @{$tochan->pingtime}, $t; - shift @{$tochan->pingtime} if @{$tochan->pingtime} > 6; + $tochan->{nopings} = 2; # pump up the timer + push @{$tochan->{pingtime}}, $t; + shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6; my $st; - for (@{$tochan->pingtime}) { + for (@{$tochan->{pingtime}}) { $st += $_; } - $tochan->{pingave} = $st / @{$tochan->pingtime}; + $tochan->{pingave} = $st / @{$tochan->{pingtime}}; } } } @@ -775,18 +778,18 @@ sub process # send a pc50 out on this channel if ($t >= $dxchan->pc50_t + $DXProt::pc50_interval) { - $dxchan->send(pc50()); + $dxchan->send(pc50(scalar DXChannel::get_all_users)); $dxchan->pc50_t($t); } # send a ping out on this channel - if ($dxchan->pingint && $t >= $dxchan->pingint + $dxchan->lastping) { - if ($dxchan->nopings <= 0) { + if ($dxchan->{pingint} && $t >= $dxchan->{pingint} + $dxchan->{lastping}) { + if ($dxchan->{nopings} <= 0) { $dxchan->disconnect; } else { addping($main::mycall, $dxchan->call); - $dxchan->nopings($dxchan->nopings - 1); - $dxchan->lastping($t); + $dxchan->{nopings} -= 1; + $dxchan->{lastping} = $t; } } } @@ -818,9 +821,10 @@ sub finish { my $self = shift; my $call = $self->call; + my $nopc39 = shift; my $ref = DXCluster->get_exact($call); - $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))); + $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op"))) unless $nopc39; # unbusy and stop and outgoing mail my $mref = DXMsg::get_busy($call); @@ -842,6 +846,9 @@ sub finish # now broadcast to all other ak1a nodes that I have gone broadcast_ak1a(pc21($call, 'Gone.'), $self) unless $self->{isolate}; + # I was the last node visited + $self->user->node($main::mycall); + # send info to all logged in thingies $self->tell_login('logoutn');