194 lines
4.2 KiB
PHP
194 lines
4.2 KiB
PHP
<?php
|
|
|
|
require_once('snapshot.php');
|
|
require_once('message.php');
|
|
require_once('player.php');
|
|
|
|
$dataDir = 'data/';
|
|
|
|
// In Java this is "DateTimeFormatter.ISO_LOCAL_DATE_TIME"
|
|
$jsonDateTimeFormat = 'Y-m-d\TH:i:s';
|
|
|
|
// ID corresponds to the Report ID
|
|
if (!isset($_GET['identifier']) || empty($_GET['identifier']))
|
|
{
|
|
exit('No identifier supplied.');
|
|
}
|
|
|
|
$identifier = removeBadCharacters($_GET['identifier']); // prevents escaping
|
|
$reportNumber = explode("-", $identifier)[0];
|
|
$filePath = $dataDir . $identifier . '.json';
|
|
|
|
if (!file_exists($filePath))
|
|
{
|
|
exit('Invalid identifier.');
|
|
}
|
|
|
|
$snapshot = toSnapshot($identifier, toDataArray($filePath));
|
|
|
|
/**
|
|
* @param String $filename
|
|
* @return array JSON data array.
|
|
*/
|
|
function toDataArray($filename)
|
|
{
|
|
return json_decode(file_get_contents($filename), true);
|
|
}
|
|
|
|
/**
|
|
* @param Snapshot $snapshot
|
|
*/
|
|
function displayMessages($snapshot)
|
|
{
|
|
echo '<p>';
|
|
|
|
foreach ($snapshot->getMessages() as $message) {
|
|
echo getMessageHTML($message) . "<br />\n";
|
|
}
|
|
|
|
echo '</p>';
|
|
}
|
|
|
|
/**
|
|
* @param Message $message
|
|
* @return string
|
|
*/
|
|
function getMessageHTML($message)
|
|
{
|
|
$sender = $message->getSender();
|
|
return '[' . $message->getType() . '] <span data-player-uuid="' . $sender->getUUID() . '">' . $sender->getUsername() . '</span> - ' . $message->getMessage();
|
|
}
|
|
|
|
/**
|
|
* @param String $identifier
|
|
* @param array $snapshotData Snapshot data array.
|
|
* @return Snapshot
|
|
*/
|
|
function toSnapshot($identifier, $snapshotData)
|
|
{
|
|
$timezone = new DateTimeZone($snapshotData["timezone"]);
|
|
$players = toPlayers($snapshotData['usernames']);
|
|
$messages = toMessages($players, $snapshotData['snapshots'], $timezone);
|
|
$generated = parseDateTime($snapshotData["generated"], $timezone);
|
|
return new Snapshot($identifier, $messages, $players, $generated);
|
|
}
|
|
|
|
/**
|
|
* @param Player[] $players
|
|
* @param array $messagesData Messages data array.
|
|
* @param DateTimeZone $timezone
|
|
* @return Message[]
|
|
*/
|
|
function toMessages($players, $messagesData, $timezone)
|
|
{
|
|
$messages = array();
|
|
|
|
for ($i = 0; $i < count($messagesData); $i++)
|
|
{
|
|
$messages[$i] = getMessage($players, $messagesData[$i], $timezone);
|
|
}
|
|
|
|
return $messages;
|
|
}
|
|
|
|
/**
|
|
* @param Player[] $players
|
|
* @param array $messageData Message data array.
|
|
* @param DateTimeZone $timezone
|
|
* @return Message
|
|
*/
|
|
function getMessage($players, $messageData, $timezone)
|
|
{
|
|
$sender = getPlayer($players, $messageData['sender']);
|
|
$recipients = getPlayersFromUUIDs($players, $messageData['recipients']);
|
|
$dateTime = parseDateTime($messageData['time'], $timezone);
|
|
$type = $messageData['type'];
|
|
$message = $messageData['message'];
|
|
|
|
return new Message($sender, $recipients, $dateTime, $type, $message);
|
|
}
|
|
|
|
/**
|
|
* @param Player[] $players
|
|
* @param String[] $uuidArray the UUIDs of the players to fetch
|
|
* @return Player[]
|
|
*/
|
|
function getPlayersFromUUIDs($players, $uuidArray)
|
|
{
|
|
$matchedPlayers = array();
|
|
|
|
for ($i = 0; $i < count($uuidArray); $i++)
|
|
{
|
|
$matchedPlayers[$i] = getPlayer($players, $uuidArray[$i]);
|
|
}
|
|
|
|
return $matchedPlayers;
|
|
}
|
|
|
|
/**
|
|
* @param Player[] $playersArray
|
|
* @return Player[]
|
|
*/
|
|
function toPlayers($playersArray) // String UUID as Key
|
|
{
|
|
$players = array();
|
|
|
|
foreach ($playersArray as $uuid => $username)
|
|
{
|
|
$players[$uuid] = new Player($uuid, $username);
|
|
}
|
|
|
|
return $players;
|
|
}
|
|
|
|
/**
|
|
* @param Player[] $players
|
|
* @param String $uuid
|
|
* @return Player
|
|
*/
|
|
function getPlayer($players, $uuid)
|
|
{
|
|
$player = $players[$uuid];
|
|
|
|
if ($player != null)
|
|
{
|
|
return $player;
|
|
}
|
|
else
|
|
{
|
|
throw new RuntimeException('Player for UUID not found.');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param String $dateTime
|
|
* @param DateTimeZone $timezone
|
|
* @return DateTime
|
|
*/
|
|
function parseDateTime($dateTime, $timezone)
|
|
{
|
|
global $jsonDateTimeFormat;
|
|
return DateTime::createFromFormat($jsonDateTimeFormat, $dateTime, $timezone);
|
|
}
|
|
|
|
/**
|
|
* @param String $input
|
|
* @return String
|
|
*/
|
|
function removeBadCharacters($input)
|
|
{
|
|
return preg_replace('/[^A-Za-z0-9_\-]/', '_', $input);
|
|
}
|
|
?>
|
|
<html>
|
|
<head>
|
|
<title>Snapshot for Report #<?php echo $reportNumber ?></title>
|
|
</head>
|
|
<body>
|
|
<?php
|
|
displayMessages($snapshot);
|
|
?>
|
|
<script type="text/javascript" src="main.js"></script>
|
|
</body>
|
|
</html>
|