get all the debugging finally into the debug files when things go wrong
[spider.git] / perl / DXProt.pm
index 64727b8a7d993b3e9ba480ac1871ae780dcaf922..256eb9c76235c141d1810b423e744f5b55670739 100644 (file)
@@ -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 = 27;                             # 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
@@ -79,7 +79,8 @@ sub init
        # now prime the wwv duplicates file with just this month's data
        my @wwv = Geomag::readfile(time);
        for (@wwv) {
-               my $dupkey = "$_->[1].$_->[2]$_->[3]$_->[4]";
+               my $duptext = substr $_->[3], 0, $pc11duptext;
+               my $dupkey = "$_->[1].$_->[2]$duptext$_->[4]";
                $wwvdup{$dupkey} = $_->[1];
        }
 
@@ -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]);
@@ -237,7 +239,8 @@ sub normal
                        
                        # do some de-duping
                        my $freq = $field[1] - 0;
-                       my $dupkey = "$freq$field[2]$d$text$spotter";
+                       my $duptext = substr $text, 0, $pc11duptext;
+                       my $dupkey = "$freq$field[2]$d$duptext$spotter";
                        if ($spotdup{$dupkey}) {
                                dbg('chan', "Duplicate Spot ignored\n");
                                return;
@@ -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');