X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fcluster.pl;h=16a03037af07781172635925a2b88124c51098d7;hb=c66d28ace3e5bf4b9fa20256425d7d1416e7d8c5;hp=b4cb11c0a898700d842a072e0c0d218e40ee1eac;hpb=9e6f237bf04fc102b519085e171d81b28d418ccb;p=spider.git diff --git a/perl/cluster.pl b/perl/cluster.pl index b4cb11c0..16a03037 100755 --- a/perl/cluster.pl +++ b/perl/cluster.pl @@ -48,7 +48,7 @@ package main; @inqueue = (); # the main input queue, an array of hashes $systime = 0; # the time now (in seconds) -$version = "1.11"; # the version no of the software +$version = "1.13"; # the version no of the software $starttime = 0; # the starting time of the cluster # handle disconnections @@ -59,6 +59,18 @@ sub disconnect $dxchan->disconnect(); } +# send a message to call on conn and disconnect +sub already_conn +{ + my ($conn, $call, $mess) = @_; + + dbg('chan', "-> D $call $mess\n"); + $conn->send_now("D$call|$mess"); + sleep(1); + dbg('chan', "-> Z $call bye\n"); + $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect +} + # handle incoming messages sub rec { @@ -74,34 +86,29 @@ sub rec if (!defined $dxchan) { my ($sort, $call, $line) = $msg =~ /^(\w)(\S+)\|(.*)$/; - # is there one already connected? - if (DXChannel->get($call)) { - my $mess = DXM::msg($lang, 'conother', $call); - dbg('chan', "-> D $call $mess\n"); - $conn->send_now("D$call|$mess"); - sleep(1); - dbg('chan', "-> Z $call bye\n"); - $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect - return; - } - # 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"); - sleep(1); - dbg('chan', "-> Z $call bye\n"); - $conn->send_now("Z$call|bye"); # this will cause 'client' to disconnect - return; + if ($user) { + if (($user->sort eq 'A' || $call == $myalias) && !DXCluster->get_exact($call)) { + ; + } else { + if (DXCluster->get($call) || DXChannel->get($call)) { + my $mess = DXM::msg($lang, $user->sort eq 'A' ? 'concluster' : 'conother', $call); + already_conn($conn, $call, $mess); + return; + } + } + } else { + if (DXCluster->get($call) || DXChannel->get($call)) { + my $mess = DXM::msg($lang, 'conother', $call); + already_conn($conn, $call, $mess); + return; + } } + # the user MAY have an SSID if local, but otherwise doesn't - my $user = DXUser->get($call); + $user = DXUser->get($call); if (!defined $user) { $user = DXUser->new($call); } else { @@ -140,7 +147,7 @@ sub cease { my $dxchan; foreach $dxchan (DXChannel->get_all()) { - disconnect($dxchan); + disconnect($dxchan) unless $dxchan == $DXProt::me; } Log('cluster', "DXSpider V$version stopped"); exit(0);