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);
|
interval);
|
||||||
|
|
||||||
var refresh = function() {
|
var refresh = function() {
|
||||||
$.getJSON("https://mcapi.ca/query/play.totalfreedom.me:25565/extensive", function(json) {
|
$.getJSON("status.php", function(json) {
|
||||||
if (json.status !== true) {
|
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>');
|
$("#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();
|
$(".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