$Query->Connect($server->ip, $server->port, 3, SourceQuery::SOURCE);
$Query->SetRconPassword($server->rcon); // Выставляем rcon пароль
$return = $Query->Rcon('status'); // Посылаем команду на сервер
if (!isset($return) or empty($return)) {
throw new Exception('Пустой ответ от сервера');
continue;
}
$return = preg_replace('/[^0-9а-яА-Яa-zA-Z-_,!.:#|\n \[\ \]\ \/\ ()"]/ui', '', $return); // очищаем вывод
$return = explode("\n", trim($return)); // Разбиваем по строкам
$return = array_values(array_filter($return));
serverInfo = [];
// Название сервера
if (strpos($return[0], 'hostname') !== false) {
$serverInfo['name'] = trim(explode(':', $return[0])[1]);// Название сервера
}
// Версия, токен, VAC
if (strpos($return[1], 'version') !== false) {
$versionRow = explode(':', $return[1]);
$tokenRow = explode('[', $versionRow[1]);
$serverInfo['version'] = intval(preg_replace('/[^0-9]/', '', trim(explode('/', $versionRow[1])[0]))); // Версия сервера
$serverInfo['gslt'] = (end($tokenRow) == 'G') ? 1 : 0; // Есть ли токен
$serverInfo['secure'] = (strpos($tokenRow[0], 'secure') !== false) ? 1 : 0; // Включен ли VAC
}
// OS сервера
if (strpos($return[3], 'os') !== false) {
$serverInfo['os'] = trim(explode(':', $return[3])[1]);
}
// Карта
if (strpos($return[5], 'map') !== false) {
$serverInfo['map'] = preg_replace(array('(workshop/.*./)', '(/.*./)'), '', strtolower(trim(explode(':', $return[5])[1])));
if (empty($serverInfo['map'])) $serverInfo['map'] = NULL;
}
// GOTV
$serverInfo['gotv'] = (strpos($return[6], 'gotv') !== false) ? 1 : 0;
// Информация о количестве игроков
$offset = ($serverInfo['gotv'] == 1) ? 7 : 6;
if (strpos($return[$offset], 'players') !== false) {
$playersRow = trim(explode(':', $return[$offset])[1]);
$botsRow = explode('bots', $playersRow);
$maxplayersRow = explode('(', $botsRow[1])[1];
$botsRow = explode(', ', $botsRow[0]);
$serverInfo['bots'] = intval(end( $botsRow ));
$serverInfo['players'] = intval(trim(explode('humans', $playersRow)[0]));
$serverInfo['maxplayers'] = intval(explode('/', $maxplayersRow)[0]) - $serverInfo['bots'];
}
// Массив с игроками сервера
$offset = (strpos($return[7], 'userid') == true) ? 8 : 9;
$players = array_slice($return, $offset, -1);
foreach ($players as $player) {
// Разбиваем строку
$playerChunkID = trim(explode('"', $player)[0]);
$rowPlayer = explode('"', $player);
$playerChunkInfo = array_values(
array_filter(
explode(' ', trim(end( $rowPlayer )))
)
);
if ($playerChunkInfo[0] == 'BOT') continue; // Пропускаем, если это бот
$playerSteamID = $playerChunkInfo[0]; // SteamID
if ($playerSteamID == 0) continue; // Пропускаем, если нет стимд
$playerInfo[$playerSteamID]['name'] = $rowPlayer[1]; // Имя игрока на сервере
$playerInfo[$playerSteamID]['id'] = intval(explode(' ', $playerChunkID)[1]); // ID игрока на сервере
// Время на сервере
$time_to_unix = explode(':', $playerChunkInfo[1]);
if (count($time_to_unix) == 3) {
$playerInfo[$playerSteamID]['server-time'] = ($time_to_unix[0] * 60 * 60) + ($time_to_unix[1] * 60) + $time_to_unix[2];
} else {
$playerInfo[$playerSteamID]['server-time'] = ($time_to_unix[0] * 60) + $time_to_unix[1];
}
$ipChunk = isset($playerChunkInfo[6]) ? 6 : 5;
$playerInfo[$playerSteamID]['ip'] = explode(':', $playerChunkInfo[$ipChunk])[0];
}