Facebook
From a.pvp, 9 Years ago, written in PHP.
Embed
Download Paste or View Raw
Hits: 756
  1. <?php
  2.  
  3. class SampQueryAPI
  4. {
  5.  
  6.         private $rSocket = false;
  7.         private $aServer = array();
  8.        
  9.  
  10.         public function __construct($sServer, $iPort = 7777)
  11.         {
  12.                 $this->aServer[0] = $sServer;
  13.                 $this->aServer[1] = $iPort;
  14.                 $this->rSocket = fsockopen('udp://'.$this->aServer[0], $this->aServer[1], $iError, $sError, 2);
  15.                 if(!$this->rSocket)
  16.                 {
  17.                         $this->aServer[4] = false;
  18.                         return;
  19.                 }
  20.                
  21.                 socket_set_timeout($this->rSocket, 2);
  22.                
  23.                 $sPacket = 'SAMP';
  24.                 $sPacket .= chr(strtok($this->aServer[0], '.'));
  25.                 $sPacket .= chr(strtok('.'));
  26.                 $sPacket .= chr(strtok('.'));
  27.                 $sPacket .= chr(strtok('.'));
  28.                 $sPacket .= chr($this->aServer[1] & 0xFF);
  29.                 $sPacket .= chr($this->aServer[1] >> 8 & 0xFF);
  30.                 $sPacket .= 'p4150';
  31.                
  32.                 fwrite($this->rSocket, $sPacket);
  33.                
  34.                 if(fread($this->rSocket, 10))
  35.                 {
  36.                         if(fread($this->rSocket, 5) == 'p4150')
  37.                         {
  38.                                 $this->aServer[4] = true;
  39.                                 return;
  40.                         }
  41.                 }
  42.                
  43.                 $this->aServer[4] = false;
  44.         }
  45.        
  46.  
  47.         public function __destruct()
  48.         {
  49.                 @fclose($this->rSocket);
  50.         }
  51.        
  52.         public function isOnline()
  53.         {
  54.                 return isset($this->aServer[4]) ? $this->aServer[4] : false;
  55.         }
  56.        
  57.         public function getInfo()
  58.         {
  59.                 @fwrite($this->rSocket, $this->createPacket('i'));
  60.                
  61.                 fread($this->rSocket, 11);
  62.        
  63.                 $aDetails['password'] = (integer) ord(fread($this->rSocket, 1));
  64.                
  65.                 $aDetails['players'] = (integer) $this->toInteger(fread($this->rSocket, 2));
  66.                
  67.                 $aDetails['maxplayers'] = (integer) $this->toInteger(fread($this->rSocket, 2));
  68.                
  69.                 $iStrlen = ord(fread($this->rSocket, 4));
  70.                 if(!$iStrlen) return -1;
  71.                
  72.                 $aDetails['hostname'] = (string) fread($this->rSocket, $iStrlen);
  73.                
  74.                 $iStrlen = ord(fread($this->rSocket, 4));
  75.                 $aDetails['gamemode'] = (string) fread($this->rSocket, $iStrlen);
  76.                
  77.                 $iStrlen = ord(fread($this->rSocket, 4));
  78.                 $aDetails['mapname'] = (string) fread($this->rSocket, $iStrlen);
  79.                
  80.                 return $aDetails;
  81.         }
  82.        
  83.         public function getBasicPlayers()
  84.         {
  85.                 @fwrite($this->rSocket, $this->createPacket('c'));
  86.                 fread($this->rSocket, 11);
  87.                
  88.                 $iPlayerCount = ord(fread($this->rSocket, 2));
  89.                 $aDetails = array();
  90.                
  91.                 if($iPlayerCount > 0)
  92.                 {
  93.                         for($iIndex = 0; $iIndex < $iPlayerCount; ++$iIndex)
  94.                         {
  95.                                 $iStrlen = ord(fread($this->rSocket, 1));
  96.                                 $aDetails[] = array
  97.                                 (
  98.                                         "nickname" => (string) fread($this->rSocket, $iStrlen),
  99.                                         "score" => (integer) $this->toInteger(fread($this->rSocket, 4)),
  100.                                 );
  101.                         }
  102.                 }
  103.                
  104.                 return $aDetails;
  105.         }
  106.        
  107.         public function getDetailedPlayers()
  108.         {
  109.                 @fwrite($this->rSocket, $this->createPacket('d'));
  110.                 fread($this->rSocket, 11);
  111.        
  112.                 $iPlayerCount = ord(fread($this->rSocket, 2));
  113.                 $aDetails = array();
  114.                
  115.                 for($iIndex = 0; $iIndex < $iPlayerCount; ++$iIndex)
  116.                 {
  117.                         $aPlayer['playerid'] = (integer) ord(fread($this->rSocket, 1));
  118.                        
  119.                         $iStrlen = ord(fread($this->rSocket, 1));
  120.                         $aPlayer['nickname'] = (string) fread($this->rSocket, $iStrlen);
  121.                        
  122.                         $aPlayer['score'] = (integer) $this->toInteger(fread($this->rSocket, 4));
  123.                         $aPlayer['ping'] = (integer) $this->toInteger(fread($this->rSocket, 4));
  124.                        
  125.                         $aDetails[] = $aPlayer;
  126.                         unset($aPlayer);
  127.                 }
  128.                
  129.                 return $aDetails;
  130.         }
  131.  
  132.         public function getRules()
  133.         {
  134.                 @fwrite($this->rSocket, $this->createPacket('r'));
  135.                 fread($this->rSocket, 11);
  136.                
  137.                 $iRuleCount = ord(fread($this->rSocket, 2));
  138.                 $aReturn = array();
  139.                
  140.                 for($iIndex = 0; $iIndex < $iRuleCount; ++$iIndex)
  141.                 {
  142.                         $iStrlen = ord(fread($this->rSocket, 1));
  143.                         $sRulename = (string) fread($this->rSocket, $iStrlen);
  144.                        
  145.                         $iStrlen = ord(fread($this->rSocket, 1));
  146.                         $aDetails[$sRulename] = (string) fread($this->rSocket, $iStrlen);
  147.                 }
  148.                
  149.                 return $aDetails;
  150.         }
  151.        
  152.         private function toInteger($sData)
  153.         {
  154.                 if($sData === "")
  155.                 {
  156.                         return null;
  157.                 }
  158.                
  159.                 $iInteger = 0;
  160.                 $iInteger += (ord($sData[0]));
  161.  
  162.                 if(isset($sData[1]))
  163.                 {
  164.                         $iInteger += (ord($sData[1]) << 8);
  165.                 }
  166.                
  167.                 if(isset($sData[2]))
  168.                 {
  169.                         $iInteger += (ord($sData[2]) << 16);
  170.                 }
  171.                
  172.                 if(isset($sData[3]))
  173.                 {
  174.                         $iInteger += (ord($sData[3]) << 24);
  175.                 }
  176.                
  177.                 if($iInteger >= 4294967294)
  178.                 {
  179.                         $iInteger -= 4294967296;
  180.                 }
  181.                
  182.                 return $iInteger;
  183.         }
  184.        
  185.         private function createPacket($sPayload)
  186.         {
  187.                 $sPacket = 'SAMP';
  188.                 $sPacket .= chr(strtok($this->aServer[0], '.'));
  189.                 $sPacket .= chr(strtok('.'));
  190.                 $sPacket .= chr(strtok('.'));
  191.                 $sPacket .= chr(strtok('.'));
  192.                 $sPacket .= chr($this->aServer[1] & 0xFF);
  193.                 $sPacket .= chr($this->aServer[1] >> 8 & 0xFF);
  194.                 $sPacket .= $sPayload;
  195.        
  196.                 return $sPacket;
  197.         }
  198. }