From a43554a7535ccca826c41229282365aa8fe6b3e3 Mon Sep 17 00:00:00 2001 From: Christopher Date: Mon, 1 Nov 2021 08:12:10 +0100 Subject: [PATCH] add add Region --- classen/RegionManager.php | 11 ++++--- classen/utils.php | 30 +++++++++++++++++++ cron/02-add_region.php | 61 ++++++++++++++++++++++++++++++++++++--- pages/start.php | 2 +- 4 files changed, 95 insertions(+), 9 deletions(-) diff --git a/classen/RegionManager.php b/classen/RegionManager.php index 4abf09b..6f25a2a 100644 --- a/classen/RegionManager.php +++ b/classen/RegionManager.php @@ -30,16 +30,19 @@ { global $RUNTIME; - $topRegionStatement = $RUNTIME['PDO']->prepare("UPDATE onlinetimes SET RegionLastSeen = ? WHERE RegionUUID = ?"); - $topRegionStatement->execute(array(time(), $uuid)); + $setOnlineTimeStatement = $RUNTIME['PDO']->prepare("UPDATE onlinetimes SET RegionLastSeen = ? WHERE RegionUUID = ?"); + $setOnlineTimeStatement->execute(array(time(), $uuid)); } public static function removeRegion($uuid) { global $RUNTIME; - $topRegionStatement = $RUNTIME['PDO']->prepare("DELETE FROM regions WHERE RegionUUID = ?"); - $topRegionStatement->execute(array($uuid)); + $removeRegionStatement = $RUNTIME['PDO']->prepare("DELETE FROM regions WHERE RegionUUID = ?"); + $removeRegionStatement->execute(array($uuid)); + + $removeRegionStatement = $RUNTIME['PDO']->prepare("DELETE FROM onlinetimes WHERE RegionUUID = ?"); + $removeRegionStatement->execute(array($uuid)); } } ?> \ No newline at end of file diff --git a/classen/utils.php b/classen/utils.php index 475436e..b2cdc78 100644 --- a/classen/utils.php +++ b/classen/utils.php @@ -19,6 +19,20 @@ function right($str, $length) return substr($str, -$length); } +function guidv4($data = null) { + // Generate 16 bytes (128 bits) of random data or use the data passed into the function. + $data = $data ?? random_bytes(16); + assert(strlen($data) == 16); + + // Set version to 0100 + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + // Set bits 6-7 to 10 + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + + // Output the 36 character UUID. + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); +} + function ping($host, $port) { $waitTimeoutInSeconds = 2; @@ -84,8 +98,24 @@ function getAssetImage($assetServer, $assetUUID) return $assetUUID.'.png'; } +function getRegionStats($regionHostName) +{ + $optionen = stream_context_create(array('http' => array('timeout' => 1))); + $result = file_get_contents("http://".$regionHostName."/jsonSimStats", false, $optionen); + + if($result != "") + { + return json_decode($result); + } + + return false; +} + function getTopRegionHTML($row) { + if(!isset($row['Image'])) + return; + if(!file_exists("./data/RegionImages/".$row['Image'])) $row['Image'] = "notFound.jpg"; diff --git a/cron/02-add_region.php b/cron/02-add_region.php index 21f0e52..9014842 100644 --- a/cron/02-add_region.php +++ b/cron/02-add_region.php @@ -1,10 +1,63 @@ prepare("SELECT QueueData FROM queue WHERE QueueType = 'DownloadImage'"); - $imageDownloadStatement->execute(array()); + $QueueStatement = $RUNTIME['PDO']->prepare("SELECT * FROM queue WHERE QueueType = 'addRegion'"); + $QueueStatement->execute(array()); - while($row = $imageDownloadStatement->fetch()) + while($row = $QueueStatement->fetch()) { - print_r(json_decode($row['QueueData'])); + $queueData = json_decode($row['QueueData']); + $REGIONDATA = array(); + + if(ping($queueData->Hostname, $queueData->Port)) + { + $stats = getRegionStats($queueData->Hostname.":".$queueData->Port); + + if($stats != false) + { + if($stats->RegionName != $queueData->RegionName) + break; + + if(!isset($stats->RootAg)) + break; + + if(!isset($stats->Version)) + break; + + $REGIONDATA['Avatare'] = $stats->RootAg; + $REGIONDATA['Version'] = trim(substr(str_replace(" ", "", $stats->Version), 0, 16)); + $REGIONDATA['MAP'] = "http://".$queueData->Hostname.":".$queueData->Port."/index.php?method=regionImage".trim(str_replace("-", "", $queueData->UUID)); + + if(isset($queueData->Image)) + $REGIONDATA['Image'] = $queueData->Image; + + if(!isset($queueData->Image)) + $REGIONDATA['Image'] = guidv4(); + + if(isset($stats->RootAg) && isset($stats->NPCAg)) + $REGIONDATA['Avatare'] = $stats->RootAg - $stats->NPCAg; + + $QueueStatement = $RUNTIME['PDO']->prepare("REPLACE INTO onlinetimes VALUES (?, ?, ?)"); + $QueueStatement->execute(array($queueData->UUID, time(), $REGIONDATA['Avatare'])); + + $QueueStatement = $RUNTIME['PDO']->prepare("REPLACE INTO regions VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + $QueueStatement->execute(array($queueData->RegionName, $queueData->UUID, $queueData->GridName, $REGIONDATA['Image'], "00000000-0000-0000-0000-000000000000", $queueData->Hostname, $queueData->Port, $REGIONDATA['Version'])); + + if(isset($queueData->Image)) + { + $QueueStatement = $RUNTIME['PDO']->prepare("INSERT INTO queue VALUES (?, ?, ?)"); + $QueueStatement->execute(array(guidv4(), "assetImageDownload", json_encode(array("RegionUUID" => $queueData->UUID, "HomeURL" => @$queueData->Image, "TargetAssetUUID" => $queueData->Image)))); + } + + if(!isset($queueData->Image)) + { + $QueueStatement = $RUNTIME['PDO']->prepare("INSERT INTO queue VALUES (?, ?, ?)"); + $QueueStatement->execute(array(guidv4(), "regionImageDownload", json_encode(array("RegionUUID" => $queueData->UUID, "URL" => $REGIONDATA['MAP'], "TargetAssetUUID" => $REGIONDATA['Image'])))); + } + + } + } + + $removeQueueStatement = $RUNTIME['PDO']->prepare("DELETE FROM queue WHERE QueueID = ?"); + $removeQueueStatement->execute(array($row['QueueID'])); } ?> \ No newline at end of file diff --git a/pages/start.php b/pages/start.php index d44f899..e75a379 100644 --- a/pages/start.php +++ b/pages/start.php @@ -10,7 +10,7 @@ while($region = $RegionManager->getNextRegion()) @$RUNTIME['RegionList'] .= getRegionHTML($region); - $HTML->ReplaceLayoutInhalt("%%RegionList%%", $RUNTIME['RegionList']); + $HTML->ReplaceLayoutInhalt("%%RegionList%%", @$RUNTIME['RegionList']); $HTML->build();