[SCRIPT] Cтатус сервера от хинта

Тема в разделе "Веб скрипты (WEB)", создана пользователем root, 30 сен 2014.

  1. root

    root Administrator Команда форума Administrator Moderator Developers Team

    Регистрация:
    23 авг 2014
    Сообщения:
    253
    Симпатии:
    56
    Баллы:
    11
    Код:
    <?php //by Hint (27.06.2008) 
    class ServerStatus 
    { 
       private $ip, $port, $interval, $timeout; 
    
    
       public function __construct($ip = '127.0.0.1', $port = 2106, $interval = 30, $timeout = 1) 
       { 
          $this->ip = $ip; 
          $this->port = $port; 
          $this->interval = $interval; 
          $this->timeout = $timeout; 
       } 
    
    
       public function GetStatusFromAuth() 
       { 
          $status = array(); 
          $f = @fsockopen($this->ip, $this->port, $errno, $errstr, $this->timeout); 
          if ($f) 
          { 
             do 
             { 
                $sec = floor($this->timeout); 
                $msec = ($this->timeout - $sec) * 1000; 
                socket_set_timeout($f, $sec, $msec); 
    
    
                $buf = fread($f, 2); 
                if (strlen($buf) != 2) break; 
                $a = unpack('vsize', $buf); 
                $size = $a['size'] - 2; 
                if ($size < 1) break; 
    
    
                $buf = fread($f, $size); 
                if (strlen($buf) != $size) break; 
    
    
                fwrite($f, "\x03\x00\xFE", 3); 
    
    
                $buf = fread($f, 2); 
                if (strlen($buf) != 2) break; 
                $a = unpack('vsize', $buf); 
                $size = $a['size'] - 2; 
                if ($size < 1) break; 
    
    
                $buf = fread($f, $size); 
                if (strlen($buf) != $size) break; 
    
    
                if (ord($buf[0]) != 0xFE) break; 
                if (strlen($buf) < 3) break; 
                $amount = ord($buf[1]) + ord($buf[2]) * 256; 
                $buf = substr($buf, 3); 
                if (strlen($buf) != $amount * 4) break; 
                $a = unpack('v' . ($amount * 2), $buf); 
                for ($i = 0; $i < $amount; $i++) $status[$a[$i * 2 + 1]] = $a[$i * 2 + 2]; 
             } 
             while (false); 
             fclose ($f); 
          } 
          return $status; 
       } 
    
    
       public function GetStatus() 
       { 
          $fn = dirname(__FILE__) . '/status.txt'; 
          $status = array(); 
          fclose(fopen($fn, 'a+b')); 
          $f = @fopen($fn, 'r+b'); 
          if ($f) 
          { 
             flock($f, LOCK_EX); 
             $cache = unserialize(fread($f, 1024)); 
             $status = @$cache['status']; 
             $time = @$cache['time']; 
             if (!IsSet($status) || !IsSet($time)) 
             { 
                $status = array(); 
                $time = 0; 
             } 
             if (time() - $time > $this->interval) 
             { 
                $new = $this->GetStatusFromAuth(); 
                foreach ($status as $id => $value) 
                { 
                   $c = &$status[$id]; 
                   $c['on'] = false; 
                   $c['cur'] = 0; 
                } 
                foreach ($new as $id => $value) 
                { 
                   if (!IsSet($status[$id])) $status[$id] = array('on' => false, 'cur' => 0, 'max' => 0); 
                   $c = &$status[$id]; 
                   $c['on'] = true; 
                   $c['cur'] = $new[$id]; 
                   if ($c['cur'] > $c['max']) $c['max'] = $c['cur']; 
                } 
                $cache = array('status' => $status, 'time' => time()); 
                $s = serialize($cache); 
                rewind($f); 
                ftruncate($f, 0); 
                fwrite($f, $s, strlen($s)); 
             } 
             fclose($f); 
          } 
          return $status; 
       } 
    
    
       public function GetText($id, $online, $offline) 
       { 
          $status = $this->GetStatus(); 
          if (IsSet($status[$id])) $c = &$status[$id]; else $c = array('on' => false, 'cur' => 0, 'max' => 0); 
          $res = str_replace(array('%c', '%m'), array($c['cur'], $c['max']), $c['on'] ? $online : $offline); 
          return $res; 
       } 
    } 
    
    
    $status = new ServerStatus('127.0.0.1'); 
    $online = 'Status: <b><font color="#00AA00">online</font></b> | Players: <b>%c</b> | Record: <b>%m</b>'; 
    $offline = 'Status: <b><font color="#FF0000">offline</font></b> | Players: <b>%c</b> | Record: <b>%m</b>'; 
    echo $status->GetText(1, $online, $offline); //1 - ServerID 
    ?>