mirror of
https://github.com/TotalFreedomMC/Website.git
synced 2024-12-22 16:25:12 +00:00
Added local script for checking server status over raw TCP.
This replaces the need for external dependency "MCAPI".
This commit is contained in:
parent
3152b7bd21
commit
1334f8ad84
2 changed files with 149 additions and 1 deletions
|
@ -24,7 +24,7 @@ $(document).ready(function() {
|
|||
interval);
|
||||
|
||||
var refresh = function() {
|
||||
$.getJSON("https://mcapi.ca/query/play.totalfreedom.me:25565/extensive", function(json) {
|
||||
$.getJSON("status.php", function(json) {
|
||||
if (json.status !== true) {
|
||||
$("#online").html('<span style="color: firebrick; font-weight: bolder;"> Server is Offline</span><br/><small style="font-size: .5em;">Check out our <a href="status">Associated Servers</a>!</small>');
|
||||
$(".button").hide();
|
||||
|
|
148
status.php
Normal file
148
status.php
Normal file
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
/**
|
||||
* Minecraft Server Status Query
|
||||
*
|
||||
* Adapted by StevenLawson for TotalFreedom Website
|
||||
*
|
||||
* @link https://github.com/FunnyItsElmo/PHP-Minecraft-Server-Status-Query/
|
||||
* @author Julian Spravil <julian.spr@t-online.de>
|
||||
* @copyright Copyright (c) 2016 Julian Spravil
|
||||
* @license https://github.com/FunnyItsElmo/PHP-Minecraft-Server-Status-Query/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
class Packet
|
||||
{
|
||||
protected $packetID;
|
||||
protected $data;
|
||||
|
||||
public function __construct($packetID)
|
||||
{
|
||||
$this->packetID = $packetID;
|
||||
$this->data = pack('C', $packetID);
|
||||
}
|
||||
|
||||
public function addSignedChar($data)
|
||||
{
|
||||
$this->data .= pack('c', $data);
|
||||
}
|
||||
|
||||
public function addUnsignedChar($data)
|
||||
{
|
||||
$this->data .= pack('C', $data);
|
||||
}
|
||||
|
||||
public function addSignedShort($data)
|
||||
{
|
||||
$this->data .= pack('s', $data);
|
||||
}
|
||||
|
||||
public function addUnsignedShort($data)
|
||||
{
|
||||
$this->data .= pack('S', $data);
|
||||
}
|
||||
|
||||
public function addString($data)
|
||||
{
|
||||
$this->data .= pack('C', strlen($data));
|
||||
$this->data .= $data;
|
||||
}
|
||||
|
||||
public function send($socket)
|
||||
{
|
||||
$this->data = pack('C', strlen($this->data)) . $this->data;
|
||||
socket_send($socket, $this->data, strlen($this->data), 0);
|
||||
}
|
||||
}
|
||||
|
||||
class HandshakePacket extends Packet
|
||||
{
|
||||
public function __construct($host, $port, $protocol, $nextState)
|
||||
{
|
||||
parent::__construct(0);
|
||||
$this->addUnsignedChar($protocol);
|
||||
$this->addString($host);
|
||||
$this->addUnsignedShort($port);
|
||||
$this->addUnsignedChar($nextState);
|
||||
}
|
||||
}
|
||||
|
||||
class PingPacket extends Packet
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(0);
|
||||
}
|
||||
}
|
||||
|
||||
class MinecraftServerStatus
|
||||
{
|
||||
public static function query($host, $port = 25565)
|
||||
{
|
||||
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
|
||||
if (!@socket_connect($socket, $host, $port))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$handshakePacket = new HandshakePacket($host, $port, 107, 1);
|
||||
$pingPacket = new PingPacket();
|
||||
|
||||
$handshakePacket->send($socket);
|
||||
|
||||
$start = microtime(true);
|
||||
$pingPacket->send($socket);
|
||||
$length = self::readVarInt($socket);
|
||||
$ping = round((microtime(true) - $start) * 1000);
|
||||
|
||||
$data = socket_read($socket, $length, PHP_NORMAL_READ);
|
||||
$data = strstr($data, '{');
|
||||
$data = json_decode($data, true);
|
||||
|
||||
$data['ping'] = $ping;
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private static function readVarInt($socket)
|
||||
{
|
||||
$a = 0;
|
||||
$b = 0;
|
||||
while (true)
|
||||
{
|
||||
$c = socket_read($socket, 1);
|
||||
if (!$c)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
$c = Ord($c);
|
||||
$a |= ($c & 0x7F) << $b ++ * 7;
|
||||
if ($b > 5)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (($c & 0x80) != 128)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $a;
|
||||
}
|
||||
}
|
||||
|
||||
$response = MinecraftServerStatus::query('192.99.69.234', 25565);
|
||||
|
||||
header("Cache-Control: no-cache, must-revalidate");
|
||||
header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header('Content-Type: application/json');
|
||||
|
||||
if (!$response)
|
||||
{
|
||||
$response = array('status' => false);
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['status'] = true;
|
||||
}
|
||||
|
||||
echo json_encode($response, JSON_PRETTY_PRINT);
|
Loading…
Reference in a new issue