1. Incorporated sh/st, (un)set/lockout, forward/opername from Iain G0RDI
[spider.git] / perl / cluster.pl
index 666f4f87fd0b59d0b167b297f3ef11cbec3d454c..e343cc0b4175ad56f83be0abc41acc975f54056b 100755 (executable)
@@ -48,7 +48,7 @@ package main;
 
 @inqueue = ();                                 # the main input queue, an array of hashes
 $systime = 0;                                  # the time now (in seconds)
-$version = 1.5;                                        # the version no of the software
+$version = "1.10";                             # the version no of the software
 $starttime = 0;                 # the starting time of the cluster   
  
 # handle disconnections
@@ -85,8 +85,12 @@ sub rec
                        return;
                }
                
-               # is there one already connected elsewhere in the cluster?
-               if (DXCluster->get($call)) {
+               # is there one already connected elsewhere in the cluster (and not a cluster)
+               my $user = DXUser->get($call);
+               if ($user && $user->sort eq 'A' && !DXCluster->get_exact($call)) {
+                       ;
+               } elsif (($call eq $main::myalias && DXCluster->get_exact($call)) ||
+                   DXCluster->get($call)) {
                        my $mess = DXM::msg($lang, 'concluster', $call);
                        dbg('chan', "-> D $call $mess\n"); 
                        $conn->send_now("D$call|$mess");
@@ -96,6 +100,7 @@ sub rec
                        return;
                }
                
+               # the user MAY have an SSID if local, but otherwise doesn't
                my $user = DXUser->get($call);
                if (!defined $user) {
                        $user = DXUser->new($call);
@@ -103,7 +108,13 @@ sub rec
                        $user->{lang} = $main::lang if !$user->{lang}; # to autoupdate old systems
                }
                
-               
+               # is he locked out ?
+               if ($user->lockout) {
+                       Log('DXCommand', "$call is locked out, disconnected");
+                       $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect
+                       return;
+               }
+
                # create the channel
                $dxchan = DXCommandmode->new($call, $conn, $user) if ($user->sort eq 'U');
                $dxchan = DXProt->new($call, $conn, $user) if ($user->sort eq 'A');