Показать сообщение отдельно
Непрочитано 20.09.2012, 14:12   #4
Аватар для Ashe
Олдфаг

По умолчанию Re: Онлайн по соккету

Но это для PTS.

<?  
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]; 
      $c['cur']=$c['cur']+24; 
      $file = fopen("online.txt", "w"); 
        fwrite($file, $c['cur']); 
        fclose($file); 
      } 
      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='%c';  
$offline='%c';  
echo $status->GetText(7,$online,$offline); 
?>
Code: PHP
__________________
Fortuna - non penis, in manus non recipe.
Ashe вне форума Ответить с цитированием
Сказали спасибо: