Overview

Namespaces

  • aliuly
    • common
      • selectors
    • loader
  • xPaw

Classes

  • aliuly\common\ArmorItems
  • aliuly\common\BasicCli
  • aliuly\common\BasicHelp
  • aliuly\common\BasicPlugin
  • aliuly\common\ChatSession
  • aliuly\common\Cmd
  • aliuly\common\CmdSelector
  • aliuly\common\ExpandVars
  • aliuly\common\FastTransfer
  • aliuly\common\FileUtils
  • aliuly\common\FreezeSession
  • aliuly\common\GetMotd
  • aliuly\common\GetMotdAsyncTask
  • aliuly\common\InvisibleSession
  • aliuly\common\InvUtils
  • aliuly\common\ItemName
  • aliuly\common\mc
  • aliuly\common\mc2
  • aliuly\common\MoneyAPI
  • aliuly\common\MPMU
  • aliuly\common\Npc
  • aliuly\common\PermUtils
  • aliuly\common\PluginAsyncTask
  • aliuly\common\PluginCallbackTask
  • aliuly\common\PMScript
  • aliuly\common\QueryAsyncTask
  • aliuly\common\Rcon
  • aliuly\common\RconTask
  • aliuly\common\selectors\All
  • aliuly\common\selectors\AllEntity
  • aliuly\common\selectors\BaseSelector
  • aliuly\common\selectors\Random
  • aliuly\common\Session
  • aliuly\common\ShieldSession
  • aliuly\common\ShoppingCart
  • aliuly\common\SignUtils
  • aliuly\common\SkinUtils
  • aliuly\common\SpySession
  • aliuly\common\SubCommandMap
  • aliuly\common\TPUtils
  • aliuly\loader\Main
  • xPaw\MinecraftQuery

Exceptions

  • xPaw\MinecraftQueryException
  • Overview
  • Namespace
  • Class
 1: <?php
 2: 
 3: namespace aliuly\common;
 4: use pocketmine\utils\Binary;
 5: 
 6: /**
 7:  * Get MOTD style data from Minecraft PE servers
 8:  */
 9: abstract class GetMotd {
10:   /** @const str - Magic string */
11:   const MAGIC = "\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78";
12:   /** @const int - Ping Open connection packet id */
13:     const PING_OPEN_CONNECTION = 0x01;
14:   /** @const int - Pong Open connection packet id */
15:     const PONG_OPEN_CONNECTION = 0x1c;
16:     /** Query server
17:      * @param str $Ip - IP or hostname to query
18:      * @param int $Port - Port to connect to
19:      * @param int $Timeout - Timeout in seconds
20:      * @return str|array - string with error on array with results
21:      */
22:     static public function query( $Ip, $Port = 19132, $Timeout = 3 ) {
23:         if( !is_int( $Timeout ) || $Timeout < 0 )   return "Invalid timeout value";
24:         $sock = @fsockopen( 'udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, $Timeout );
25: 
26:         if( $ErrNo || $sock === false ) return "socket error: " . $ErrStr;
27:         Stream_Set_Timeout( $sock, $Timeout );
28:         Stream_Set_Blocking( $sock, true );
29: 
30:         $res = self::pingServer($sock);
31:         fclose($sock);
32:         return $res;
33:     }
34:   /**
35:    * Run protocol to get MOTD data
36:    *
37:    * @param resource $sock
38:    * @return str|array - string with error or array with results
39:    */
40:     static protected function pingServer($sock) {
41:         $pkt = chr(self::PING_OPEN_CONNECTION).
42:                     Binary::writeLong(microtime(true)*1000).
43:                     self::MAGIC;
44:         $len  = strlen($pkt);
45:         if ($len !== fwrite($sock,$pkt,$len)) return "error writing socket";
46:         $reply = fread( $sock, 4096 );
47:         if ($reply === false) return "error reading socket";
48:         /*
49:             0 - id
50:             1 - ping-id
51:             9 - server-id
52:             17 - magic
53:             33 - string Length
54:             35 - payload Length
55:             37 - payload string
56:             */
57:         if (strlen($reply) < 35
58:                 || $reply{0} != chr(self::PONG_OPEN_CONNECTION)
59:                 || substr($reply,17,16) != self::MAGIC) return "invalid response";
60:         $res = [
61:             "latency" => intval(microtime(true)*1000 - Binary::readLong(substr($reply,1,8))),
62:             "serverId" => Binary::readLong(substr($reply,9,8)),
63:         ];
64:         $plen = Binary::readShort(substr($reply,35,2));
65:         $payload = substr($reply,37);
66:         if (strlen($payload) > $plen) $payload = substr($payload,$plen);
67:         $val = explode(";",$payload);
68:     foreach (["mccpp", "motd", "protocol", "client-version", "players",
69:               "max-players"] as $i) {
70:       if (count($val)) {
71:         $res[$i] = array_shift($val);
72:       } else {
73:         break;
74:       }
75:     }
76:         return $res;
77:     }
78: }
79: 
API documentation generated by ApiGen