Advertisement
Guest User

VCMP query mechanism

a guest
Jan 27th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.13 KB | None | 0 0
  1. class Server
  2. {
  3.     public $ip             = "0.0.0.0";
  4.     public $port           = 0;
  5.  
  6.     public $name           = "Unknown";
  7.     public $version        = "Unknown";
  8.     public $passworded     = false;
  9.     public $players        = 0;
  10.     public $max_players    = 0;
  11.  
  12.     public $player_list    = [];
  13.  
  14.     public $success        = false;
  15.  
  16.  
  17.     public function __construct($ip, $port)
  18.     {
  19.         //Set IP and port
  20.  
  21.         $this->ip = $ip;
  22.         $this->port = $port;
  23.  
  24.         //Load
  25.  
  26.         $this->Refresh();
  27.     }
  28.  
  29.     public function Refresh()
  30.     {
  31.         $this->success = false;
  32.  
  33.         if ($this->LoadInformation() != true || $this->LoadPlayers() != true) return;
  34.  
  35.         $this->success = true;
  36.     }
  37.  
  38.     protected function LoadInformation()
  39.     {
  40.         //Create stream
  41.  
  42.         $ip_array = explode(".", $this->ip);
  43.         array_map("intval", $ip_array);
  44.  
  45.         $client = stream_socket_client("udp://{$this->ip}:{$this->port}");
  46.  
  47.         stream_set_timeout($client, 1);
  48.  
  49.         //Send request
  50.  
  51.         if ($client === false) return;
  52.  
  53.         $message    = "";
  54.  
  55.         $message   .= "VCMP";                        //Magic
  56.  
  57.         $message   .= chr($ip_array[0]);             //IP byte 0
  58.         $message   .= chr($ip_array[1]);             //IP byte 1
  59.         $message   .= chr($ip_array[2]);             //IP byte 2
  60.         $message   .= chr($ip_array[3]);             //IP byte 3
  61.        
  62.         $message   .= chr($this->port & 0xFF);       //Port byte 0
  63.         $message   .= chr($this->port >> 8 & 0xFF);  //Port byte 1
  64.        
  65.         $message   .= "i";                           //Opcode 'information'
  66.  
  67.         fwrite($client, $message);
  68.  
  69.         //Receive information
  70.  
  71.         //Header
  72.  
  73.         $header = fread($client, 11);
  74.         if (strlen($header) < 11) return;
  75.  
  76.         $magic            = substr($header, 0, 4);           //Magic
  77.  
  78.         $server_ip      = "";                                //IP
  79.         $server_ip     .= ord(substr($header, 4, 1));        //IP byte 0
  80.         $server_ip     .= ".";                               //IP byte seperator
  81.         $server_ip     .= ord(substr($header, 5, 1));        //IP byte 1
  82.         $server_ip     .= ".";                               //IP byte seperator
  83.         $server_ip     .= ord(substr($header, 6, 1));        //IP byte 2
  84.         $server_ip     .= ".";                               //IP byte seperator
  85.         $server_ip     .= ord(substr($header, 7, 1));        //IP byte 3
  86.  
  87.         $server_port    = 0;
  88.         $server_port    += ord(substr($header, 8, 1));       //Port byte 0
  89.         $server_port    += ord(substr($header, 9, 1)) << 8;  //Port byte 1
  90.        
  91.         $opcode         = substr($header, 10, 1);
  92.  
  93.         //Authencity checks
  94.  
  95.         if ($magic != "MP04") return;
  96.         if ($server_ip != $this->ip) return;
  97.         if ($server_port != $this->port) return;
  98.         if ($opcode != "i") return;
  99.  
  100.         //Version
  101.  
  102.         $_version         = fread($client, 12);
  103.         if (strlen($_version) < 12) return;
  104.  
  105.         $version = str_replace("\0", "", $_version);
  106.  
  107.         //Password
  108.  
  109.         $_passworded        = fread($client, 1);
  110.         if (strlen($_passworded) < 1) return;
  111.        
  112.         $passworded = ord($_passworded) == 1;
  113.  
  114.         //Players
  115.  
  116.         $_players     = fread($client, 2);
  117.         if (strlen($_players) < 2) return;
  118.  
  119.         $players    = 0;
  120.         $players   += ord(substr($_players, 0, 1));
  121.         $players   += ord(substr($_players, 1, 1)) << 8;
  122.  
  123.         //Max players
  124.  
  125.         $_max_players     = fread($client, 2);
  126.         if (strlen($_max_players) < 2) return;
  127.  
  128.         $max_players    = 0;
  129.         $max_players   += ord(substr($_max_players, 0, 1));
  130.         $max_players   += ord(substr($_max_players, 1, 1)) << 8;
  131.        
  132.         //Server name
  133.  
  134.         $_name_len        = fread($client, 4);
  135.         if (strlen($_name_len) < 4) return;
  136.  
  137.         $name_len    = 0;
  138.         $name_len   += ord(substr($_name_len, 0, 1));
  139.         $name_len   += ord(substr($_name_len, 1, 1)) << 8;
  140.         $name_len   += ord(substr($_name_len, 2, 1)) << 16;
  141.         $name_len   += ord(substr($_name_len, 3, 1)) << 24;
  142.        
  143.         $name             = fread($client, $name_len);
  144.         if (strlen($name) < $name_len) return;
  145.  
  146.         //Gamemode
  147.  
  148.         $_gamemode_len    = fread($client, 4);
  149.         if (strlen($_gamemode_len) < 4) return;
  150.  
  151.         $gamemode_len    = 0;
  152.         $gamemode_len   += ord(substr($_gamemode_len, 0, 1));
  153.         $gamemode_len   += ord(substr($_gamemode_len, 1, 1)) << 8;
  154.         $gamemode_len   += ord(substr($_gamemode_len, 2, 1)) << 16;
  155.         $gamemode_len   += ord(substr($_gamemode_len, 3, 1)) << 24;
  156.  
  157.         $gamemode         = fread($client, $gamemode_len);
  158.         if (strlen($gamemode) < $gamemode_len) return;
  159.  
  160.         //We know everything now
  161.  
  162.         fclose($client);
  163.  
  164.         //Load it
  165.  
  166.         $this->name          = $name;
  167.         $this->version       = $version;
  168.         $this->passworded    = $passworded;
  169.         $this->players       = $players;
  170.         $this->max_players   = $max_players;
  171.  
  172.         return true;
  173.     }
  174.  
  175.     protected function LoadPlayers()
  176.     {
  177.         //Create stream
  178.  
  179.         $ip_array = explode(".", $this->ip);
  180.         array_map("intval", $ip_array);
  181.  
  182.         $client = stream_socket_client("udp://{$this->ip}:{$this->port}");
  183.  
  184.         stream_set_timeout($client, 1);
  185.  
  186.         //Send request
  187.  
  188.         if ($client === false) return;
  189.  
  190.         $message    = "";
  191.  
  192.         $message   .= "VCMP";                        //Magic
  193.  
  194.         $message   .= chr($ip_array[0]);             //IP byte 0
  195.         $message   .= chr($ip_array[1]);             //IP byte 1
  196.         $message   .= chr($ip_array[2]);             //IP byte 2
  197.         $message   .= chr($ip_array[3]);             //IP byte 3
  198.        
  199.         $message   .= chr($this->port & 0xFF);       //Port byte 0
  200.         $message   .= chr($this->port >> 8 & 0xFF);  //Port byte 1
  201.        
  202.         $message   .= "c";                           //Opcode 'information'
  203.  
  204.         fwrite($client, $message);
  205.  
  206.         //Receive information
  207.  
  208.         //Header
  209.  
  210.         $header = fread($client, 11);
  211.         if (strlen($header) < 11) return;
  212.  
  213.         $magic            = substr($header, 0, 4);           //Magic
  214.  
  215.         $server_ip      = "";                                //IP
  216.         $server_ip     .= ord(substr($header, 4, 1));        //IP byte 0
  217.         $server_ip     .= ".";                               //IP byte seperator
  218.         $server_ip     .= ord(substr($header, 5, 1));        //IP byte 1
  219.         $server_ip     .= ".";                               //IP byte seperator
  220.         $server_ip     .= ord(substr($header, 6, 1));        //IP byte 2
  221.         $server_ip     .= ".";                               //IP byte seperator
  222.         $server_ip     .= ord(substr($header, 7, 1));        //IP byte 3
  223.  
  224.         $server_port    = 0;
  225.         $server_port    += ord(substr($header, 8, 1));       //Port byte 0
  226.         $server_port    += ord(substr($header, 9, 1)) << 8;  //Port byte 1
  227.        
  228.         $opcode         = substr($header, 10, 1);
  229.  
  230.         //Authencity checks
  231.  
  232.         if ($magic != "MP04") return;
  233.         if ($server_ip != $this->ip) return;
  234.         if ($server_port != $this->port) return;
  235.         if ($opcode != "c") return;
  236.  
  237.         //Player count
  238.  
  239.         $_players    = fread($client, 2);
  240.         if (strlen($_players) < 2) return;
  241.  
  242.         $players    = 0;
  243.         $players   += ord(substr($_players, 0, 1));
  244.         $players   += ord(substr($_players, 1, 1)) << 8;
  245.  
  246.         for ($iterator = 0; $iterator < $players; ++$iterator)
  247.         {
  248.             //Player name
  249.  
  250.             $_player_name_length    = fread($client, 1);
  251.             if (strlen($_player_name_length) < 1) return;
  252.  
  253.             $player_name_length     = ord($_player_name_length);
  254.            
  255.             $player_name            = fread($client, $player_name_length);
  256.             if (strlen($player_name) < $player_name_length) return;
  257.  
  258.             $this->player_list[]    = $player_name;
  259.         }
  260.  
  261.         return true;
  262.     }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement