Thursday, October 14, 2010

Source engine query with php

?php
function source_query($ip)
{
    //set timeout in ms
    $timeout = "1";
    $cut = explode(":", $ip);
    $HL2_address = $cut[0];
    $HL2_port = $cut[1];

    $HL2_command = "\377\377\377\377TSource Engine Query\0";

    $HL2_socket = fsockopen("udp://" . $HL2_address, $HL2_port, $errno, $errstr, 3);
    fwrite($HL2_socket, $HL2_command);
 socket_set_timeout($HL2_socket,$timeout);
    $JunkHead = fread($HL2_socket, 4);
    $CheckStatus = socket_get_status($HL2_socket);
 //print_r($CheckStatus);
 
    if ($CheckStatus["unread_bytes"] == 0)
        return 0;
 if ($CheckStatus['timed_out'] == 1) {
  return 0;
 }
    $do = 1;
    while ($do) {
        $str = fread($HL2_socket, 1);
        $HL2_stats .= $str;
        $status = socket_get_status($HL2_socket);
        if ($status["unread_bytes"] == 0) {
            $do = 0;
        }
    }
    fclose($HL2_socket);

    $x = 0;
    while ($x <= strlen($HL2_stats)) {
        $x++;
        $result .= substr($HL2_stats, $x, 1);
    }

    // ord ( string $string );
    $result = str_split($result);
    $info['network'] = ord($result[0]);
    $char = 1;
    while (ord($result[$char]) != "") {
        $info['name'] .= $result[$char];
        $char++;
    }
    $char++;
    while (ord($result[$char]) != "") {
        $info['map'] .= $result[$char];
        $char++;
    }
    $char++;
    while (ord($result[$char]) != "") {
        $info['dir'] .= $result[$char];
        $char++;
    }
    $char++;
    while (ord($result[$char]) != "") {
        $info['description'] .= $result[$char];
        $char++;
    }
    $char++;
    $info['appid'] = ord($result[$char] . $result[($char + 1)]);
    $char += 2;
    $info['players'] = ord($result[$char]);
    $char++;
    $info['max'] = ord($result[$char]);
    $char++;
    $info['bots'] = ord($result[$char]);
    $char++;
    $info['dedicated'] = ord($result[$char]);
    $char++;
    $info['os'] = chr(ord($result[$char]));
    $char++;
    $info['password'] = ord($result[$char]);
    $char++;
    $info['secure'] = ord($result[$char]);
    $char++;
    while (ord($result[$char]) != "") {
        $info['version'] .= $result[$char];
        $char++;
    }

    return $info;
}
?

This will allow you to query any source game server like CSS TF2 and GarrysMod for it's information like players, map, OS and many more from a webpage.

No comments:

Post a Comment