Skip to content

Instantly share code, notes, and snippets.

@mtoensing
Last active June 4, 2018 15:47
Show Gist options
  • Save mtoensing/5c208f63cbc3d39f675f6db269989e91 to your computer and use it in GitHub Desktop.
Save mtoensing/5c208f63cbc3d39f675f6db269989e91 to your computer and use it in GitHub Desktop.
<?php
header_no_cache();
use xPaw\MinecraftQuery;
use xPaw\MinecraftQueryException;
// Edit this ->
define( 'MQ_SERVER_ADDR', 'XXXXXXXX );
define( 'MQ_SERVER_PORT', 25565 );
define( 'MQ_TIMEOUT', 1 );
// Edit this <-
function time2str( $ts ) {
if ( $ts == 'never' ) {
return 'never';
}
if ( ! ctype_digit( $ts ) ) {
$ts = strtotime( $ts );
}
$diff = time() - $ts;
if ( $diff == 0 ) {
return 'now';
} elseif ( $diff > 0 ) {
$day_diff = floor( $diff / 86400 );
if ( $day_diff == 0 ) {
if ( $diff < 60 ) {
return 'just now';
}
if ( $diff < 120 ) {
return '1 minute ago';
}
if ( $diff < 3600 ) {
return floor( $diff / 60 ) . ' minutes ago';
}
// compare with current time to see if it was posted yesterday
if ( date( 'H' ) < ( $diff / 3600 ) ) {
return 'Yesterday';
}
// if today
if ( $diff < 7200 ) {
return '1 hour ago';
}
if ( $diff < 86400 ) {
return floor( $diff / 3600 ) . ' hours ago';
}
}
if ( $day_diff == 1 ) {
return 'Yesterday';
}
if ( $day_diff < 7 ) {
return $day_diff . ' days ago';
}
if ( $day_diff < 31 ) {
return ceil( $day_diff / 7 ) . ' weeks ago';
}
if ( $day_diff < 60 ) {
return 'last month';
}
return date( 'F Y', $ts );
} else {
$diff = abs( $diff );
$day_diff = floor( $diff / 86400 );
if ( $day_diff == 0 ) {
if ( $diff < 120 ) {
return 'in a minute';
}
if ( $diff < 3600 ) {
return 'in ' . floor( $diff / 60 ) . ' minutes';
}
if ( $diff < 7200 ) {
return 'in an hour';
}
if ( $diff < 86400 ) {
return 'in ' . floor( $diff / 3600 ) . ' hours';
}
}
if ( $day_diff == 1 ) {
return 'Tomorrow';
}
if ( $day_diff < 4 ) {
return date( 'l', $ts );
}
if ( $day_diff < 7 + ( 7 - date( 'w' ) ) ) {
return 'next week';
}
if ( ceil( $day_diff / 7 ) < 4 ) {
return 'in ' . ceil( $day_diff / 7 ) . ' weeks';
}
if ( date( 'n', $ts ) == date( 'n' ) + 1 ) {
return 'next month';
}
return date( 'F Y', $ts );
}
}
// Display everything in browser, because some people can't look in logs for errors
Error_Reporting( E_ALL | E_STRICT );
Ini_Set( 'display_errors', true );
require __DIR__ . '/src/MinecraftQuery.php';
require __DIR__ . '/src/MinecraftQueryException.php';
$Timer = MicroTime( true );
$Query = new MinecraftQuery();
try {
$Query->Connect( MQ_SERVER_ADDR, MQ_SERVER_PORT, MQ_TIMEOUT );
} catch ( MinecraftQueryException $e ) {
$Exception = $e;
}
$Timer = Number_Format( MicroTime( true ) - $Timer, 4, '.', '' );
/* fill variables */
$data = json_decode( @file_get_contents( "data.json" ), true );
if ( $data == false ) {
$data = array();
}
$players = '';
$numPlayers = 0;
$serverstatus = '';
$serverinfo = '';
$Info = false;
$serverinfo_whitelist = array( 'GameType', 'HostName' );
$player_online = array();
$serverinfo .= '<table class="table table-striped">';
$serverinfo .= '<thead><tr><th colspan="2">Server</th></tr></thead><tbody>';
if ( isset( $Exception ) ) {
//echo htmlspecialchars($Exception->getMessage());
//echo nl2br($e->getTraceAsString(), false);
$serverinfo .= '<tr>';
$serverinfo .= '<td>Server Status</td>';
$serverinfo .= '<td><strong class="status offline pulse">offline </strong> (last seen ' . time2str( $data['server']['last_seen'] ) . ' )</td>';
$serverinfo .= '</tr>';
$serverinfo .= '<tr>';
$serverinfo .= '<td>Server Address</td>';
$serverinfo .= '<td>' . MQ_SERVER_ADDR . '</td>';
$serverinfo .= '</tr>';
$serverinfo .= '<tr>';
$serverinfo .= '<td>Version</td>';
$serverinfo .= '<td>';
$serverinfo .= $data['server']['Version'] . ' (updated ' . time2str( $data['server']['updated'] ) . ')';
$serverinfo .= '</td>';
$serverinfo .= '</tr>';
} else {
$serverinfo .= '<tr>';
$serverinfo .= '<td>Server Status</td>';
$serverinfo .= '<td><strong class="status pulse online">is online!</strong></td>';
$serverinfo .= '</tr>';
$serverinfo .= '<tr>';
$serverinfo .= '<td>Server Address</td>';
$serverinfo .= '<td>' . MQ_SERVER_ADDR . '</td>';
$serverinfo .= '</tr>';
if ( ( $Info = $Query->GetInfo() ) !== false ) {
foreach ( $Info as $InfoKey => $InfoValue ) {
if ( $InfoKey == 'Version' ) {
if (isset( $data['server']['Version'] ) && $data['server']['Version'] != $InfoValue ) {
$server['updated'] = time();
} elseif ( isset( $data['server']['updated'] ) ) {
$server['updated'] = $data['server']['updated'];
} else {
$server['updated'] = 'never';
}
$server['Version'] = $InfoValue;
$server['last_seen'] = time();
$data['server'] = $server;
$serverinfo .= '<tr>';
$serverinfo .= '<td>' . htmlspecialchars( $InfoKey ) . '</td>';
$serverinfo .= '<td>';
if ( isset( $data['server']['updated'] ) ) {
$serverinfo .= $InfoValue . ' (updated ' . time2str( $data['server']['updated'] ) . ')';
} else {
$serverinfo .= $InfoValue;
}
$serverinfo .= '</td>';
$serverinfo .= '</tr>';
}
if ( $InfoKey == 'GameType' ) {
switch ($InfoValue) {
case 'SMP':
$InfoValue = "Survival Multiplayer";
break;
case 'CRE':
echo "Creative Mode";
break;
case 'ADV':
echo "ADVENTURE";
break;
}
}
if ( in_array( $InfoKey, $serverinfo_whitelist ) ) {
$serverinfo .= '<tr>';
$serverinfo .= '<td>' . htmlspecialchars( $InfoKey ) . '</td>';
$serverinfo .= '<td>';
if ( Is_Array( $InfoValue ) ) {
$serverinfo .= "<pre>";
$serverinfo .= ( $InfoValue );
$serverinfo .= "</pre>";
} else {
$serverinfo .= htmlspecialchars( $InfoValue );
}
$serverinfo .= '</td>';
$serverinfo .= '</tr>';
}
}
}
if ( ( $Players = $Query->GetPlayers() ) !== false ) {
$numPlayers = count( $Players );
foreach ( $Players as $Player ) {
$player_name = htmlspecialchars( $Player );
$player_status['last_seen'] = time();
$player_online[] = $player_name;
$data['players'][ $player_name ] = $player_status;
}
}
$jsonstring = json_encode( $data, JSON_PRETTY_PRINT );
file_put_contents( 'data.json', $jsonstring );
}
$players .= '<table class="table table-striped">';
if ( $Info !== false ) {
$players .= '<thead><tr><td>Player Status (' . $numPlayers . '/' . $Info['MaxPlayers'] . ')</td></tr></thead><tbody>';
} else {
$players .= '<thead><tr><td>Player Status</td></tr></thead><tbody>';
}
arsort($data['players']);
if ( array_key_exists( 'players', $data ) !== false ) {
foreach ( $data['players'] as $player_name => $value ) {
$players .= '<tr>';
if ( in_array( $player_name, $player_online ) ) {
$players .= '<td>' . $player_name . ' <span class="status online">(Online)</span></td>';
} else {
$players .= '<td>' . $player_name . ' <span class="status offline">(Last online ' . time2str( $data['players'][ $player_name ]['last_seen'] ) . ')</span></td>';
}
$players .= '</tr>';
}
}
$players .= '</tbody></table>';;
$serverinfo .= '</tbody></table>';
echo "<!DOCTYPE html>\n<html lang='de-DE'>\n<head>\n";
echo '<meta charset="UTF-8">';
echo "<title>Minecraft Server Info</title>\n";
echo '<meta name="viewport" content="width=device-width, initial-scale=1">';
echo '<link rel="shortcut icon" href="Favicon.ico">';
echo '<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">';
echo '<link href="style.css" rel="stylesheet">';
echo '</head>';
echo '<body><div class="container">';
echo '<h1>Minecraft Server Info</h1>';
echo $serverstatus;
echo $serverinfo;
echo $players;
echo '</div></body></html>';
function header_no_cache () {
\header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
\header('Pragma: no-cache'); // HTTP 1.0.
\header('Expires: 0'); // Proxies.
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment