$server['address'] = '';
$cache['thetime'] = microtime(true);
if(!$cache['socket'] = @fsockopen($server['address'], 25565, $errno, $errstr, $config['out'])) {
if(ping($cache['thetime']) >= $config['out'] * 1000)
outend(array('error' => 'TIMEOUT'));
else
outend(array('error' => 'OFF', 'ping' => ping($cache['thetime'])));
}
$server['ping'] = ping($cache['thetime']);
@stream_set_timeout($cache['socket'], $config['out']);
$cache['version'] = preg_replace('~[^\d\.]+~', '', $dbm['version']);// тут берет захешированные данные из БД и определяет версию от 1.7 и до
if($cache['version']*10 > 16)
$server += serverNEW($cache['socket'],$server['address']);
else
$server += serverOLD($cache['socket']);
outend($server);
function outend($out) {
ksort($out);
echo json_encode($out);
@mysql_close($db['connect']);
exit;
}
function ping($ping) {// Вывести пинг
return round((microtime(true)-$ping)*1000);
}
function serverOLD($in) {// Работает под обычные ядра (но без игроков и favicon)
fwrite($in, "\xFE\x01");
$data = fread($in, 512);
$Len = strlen($data);
if($Len < 4 || $data[0] !== "\xFF") {
return array('error' => 'UNKNOWN_ERROR');
}
$data = substr($data, 3);
$data = iconv('UTF-16BE', 'UTF-8', $data);
if($data [1] === "\xA7" && $data[2] === "\x31") {
$data = explode("\x00", $data);
return array(
'motd' => motd($data[3]),
'player_online' => intval($data[4]),
'player_max' => intval($data[5]),
'percent' => @floor((intval($data[4])/intval($data[5]))*100),
'version' => $data[2]
);
}
$data = explode("\xA7", $data);
return array(
'motd' => motd(substr($data[0], 0, -1)),
'player_online' => isset($data[1]) ? intval($data[1]) : 0,
'player_max' => isset($data[2]) ? intval($data[2]) : 0,
'percent' => @floor((intval($data[1])/intval($data[2]))*100),
'version' => 'UNKNOWN'
);
}
function serverNEW($socket, $address_in) {// Новая версия с favicon и игроками
if(preg_match('/:/', $adres))
list($address, $port) = explode(':', $adres);
else {
$address = $address_in;
$port = 25565;
}
$data = "\x00\x04".Pack('c', StrLen($address)).$address.Pack('n', $port)."\x01";
$data = pack('c',StrLen($data)).$data;
fwrite($socket, $data);
fwrite($socket, "\x01\x00");
$Length = readvarint($socket);
if($Length<10) {
return array('error' => 'VERSION<1.7');
}
fgetc($socket);
$Length = readvarint($socket);
$data='';
do {
$Remainder = $Length - StrLen( $data );
$block = fread( $socket, $Remainder );
if(!$block) return array('error' => 'UNKNOWN_ERROR');# SMALL RETURN
$data .= $block;
}
while(StrLen($data)<$Length);
if($data===FALSE) return array('error' => 'UNKNOWN_ERROR');# RETURN NOT CORRECT
$data = JSON_Decode($data,true);
if(JSON_Last_Error()!==JSON_ERROR_NONE) {
return array('error' => 'UNKNOWN_ERROR');# DECRYPT ERROR
}
$out['player_max'] = $data['players']['max'];
$out['motd'] = motd($data['description']);
$out['player_online'] = $data['players']['online'];
$out['percent'] = @floor(($out['player_online']/$out['player_max'])*100);
$out['version'] = $data['version']['name'];
if($data['players']['sample']) {
foreach($data['players']['sample'] as $ii)
$out['player_name'] .= $ii['name'].', ';
$out['player_name'] = substr($out['player_name'],0,-1);
}
$out['favicon'] = str_replace("\n","",$data['favicon']);
return $out;
}
function readvarint($asds) {// Дешифратор для новых версий
$i = 0;
$j = 0;
while(true) {
$k=@fgetc($asds);
if($k === '') return 0;
$k = ord($k);
$i |= ($k&0x7F) << $j ++ * 7;
if($j>5) return array('error' => 'UNKNOWN_ERROR');# BIG ARRAY
if(($k&0x80)!=128) break;
}
return $i;
}