polygon-website-foss/placeitem.php

266 lines
12 KiB
PHP

<?php require $_SERVER['DOCUMENT_ROOT'].'/api/private/core.php';
use pizzaboxer\ProjectPolygon\Database;
use pizzaboxer\ProjectPolygon\Polygon;
use pizzaboxer\ProjectPolygon\Games;
use pizzaboxer\ProjectPolygon\Users;
use pizzaboxer\ProjectPolygon\Catalog;
use pizzaboxer\ProjectPolygon\Thumbnails;
use pizzaboxer\ProjectPolygon\PageBuilder;
if (!Polygon::IsEmbed()) Users::RequireLogin();
$Asset = Catalog::GetAssetInfo($_GET['ID'] ?? $_GET['id'] ?? false);
if (!$Asset) PageBuilder::instance()->errorCode(404);
if ($Asset->type != 9)
{
redirect("/".encode_asset_name($Asset->name)."-item?id=".$Asset->id);
}
$AssetThumbnail = Thumbnails::GetAsset($Asset, 768, 432);
$Gears = json_decode($Asset->gear_attributes, true);
$IsCreator = SESSION && $Asset->creator == SESSION["user"]["id"];
$IsStaff = Users::IsAdmin();
$IsAdmin = Users::IsAdmin([Users::STAFF_CATALOG, Users::STAFF_ADMINISTRATOR]);
$CanConfigure = $IsCreator || $IsAdmin;
if($_SERVER['REQUEST_URI'] != "/".encode_asset_name($Asset->name)."-place?id=".$Asset->id)
{
redirect("/".encode_asset_name($Asset->name)."-place?id=".$Asset->id);
}
$pageBuilder = new PageBuilder(["title" => Polygon::FilterText($Asset->name).", ".vowel(Catalog::GetTypeByNum($Asset->type))." by ".$Asset->username, "ShowFooterAd" => false]);
$pageBuilder->addAppAttribute("data-asset-id", $Asset->id);
$pageBuilder->addAppAttribute("data-owns-asset", $CanConfigure ? "true" : "false");
$pageBuilder->addMetaTag("og:image", $AssetThumbnail);
$pageBuilder->addMetaTag("og:description", Polygon::FilterText($Asset->description));
$pageBuilder->addMetaTag("twitter:image", $AssetThumbnail);
$pageBuilder->addMetaTag("twitter:card", "summary_large_image");
if (Polygon::IsEmbed())
{
$pageBuilder->buildHeader();
echo "<div class=\"text-center\"><h1>wtf are you doing</h1></div>";
$pageBuilder->buildFooter();
die();
}
else
{
$totalGameJoins = Database::singleton()->run(
"SELECT COUNT(*) FROM GameJobSessions WHERE UserID = :UserID",
[":UserID" => SESSION["user"]["id"]]
)->fetchColumn();
$failedGameJoins = Database::singleton()->run(
"SELECT COUNT(*) FROM GameJobSessions WHERE UserID = :UserID AND Verified = 0",
[":UserID" => SESSION["user"]["id"]]
)->fetchColumn();
// the idea here is that we only show the help message if at least 70% of all game joins have failed
if ($totalGameJoins == 0)
$failedGameJoinRate = 1;
else
$failedGameJoinRate = $failedGameJoins / $totalGameJoins;
$showHelpMessage = $failedGameJoinRate > 0.7;
}
$pageBuilder->addResource("scripts", "/js/protocolcheck.js");
$pageBuilder->addResource("polygonScripts", "/js/polygon/games.js");
$pageBuilder->addResource("polygonScripts", "/js/polygon/item.js");
if($IsStaff) $pageBuilder->addResource("polygonScripts", "/js/polygon/admin/asset-moderation.js");
$pageBuilder->buildHeader();
?>
<?php if ($showHelpMessage) { ?>
<div class="bg-primary mb-2 px-3 py-2 text-light rounded">
<i class="fas fa-exclamation-circle"></i>
Having difficulty with the game client? <a href="/forum/showpost?PostID=1775" class="text-light">Read this help thread.</a>
</div>
<?php } ?>
<div class="row">
<div class="col" style="max-width: 58rem">
<?php if ($CanConfigure) { ?>
<div class="dropdown d-flex justify-content-end float-right">
<a class="btn btn-sm btn-light py-0 px-1" href="#" role="button" id="configure-asset" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="fa-stack">
<i class="fas fa-cog"></i>
<i class="fas fa-angle-down"></i>
</span>
</a>
<div class="dropdown-menu dropdown-menu-right bg-light" aria-labelledby="configure-asset">
<?php if ($CanConfigure) { ?>
<a class="dropdown-item" href="/places/<?=$Asset->id?>/update">Configure</a>
<a class="dropdown-item" href="/asset/?id=<?=$Asset->id?>">Download Place File</a>
<?php } if ($IsAdmin) { ?>
<a class="dropdown-item asset-<?=$Asset->approved==1?'decline':'approve'?>" href="#"><?=$Asset->approved==1?'Disa':'A'?>pprove Asset</a>
<a class="dropdown-item asset-rerender" href="#">Request Re-render</a>
<?php } ?>
</div>
</div>
<?php } ?>
<h2 class="font-weight-normal"><?=Polygon::FilterText($Asset->name)?></h2>
<div class="row">
<div class="col-sm-8">
<img src="<?=$AssetThumbnail?>" class="img-fluid">
<?php if (strlen($Asset->description)) { ?>
<p class="mb-0 mt-1"><?=Polygon::FilterText($markdown->setEmbedsEnabled(true)->text($Asset->description), false)?></p>
<?php } ?>
</div>
<div class="col-sm-4">
<div class="row mx-0 mb-3 pb-2 divider-bottom">
<div class="pl-3">
<img src="<?=Thumbnails::GetAvatar($Asset->creator)?>" width="80" height="80">
</div>
<div class="pl-2">
<h5 class="font-weight-normal mb-0">Builder:</h5>
<h5 class="font-weight-normal mb-0"><a href="/user?ID=<?=$Asset->creator?>"><?=$Asset->username?></a></h5>
<p class="mb-0">Joined: <?=date("m/d/Y", $Asset->jointime)?></p>
</div>
</div>
<?php if (Games::CanPlayGame($Asset) || $IsStaff) { ?>
<button class="btn btn-success btn-block my-2 pt-1 pb-0 mx-auto VisitButton VisitButtonPlay" placeid="<?=$Asset->id?>" style="max-width: 13rem"><h5 class="font-weight-normal pb-0">Play</h5></button>
<?php if ($Asset->publicDomain || $IsCreator || $IsStaff) { ?>
<button class="btn btn-success btn-block my-2 pt-1 pb-0 mx-auto VisitButton VisitButtonSolo" placeid="<?=$Asset->id?>" placeversion="<?=$Asset->Version?>" style="max-width: 13rem" title="Visit this game Solo" data-toggle="tooltip" data-placement="bottom"><h5 class="font-weight-normal pb-0">Visit</h5></button>
<button class="btn btn-success btn-block my-2 pt-1 pb-0 mx-auto VisitButton VisitButtonEdit" placeid="<?=$Asset->id?>" placeversion="<?=$Asset->Version?>" style="max-width: 13rem" title="Open in Studio Mode" data-toggle="tooltip" data-placement="bottom"><h5 class="font-weight-normal pb-0">Edit</h5></button>
<?php } ?>
<?php } else { ?>
<div class="text-center">
<p>Sorry, this place is currently only open to the creator's friends.</p>
</div>
<?php } ?>
<div class="details mt-3" style="line-height: normal">
<p class="mb-0"><small><b>Created:</b> <?=timeSince($Asset->created)?></small></p>
<p class="mb-0"><small><b>Updated:</b> <?=timeSince($Asset->updated)?></small></p>
<p class="mb-0"><small><b>Visited:</b> <?=number_format($Asset->Visits)?></small></p>
<p class="mb-0"><small><b>Version:</b> <?=$Asset->Version?></small></p>
<p class="mb-2"><small><b>Max Players:</b> <?=number_format($Asset->MaxPlayers)?></small></p>
<p class="mb-0"><small><b>Allowed Gear Types:</b></small></p>
<?php if (!in_array(true, $Gears)) { ?>
<i class="far fa-times-circle text-primary" data-toggle="tooltip" data-placement="bottom" title="No Gear Allowed"></i>
<?php } else { foreach($Gears as $Attribute => $Enabled) { if (!$Enabled) continue; ?>
<i class="<?=Catalog::$GearAttributesDisplay[$Attribute]["icon"]?> text-primary" data-toggle="tooltip" data-placement="bottom" title="<?=Catalog::$GearAttributesDisplay[$Attribute]["text_sel"]?>"></i>
<?php } } ?>
</div>
</div>
</div>
<ul class="nav nav-tabs mt-4 pl-2" id="placeTabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="games-tab" data-toggle="tab" href="#games" role="tab" aria-controls="games" aria-selected="true">Games</a>
</li>
<?php if($Asset->comments) { ?>
<li class="nav-item">
<a class="nav-link" id="commentary-tab" data-toggle="tab" href="#commentary" role="tab" aria-controls="commentary" aria-selected="true">Commentary</a>
</li>
<?php } ?>
</ul>
<div class="tab-content py-3" id="placeTabsContent">
<div class="tab-pane active running-games-container" id="games" role="tabpanel">
<div class="items"></div>
<div class="pagination form-inline justify-content-center d-none">
<button type="button" class="btn btn-light mx-2 back"><h5 class="mb-0"><i class="fal fa-caret-left"></i></h5></button>
<span>Page</span>
<input class="form-control form-control-sm text-center mx-1 px-0 page" type="text" data-last-page="1" style="width:40px">
<span>of <span class="pages">10</span></span>
<button type="button" class="btn btn-light mx-2 next"><h5 class="mb-0"><i class="fal fa-caret-right"></i></h5></button>
</div>
<div class="text-center">
<div class="loading"><span class="jumbo spinner-border" role="status"></span></div>
<p class="no-items"></p>
<button class="btn btn-sm btn-light refresh d-none">Refresh</button>
</div>
<div class="template d-none">
<div class="row">
<div class="col-3">
<p>$PlayerCount of $MaximumPlayers players max</p>
<button class="btn btn-sm btn-light VisitButton VisitButtonPlay" jobid="$JobID">Join</button>
<button class="btn btn-sm btn-light ShutdownGame" jobid="$JobID">Shutdown</button>
</div>
<div class="col-9">
<div class="row mx-0 IngamePlayers"></div>
</div>
</div>
</div>
</div>
<?php if($Asset->comments) { ?>
<div class="tab-pane comments-container" id="commentary" role="tabpanel">
<div class="row">
<div class="col-lg-9">
<?php if(SESSION) { ?>
<div class="row write-comment">
<div class="col-2 pr-0">
<a href="/user?ID=<?=SESSION["user"]["id"]?>"><img src="<?=Thumbnails::GetStatus("rendering")?>" data-src="<?=Thumbnails::GetAvatar(SESSION["user"]["id"])?>" class="img-fluid"></a>
</div>
<div class="col-10">
<div class="card">
<div class="card-header bg-primary text-light py-2">Write a comment!</div>
<div class="card-body py-2">
<textarea class="form-control p-0 border-none" rows="2" style="resize:none"></textarea>
</div>
<div class="text-right">
<span class="text-danger post-error d-none">Please wait 60 seconds before posting another comment</span>
<button class="btn btn-sm btn-primary post-comment"><span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span> Comment</button>
</div>
</div>
</div>
</div>
<?php } ?>
<div class="divider-bottom my-3"></div>
<div class="no-items d-none">
<div class="row comment">
<div class="col-2 pr-0 mb-3">
<img src="/img/ProjectPolygon.png" class="img-fluid">
</div>
<div class="col-10 mb-3">
<div class="card">
<div class="card-header py-2">
Nobody has posted any comments for this item
</div>
<div class="card-body py-2">
<p>Come and share your thoughts about it!</p>
</div>
</div>
</div>
</div>
</div>
<div class="items"></div>
<div class="pagination form-inline justify-content-center d-none">
<button type="button" class="btn btn-light mx-2 back"><h5 class="mb-0"><i class="fal fa-caret-left"></i></h5></button>
<span>Page</span>
<input class="form-control form-control-sm text-center mx-1 px-0 page" type="text" data-last-page="1" style="width:40px">
<span>of <span class="pages">10</span></span>
<button type="button" class="btn btn-light mx-2 next"><h5 class="mb-0"><i class="fal fa-caret-right"></i></h5></button>
</div>
<div class="text-center">
<div class="loading"><span class="jumbo spinner-border" role="status"></span></div>
<a class="btn btn-light btn-sm show-more d-none">Show More</a>
</div>
<div class="template d-none">
<div class="row comment">
<div class="col-2 pr-0 mb-3">
<a href="/user?ID=$commenter_id"><img data-src="$commenter_avatar" class="img-fluid"></a>
</div>
<div class="col-10 mb-3">
<div class="card">
<div class="card-header py-2">
Posted $time by <a href="/user?ID=$commenter_id">$commenter_name</a>
</div>
<div class="card-body py-2">
<p>$content</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php } ?>
</div>
</div>
</div>
<?php $pageBuilder->buildFooter(); ?>