BZFlag-Info
view release on metacpan or search on metacpan
package BZFlag::Info;
use 5.006001;
use strict;
use warnings;
use LWP::UserAgent;
use Socket;
our $VERSION = '1.9.2';
sub new {
my $self = { };
bless $self, "BZFlag::Info";
return $self;
}
sub serverlist(%) {
my $self = shift;
my %options;
while (my @option = splice(@_, 0, 2)) {
$options{$option[0]} = $option[1];
}
my $proxy = $options{Proxy};
my $response;
my $ua = new LWP::UserAgent;
$ua->proxy('http', $proxy) if defined($proxy);
$ua->timeout(10);
my $req = HTTP::Request->new('GET', ($options{Server} ? $options{Server} : $self->listserver));
my $res = $ua->request($req);
my $totalServers = 0;
my $totalPlayers = 0;
for my $line (split("\n",$res->content)) {
my ($serverport, $version, $flags, $ip, $description) = split(" ",$line,5);
my @fields = ('style','maxShots','shakeWins','shakeTimeout','maxPlayerScore',
'maxTeamScore','maxTime','maxPlayers','rogueSize','rogueMax','redSize',
'redMax','greenSize','greenMax','blueSize','blueMax','purpleSize',
'purpleMax','observerSize','observerMax'
);
my @info = unpack("(A4)7 (A2)13", $flags);
my $counter = 0;
my %info;
foreach (@fields) {
$info{$_} = oct('0x'.$info[$counter]);
$counter++;
}
my $playerSize = $info{rogueSize} + $info{redSize} + $info{greenSize}
+ $info{blueSize} + $info{purpleSize} + $info{observerSize};
unless ($serverport =~ m/.*:\d+/) {
$serverport = "$serverport:5154";
}
$response->{servers}->{$serverport}->{version} = $version;
$response->{servers}->{$serverport}->{ip} = $ip;
$response->{servers}->{$serverport}->{description} = $description;
$response->{servers}->{$serverport}->{numplayers} = $playerSize;
$response->{servers}->{$serverport}->{roguesize} = $info{rogueSize};
$response->{servers}->{$serverport}->{redsize} = $info{redSize};
$response->{servers}->{$serverport}->{greensize} = $info{greenSize};
$response->{servers}->{$serverport}->{bluesize} = $info{blueSize};
$response->{servers}->{$serverport}->{purplesize} = $info{purpleSize};
$response->{servers}->{$serverport}->{observersize} = $info{observerSize};
$response->{servers}->{$serverport}->{serverconfig}->{style} = $self->parsestyle($info{style});
$response->{servers}->{$serverport}->{serverconfig}->{maxshots} = $info{maxShots};
$response->{servers}->{$serverport}->{serverconfig}->{shakewins} = $info{shakeWins};
$response->{servers}->{$serverport}->{serverconfig}->{shaketimeout} = $info{shakeTimeout} / 10;
$response->{servers}->{$serverport}->{serverconfig}->{maxplayerscore} = $info{maxPlayerScore};
$response->{servers}->{$serverport}->{serverconfig}->{maxteamscore} = $info{maxTeamScore};
$response->{servers}->{$serverport}->{serverconfig}->{maxtime} = $info{maxTime};
$response->{servers}->{$serverport}->{serverconfig}->{maxplayers} = $info{maxPlayers};
$response->{servers}->{$serverport}->{serverconfig}->{roguemax} = $info{rogueMax};
$response->{servers}->{$serverport}->{serverconfig}->{redmax} = $info{redMax};
$response->{servers}->{$serverport}->{serverconfig}->{greenmax} = $info{greenMax};
$response->{servers}->{$serverport}->{serverconfig}->{bluemax} = $info{blueMax};
$response->{servers}->{$serverport}->{serverconfig}->{purplemax} = $info{purpleMax};
$response->{servers}->{$serverport}->{serverconfig}->{observermax} = $info{observerMax};
$totalServers += 1;
$totalPlayers += $playerSize;
}
$response->{totalservers} = $totalServers;
( run in 1.713 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )