Last active
March 3, 2018 18:16
-
-
Save Emiel45/7647029 to your computer and use it in GitHub Desktop.
Minecraft 1.7 server list pinged (hacked together in 20 minutes)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Info used: http://wiki.vg/Server_List_Ping | |
// (Original varint parsing: https://gist.github.com/thinkofname/e975ddee04e9c87faf22) | |
// Reads a varint from the socket | |
function read_varint($socket) { | |
$i = 0; $j = 0; | |
while(true) { | |
socket_recv($socket, $buf, 1, null); | |
$k = ord($buf[0]); | |
$i |= ($k & 0x7F) << $j++ * 7; | |
if ($j > 5) return -1; | |
if (($k & 0x80) != 128) break; | |
} | |
return $i; | |
} | |
// Writes a varint to the socket | |
function write_varint($socket, $val) { | |
while(true) { | |
if(($val & 0xFFFFFF80) == 0) { | |
socket_send($socket, chr($val), 1, null); | |
return; | |
} | |
socket_send($socket, chr($val & 0xFF | 0x80), 1, null); | |
$val >>= 7; | |
} | |
} | |
// Used to ping a 1.7+ minecraft server | |
function ping_mcserver($server, $port = 25565){ | |
// Create socket and connect | |
$socket = socket_create(AF_INET,SOCK_STREAM, getprotobyname('tcp')); | |
socket_connect($socket, $server, $port); | |
// Calculate size of packet | |
write_varint($socket, 6 + strlen($server)); | |
{ | |
// Handshake packet | |
socket_send($socket, chr(0), 1, null); | |
// Protocol version | |
socket_send($socket, chr(4), 1, null); | |
// Server address | |
write_varint($socket, strlen($server)); | |
socket_send($socket, $server, strlen($server), null); | |
// Server port (big endian) | |
socket_send($socket, chr(($port >> 8) & 0xff), 1, null); | |
socket_send($socket, chr($port & 0xff), 1, null); | |
// Next state is status state | |
write_varint($socket, 1); | |
} | |
// Size of packet | |
write_varint($socket, 1); | |
{ | |
// Status request packet | |
socket_send($socket, chr(0), 1, null); | |
} | |
// Read packet size (unsused) | |
read_varint($socket); | |
// Read opcode, should be 0 for status resposne | |
socket_recv($socket, $buf, 1, null); | |
// Read JSON string length | |
$len = read_varint($socket); | |
// Read JSON string | |
socket_recv($socket, $buf, $len, null); | |
// Decode JSON string | |
return json_decode($buf, true); | |
} | |
// Dumps json string: | |
// print_r(ping_mcserver("server.com")); | |
// Example usage | |
$info = ping_mcserver("server.com"); | |
print('<img src="' . $info['favicon'] . '"/><br />'); | |
print('<b>Title: </b>' . $info['description']['text'] . '<br />'); | |
print('<b>Players: </b>' . $info['players']['online'] . '/' . $info['players']['max'] . '<br />'); | |
print('<b>Version: </b>' . $info['version']['name'] . '<br />'); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment