#!/usr/bin/perl
use Socket;
use CGI qw(:standard);
my($remote,$port,$iaddr,$paddr,$proto,$q3aquery);
my($result);
my($gamename,$mapname,$gametype,%p_frags,%p_ping,$p_name,@p_names,$frags,$ping);
my($sv_hostname,@f_result,$line);
$remote = "204.112.131.22";
$port = "27960";
$q3aquery = "\377\377\377\377getstatus\n";
$iaddr = inet_aton($remote) || die "no host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname("udp");
socket(SOCK, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
connect(SOCK, $paddr) || die "connect: $!";
send(SOCK, $q3aquery, 0) || die "send: $!";
recv(SOCK, $result, 2048, 0);
($gamename) = $result =~ m/gamename\\(.*?)\\/i;
($mapname) = $result =~ m/mapname\\(.*?)\\/i;
($gametype) = $result =~ m/g_gametype\\(\d)\\/i;
($sv_hostname) = $result =~ m/sv_hostname\\(.*?)\\/i;
@f_result = split /\n/, $result;
foreach $line (@f_result) {
if (($frags, ,$ping, $p_name) = $line =~ m/^(\d+|-\d+)\s(\d+)\s"(.*?)"/i) {
$p_name =~ s/\^\d//g;
$p_frags{$p_name} = $frags;
$p_ping{$p_name} = $ping;
push @p_names, $p_name;
}
}
print "Content=type:text/html\n\n";
print qq!
Quake3Arena
!;
print "
";
print "| Host: $sv_hostname Status |
";
print "";
print "| .: Game :. | ";
print " $gamename | ";
print "
";
print "| .: Map :. | ";
print " $mapname | ";
print "
";
print "| .: Type :. | ";
print " $gametype | ";
print "
";
print "| .: Address :. | ";
print " 204.112.131.22 | ";
print "
";
print "
";
print "| .: Player Name :. |
.: Frags :. |
.: Ping :. | ";
if ($#p_names <= -1) {
print "
No players currently playing on $sv_hostname.";
} else {
foreach $player (@p_names) {
print "
| $player |
$p_frags{$player} |
$p_ping{$player} |
";
}
}
print "
";