#!/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 ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
.: Game :.     $gamename
.: Map :.     $mapname
.: Type :.     $gametype
.: Address :.     204.112.131.22
"; print "
"; print ""; if ($#p_names <= -1) { print "
No players currently playing on $sv_hostname."; } else { foreach $player (@p_names) { print ""; } } print "
.: Player Name :. .: Frags :. .: Ping :.
$player $p_frags{$player} $p_ping{$player}
";