Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Веб [JSON] Быстрый кэширующийся мониторинг в 4 вариантах

http://prntscr.com/5noa3n
а) Ваш хостинг жалуется, что я использую функцию date()
В свеженькой версии (сегодня-завтра) попытаюсь это исправить
б) Парсер данных, идущих с серверов стал криво работать. Уже смотрю, как переделать его. Буду признателен, если скинете мне в личку айпи Ваших серверов. Для теста.
Что-то пока не выходит выправить мониторинг...


Что насчет моей проблемы?
 
Что насчет моей проблемы?
С проблемой даты разобрался. А про парсинг написал ранее
Что насчет моей проблемы?
Выложил версию с исправлениями.
Осталось только придумать, что делать с парсером
 
@MattRh | IP, Поможешь с дизайном для моего проекта, собераю всё лучшее или хорошо забытое старое для проекта, игроки оценят
 
@MattRh | IP, Поможешь с дизайном для моего проекта, собераю всё лучшее или хорошо забытое старое для проекта, игроки оценят
я не дизайнер
вы читаете, что я пишу?
 
PHP:
$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;
}
Намешал тут разного всякого. Возьмешь себе нужное

Прокомментировать нужно?
 
Последнее редактирование:
PHP:
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']);
if($cache['version']*10 > 16)
   $server += serverNEW($cache['socket'],$server['address']);
else
   $server += serverOLD($cache['socket']);
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) {
    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]
        );
    }

outend($server);
function serverNEW($socket, $address_in) {
    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;
}
    $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'
    );
}
Намешал тут разного всякого. Возьмешь себе нужное

Прокомментировать нужно?
Ухх... Буду разгр****ь все это... Спасибо
Комментарии не нужны. Все читаемо
 
Таки фикс залит. Еще раз спасибо @book777

Список изменений:
1.2:
- Поправлены стили
- Исправлен парсер (спасибо @book777 )
- Исправлена ошибка с тем, что не был установлен часовой пояс
- Переделана файловая система
- Добавлены новые фишечки

Ссылка на скачивание: mon4_v1.2
Извещаю Вас
Так и ничего не получилось :c. Мне ajax понравился, и что сами клиенты делают cron задачу так сказать :D
И Вас извещаю
Пустое место) А туда нечего воткнуть
И Вы приглашены на бал
 

Поделиться этой страницей

Назад
Верх