]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/BZFlag.pl
* Add vim formatting comments ( # vim:ts=4:sw=4:expandtab:tw=80 )
[infobot.git] / src / Modules / BZFlag.pl
index 33538af2434f5fd3a56fd3c59c85836133c364de..ef988c48a9fabe265795f0cf78a639759233e944 100755 (executable)
@@ -44,7 +44,7 @@ sub BZFlag {
 sub list {
        my ($response);
        my $ua = new LWP::UserAgent;
-       $ua->proxy('http', $::param{'httpProxy'}) if (&::IsParam("httpProxy"));
+       $ua->proxy('http', $::param{'httpProxy'}) if (&::IsParam('httpProxy'));
 
        $ua->timeout(5);
 
@@ -58,11 +58,11 @@ sub list {
                my ($style, $maxShots, $shakeWins, $shakeTimeout, $maxPlayerScore, $maxTeamScore, $maxTime,
                                $maxPlayers, $rogueSize, $rogueMax, $redSize, $redMax, $greenSize, $greenMax,
                                $blueSize, $blueMax, $purpleSize, $purpleMax, $observerSize, $observerMax) =
-                               unpack("A4A4A4A4A4A4A4A2A2A2A2A2A2A2A2A2A2A2A2A2", $flags);
+                               unpack('A4A4A4A4A4A4A4A2A2A2A2A2A2A2A2A2A2A2A2A2', $flags);
                my $playerSize = hex($rogueSize) + hex($redSize) + hex($greenSize)
                                + hex($blueSize) + hex($purpleSize) + hex($observerSize);
                $servers{$serverport} = $playerSize;
-         $servers{$version} += $playerSize;
+               $servers{$version} += $playerSize;
                $servers{'PLAYERS'} += $playerSize;
                $totalServers += 1;
        }
@@ -79,7 +79,7 @@ sub list {
 sub list17 {
        my ($response);
        my $ua = new LWP::UserAgent;
-       $ua->proxy('http', $::param{'httpProxy'}) if (&::IsParam("httpProxy"));
+       $ua->proxy('http', $::param{'httpProxy'}) if (&::IsParam('httpProxy'));
 
        $ua->timeout(5);
 
@@ -96,7 +96,7 @@ sub list17 {
                                $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax,
                                $shakeWins,$shakeTimeout,
                                $maxPlayerScore,$maxTeamScore,$maxTime) =
-                               unpack("A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4", $flags);
+                               unpack('A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4', $flags);
                my $playerSize = hex($rogueSize) + hex($redSize) + hex($greenSize)
                                + hex($blueSize) + hex($purpleSize);
                $servers{$serverport} = $playerSize;
@@ -120,8 +120,8 @@ sub querytext {
                &::status("BZFlag module requires Socket.");
                return 'BZFlag module not active';
        }
-       #my @teamName = ("Rogue", "Red", "Green", "Blue", "Purple", "Observer", "Rabbit");
-       my @teamName = ("X", "R", "G", "B", "P", "O", "K");
+       #my @teamName = ('Rogue', 'Red', 'Green', 'Blue', 'Purple', 'Observer', 'Rabbit');
+       my @teamName = ('X', 'R', 'G', 'B', 'P', 'O', 'K');
        my ($message, $server, $response);
        $port = 5154 unless $port;
 
@@ -130,7 +130,7 @@ sub querytext {
 
        # port to port number
        my ($name,$aliases,$proto) = getprotobyname('tcp');
-       ($name,$aliases,$port)  = getservbyname($port,'tcp') unless $port =~ /^\d+$/;
+       ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/;
 
        # get server address
        my ($type,$len,$serveraddr);
@@ -151,36 +151,48 @@ sub querytext {
 
        # parse reply
        my ($magic,$major,$minor,$something,$revision) = unpack("a4 a1 a1 a1 a1", $buffer);
-  my ($version) = $magic . $major . $minor . $something . $revision;
+       my ($version) = $magic . $major . $minor . $something . $revision;
 
        # quit if version isn't valid
-       return 'not a bzflag server' if ($magic ne "BZFS");
+       return 'not a bzflag server' if ($magic ne 'BZFS');
        $response .= "$major$minor$something$revision ";
        # check version
-       if ($version eq "BZFS0026") {
+       if ($version eq 'BZFS0026') {
                # 1.11.x handled here
                return 'read error' unless read(S1, $buffer, 1) == 1;
-               my ($id) = unpack("C", $buffer);
-    return "rejected by server" if ($id == 255);
+               my ($id) = unpack('C', $buffer);
+               return "rejected by server" if ($id == 255);
 
                # send game request
-               print S1 pack("n2", 0, 0x7167);
+               print S1 pack('n2', 0, 0x7167);
 
                # get reply
-               return 'server read error' unless read(S1, $buffer, 46) == 46;
-    my ($infolen,$infocode,$style,$maxPlayers,$maxShots,
+               my $nbytes = read(S1, $buffer, 4);
+               my ($infolen, $infocode) = unpack('n2', $buffer);
+               if ($infocode == 0x6774) {
+                       # read and ignore MsgGameTime from new servers
+                       $nbytes = read(S1, $buffer, 8);
+                       $nbytes = read(S1, $buffer, 4);
+                 ($infolen, $infocode) = unpack('n2', $buffer);
+               }
+               $nbytes = read(S1, $buffer, 42);
+               if ($nbytes != 42) {
+                       return "Error: read $nbytes bytes, expecting 46: $^E\n";
+               }
+
+               my ($style,$maxPlayers,$maxShots,
                        $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize,$observerSize,
                        $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax,$observerMax,
                        $shakeWins,$shakeTimeout,
-                       $maxPlayerScore,$maxTeamScore,$maxTime,$timeElapsed) = unpack("n23", $buffer);
+                       $maxPlayerScore,$maxTeamScore,$maxTime,$timeElapsed) = unpack('n23', $buffer);
                return "bad server data $infocode" unless $infocode == 0x7167;
 
                # send players request
-               print S1 pack("n2", 0, 0x7170);
+               print S1 pack('n2', 0, 0x7170);
 
                # get number of teams and players we'll be receiving
                return 'count read error' unless read(S1, $buffer, 8) == 8;
-               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack("n4", $buffer);
+               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack('n4', $buffer);
 
                # get the teams
                return 'bad count data' unless $countcode == 0x7170;
@@ -188,7 +200,7 @@ sub querytext {
                ($countlen,$countcode,$numTeams) = unpack("n n C", $buffer);
                for (1..$numTeams) {
                        return 'team read error' unless read(S1, $buffer, 8) == 8;
-                       my ($team,$size,$won,$lost) = unpack("n4", $buffer);
+                       my ($team,$size,$won,$lost) = unpack('n4', $buffer);
                        if ($size > 0) {
                                my $score = $won - $lost;
                                $response .= "$teamName[$team]:$score($won-$lost) ";
@@ -199,7 +211,7 @@ sub querytext {
                for (1..$numPlayers) {
                        last unless read(S1, $buffer, 175) == 175;
                        my ($playerlen,$playercode,$pID,$type,$team,$won,$lost,$tks,$sign,$email) =
-                                       unpack("n2Cn5A32A128", $buffer);
+                                       unpack('n2Cn5A32A128', $buffer);
                        #my ($playerlen,$playercode,$pAddr,$pPort,$pNum,$type,$team,$won,$lost,$sign,$email) =
                        #               unpack("n2Nn2 n4A32A128", $buffer);
                        return 'bad player data' unless $playercode == 0x6170;
@@ -215,10 +227,10 @@ sub querytext {
                # 1.10.x handled here
                $revision = $something * 10 + $revision;
                return 'read error' unless read(S1, $buffer, 1) == 1;
-               my ($id) = unpack("C", $buffer);
+               my ($id) = unpack('C', $buffer);
 
                # send game request
-               print S1 pack("n2", 0, 0x7167);
+               print S1 pack('n2', 0, 0x7167);
 
                # FIXME the packets are wrong from here down
                # get reply
@@ -227,15 +239,15 @@ sub querytext {
                        $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize,
                        $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax,
                        $shakeWins,$shakeTimeout,
-                       $maxPlayerScore,$maxTeamScore,$maxTime) = unpack("n20", $buffer);
+                       $maxPlayerScore,$maxTeamScore,$maxTime) = unpack('n20', $buffer);
                return 'bad server data' unless $infocode == 0x7167;
 
                # send players request
-               print S1 pack("n2", 0, 0x7170);
+               print S1 pack('n2', 0, 0x7170);
 
                # get number of teams and players we'll be receiving
                return 'count read error' unless read(S1, $buffer, 8) == 8;
-               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack("n4", $buffer);
+               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack('n4', $buffer);
 
                # get the teams
                return 'bad count data' unless $countcode == 0x7170;
@@ -243,7 +255,7 @@ sub querytext {
                ($countlen,$countcode,$numTeams) = unpack("n n C", $buffer);
                for (1..$numTeams) {
                        return 'team read error' unless read(S1, $buffer, 8) == 8;
-                       my ($team,$size,$won,$lost) = unpack("n4", $buffer);
+                       my ($team,$size,$won,$lost) = unpack('n4', $buffer);
                        if ($size > 0) {
                                my $score = $won - $lost;
                                $response .= "$teamName[$team]:$score($won-$lost) ";
@@ -254,7 +266,7 @@ sub querytext {
                for (1..$numPlayers) {
                        last unless read(S1, $buffer, 175) == 175;
                        my ($playerlen,$playercode,$pID,$type,$team,$won,$lost,$tks,$sign,$email) =
-                                       unpack("n2Cn5A32A128", $buffer);
+                                       unpack('n2Cn5A32A128', $buffer);
                        #my ($playerlen,$playercode,$pAddr,$pPort,$pNum,$type,$team,$won,$lost,$sign,$email) =
                        #               unpack("n2Nn2 n4A32A128", $buffer);
                        return 'bad player data' unless $playercode == 0x6170;
@@ -268,10 +280,10 @@ sub querytext {
                # close socket
                close(S1);
        } elsif ($major == 1 && $minor == 0 && $something == 7) {
-    # 1.7* versions handled here
+               # 1.7* versions handled here
                # old servers send a reconnect port number
                return 'read error' unless read(S1, $buffer, 2) == 2;
-               my ($reconnect) = unpack("n", $buffer);
+               my ($reconnect) = unpack('n', $buffer);
                $minor = $minor * 10 + $something;
                # quit if rejected
                return 'rejected by server' if ($reconnect == 0);
@@ -286,7 +298,7 @@ sub querytext {
                close(S1);
 
                # send game request
-               print S pack("n2", 0, 0x7167);
+               print S pack('n2', 0, 0x7167);
 
                # get reply
                return 'server read error' unless read(S, $buffer, 40) == 40;
@@ -294,21 +306,21 @@ sub querytext {
                        $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize,
                        $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax,
                        $shakeWins,$shakeTimeout,
-                       $maxPlayerScore,$maxTeamScore,$maxTime) = unpack("n20", $buffer);
+                       $maxPlayerScore,$maxTeamScore,$maxTime) = unpack('n20', $buffer);
                return 'bad server data' unless $infocode == 0x7167;
 
                # send players request
-               print S pack("n2", 0, 0x7170);
+               print S pack('n2', 0, 0x7170);
 
                # get number of teams and players we'll be receiving
                return 'count read error' unless read(S, $buffer, 8) == 8;
-               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack("n4", $buffer);
+               my ($countlen,$countcode,$numTeams,$numPlayers) = unpack('n4', $buffer);
                return 'bad count data' unless $countcode == 0x7170;
 
                # get the teams
                for (1..$numTeams) {
                        return 'team read error' unless read(S, $buffer, 14) == 14;
-                       my ($teamlen,$teamcode,$team,$size,$aSize,$won,$lost) = unpack("n7", $buffer);
+                       my ($teamlen,$teamcode,$team,$size,$aSize,$won,$lost) = unpack('n7', $buffer);
                        return 'bad team data' unless $teamcode == 0x7475;
                        if ($size > 0) {
                                my $score = $won - $lost;
@@ -345,4 +357,5 @@ sub query {
 }
 
 1;
-# vim: ts=2 sw=2
+
+# vim:ts=4:sw=4:expandtab:tw=80