301 lines
14 KiB
PHP
301 lines
14 KiB
PHP
<?php require $_SERVER['DOCUMENT_ROOT'].'/api/private/core.php';
|
|
Polygon::ImportClass("Catalog");
|
|
|
|
Users::RequireLogin();
|
|
|
|
if (!Polygon::$GamesEnabled)
|
|
{
|
|
pageBuilder::errorCode(403, [
|
|
"title" => "Games are currently closed",
|
|
"text" => "See <a href=\"/forum/showpost?PostID=2380\">this announcement</a> for more information"
|
|
]);
|
|
}
|
|
|
|
$serverID = $_GET['ID'] ?? $_GET['id'] ?? false;
|
|
$server = db::run("SELECT * FROM selfhosted_servers WHERE id = :ServerID", [":ServerID" => $serverID])->fetch(PDO::FETCH_OBJ);
|
|
if(!$server || !Users::IsAdmin(Users::STAFF_ADMINISTRATOR) && $server->hoster != SESSION["userId"]) pageBuilder::errorCode(404);
|
|
|
|
$Whitelist = ($server->PrivacyWhitelist == null) ? [] : json_decode($server->PrivacyWhitelist);
|
|
|
|
Catalog::$GearAttributes = json_decode($server->allowed_gears, true);
|
|
|
|
$alert = false;
|
|
|
|
if($_SERVER['REQUEST_METHOD'] == "POST")
|
|
{
|
|
$delete = $_POST["delete"] ?? false;
|
|
|
|
if($delete)
|
|
{
|
|
db::run("DELETE FROM selfhosted_servers WHERE id = :ServerID", [":ServerID" => $serverID]);
|
|
die();
|
|
}
|
|
|
|
$name = $_POST["name"] ?? false;
|
|
$description = $_POST["description"] ?? false;
|
|
$ip = $_POST["ip"] ?? false;
|
|
$port = $_POST["port"] ?? false;
|
|
$version = $_POST["version"] ?? false;
|
|
$maxplayers = $_POST["maxplayers"] ?? false;
|
|
$Privacy = $_POST["Privacy"] ?? "Public";
|
|
$pbs = in_array($version, ["2011", "2012"]) && isset($_POST["pbs"]) && $_POST["pbs"] == "on";
|
|
Catalog::ParseGearAttributes();
|
|
|
|
if(empty($name)) $alert = ["text" => "Server name cannot be empty", "color" => "danger"];
|
|
else if(strlen($name) > 50) $alert = ["text" => "Server name cannot be longer than 50 characters", "color" => "danger"];
|
|
else if(strlen($description) > 1000) $alert = ["text" => "Server description cannot be longer than 1000 characters", "color" => "danger"];
|
|
else if(Polygon::IsExplicitlyFiltered($name)) $alert = ["text" => "The name contains inappropriate text", "color" => "danger"];
|
|
else if(Polygon::IsExplicitlyFiltered($description)) $alert = ["text" => "The description contains inappropriate text", "color" => "danger"];
|
|
else if(empty($ip)) $alert = ["text" => "IP address cannot be empty", "color" => "danger"];
|
|
else if(!filter_var($ip, FILTER_VALIDATE_IP)) $alert = ["text" => "Invalid IP address", "color" => "danger"];
|
|
else if(!is_numeric($port) || $port < 1 || $port > 65536) { $alert = ["text" => "Invalid port", "color" => "danger"]; $port = false; }
|
|
else if(!in_array($version, ["2010", "2011", "2012"])) $alert = ["text" => "Invalid version", "color" => "danger"];
|
|
else if (!in_array($Privacy, ["Public", "Private"])) $alert = ["text" => "Privacy must be set to Public or Private", "color" => "danger"];
|
|
else if(!is_numeric($maxplayers) || $maxplayers < 1 || $maxplayers > 100)
|
|
{
|
|
$alert = ["text" => "Maximum player count must be between 1 to 100", "color" => "danger"];
|
|
$maxplayers = false;
|
|
}
|
|
else
|
|
{
|
|
$server->name = $name;
|
|
$server->description = $description;
|
|
$server->ip = $ip;
|
|
$server->port = $port;
|
|
$server->version = $version;
|
|
$server->maxplayers = $maxplayers;
|
|
$server->Privacy = $Privacy;
|
|
$server->allowed_gears = json_encode(Catalog::$GearAttributes);
|
|
$server->pbs = $pbs;
|
|
|
|
$query = $pdo->prepare("UPDATE selfhosted_servers SET name = :name, description = :desc, ip = :ip, port = :port, version = :version, maxplayers = :players, Privacy = :privacy, allowed_gears = :gears, pbs = :pbs WHERE id = :id");
|
|
$query->bindParam(":name", $server->name, PDO::PARAM_STR);
|
|
$query->bindParam(":desc", $server->description, PDO::PARAM_STR);
|
|
$query->bindParam(":ip", $server->ip, PDO::PARAM_STR);
|
|
$query->bindParam(":port", $server->port, PDO::PARAM_INT);
|
|
$query->bindParam(":version", $server->version, PDO::PARAM_INT);
|
|
$query->bindParam(":players", $server->maxplayers, PDO::PARAM_INT);
|
|
$query->bindParam(":privacy", $server->Privacy, PDO::PARAM_STR);
|
|
$query->bindParam(":gears", $server->allowed_gears, PDO::PARAM_STR);
|
|
$query->bindParam(":pbs", $server->pbs, PDO::PARAM_INT);
|
|
$query->bindParam(":id", $serverID, PDO::PARAM_INT);
|
|
$query->execute();
|
|
|
|
$alert = ["text" => "Your changes to this server have been saved (".date('h:i:s A').")", "color" => "primary"];
|
|
}
|
|
}
|
|
|
|
pageBuilder::$pageConfig["title"] = "Configure Server";
|
|
pageBuilder::buildHeader();
|
|
?>
|
|
<h2 class="font-weight-normal">Configure Server</h2>
|
|
<a href="/games/server?ID=<?=$server->id?>">Back</a>
|
|
<div class="m-auto" style="max-width: 30rem">
|
|
<?php if($alert) { ?><div class="alert alert-<?=$alert["color"]?> px-2 py-1" role="alert"><?=$alert["text"]?></div><?php } ?>
|
|
<p class="mb-2"><i class="fas fa-exclamation-triangle text-warning"></i> IMPORTANT: Please use a VPN for hosting servers if you can. There are some VPNs that do feature port forwarding.</p>
|
|
<form method="post">
|
|
<div class="form-group">
|
|
<label for="name" class="mb-0">Name: </label>
|
|
<input type="text" class="form-control form-control-sm" name="name" id="name" maxlength="50" tabindex="1" placeholder="Server name"<?=$server->name?' value="'.htmlspecialchars($server->name).'"':''?>>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="description" class="mb-0">Description: </label>
|
|
<textarea class="form-control" name="description" id="description" style="resize:none" rows="6" maxlength="1000" tabindex="2" placeholder="Server description - optional"><?=$server->description?htmlspecialchars($server->description):''?></textarea>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6 form-group">
|
|
<span><label for="name" class="mb-0">IP Address:</label> <a href="#" class="float-right" onclick="$('#ip').val('<?=GetIPAddress()?>')">Use current address</a></span>
|
|
<input type="text" class="form-control form-control-sm" name="ip" id="ip" tabindex="3" placeholder="Server IP Address"<?=$server->ip?' value="'.htmlspecialchars($server->ip).'"':''?>>
|
|
</div>
|
|
<div class="col-sm-6 form-group">
|
|
<label for="name" class="mb-0">Port:</label>
|
|
<input type="number" class="form-control form-control-sm" name="port" id="port" min="1" max="65536" tabindex="4" value="<?=$server->port?$server->port:'53640'?>">
|
|
</div>
|
|
<div class="col-sm-6 form-group">
|
|
<label for="transactionType" class="mb-0">Version: </label>
|
|
<select class="form-control form-control-sm" name="version" id="version" tabindex="5">
|
|
<option<?=$server->version==2010?' selected="selected"':''?>>2010</option>
|
|
<option<?=$server->version==2011?' selected="selected"':''?>>2011</option>
|
|
<option<?=$server->version==2012?' selected="selected"':''?>>2012</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-sm-6 form-group">
|
|
<label for="name" class="mb-0">Maximum Players:</label>
|
|
<input type="number" class="form-control form-control-sm" name="maxplayers" id="maxplayers" min="1" max="2147483648" tabindex="6" value="<?=$server->maxplayers?>">
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6 form-group">
|
|
<label for="transactionType" class="mb-0">Privacy: </label>
|
|
<select class="form-control form-control-sm" name="Privacy" id="privacy" tabindex="5">
|
|
<option<?=$server->Privacy == "Public" ? ' selected="selected"':''?>>Public</option>
|
|
<option<?=$server->Privacy == "Private" ? ' selected="selected"':''?>>Private</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-sm-6 server-whitelist"<?=$server->Privacy == "Public" ? ' style="display:none"':''?>>
|
|
<label class="mb-0"><i class="fas fa-question-circle" title="With a private server, only people you add here will be able to see your server." data-toggle="tooltip"></i> Whitelist: </label>
|
|
<div class="input-group">
|
|
<input class="form-control form-control-sm add-whitelist-username" type="search" placeholder="Username">
|
|
<div class="input-group-append">
|
|
<button class="btn btn-sm btn-success add-whitelist-button"><span class="spinner-border spinner-border-sm d-none"></span> Add</button>
|
|
</div>
|
|
</div>
|
|
<div class="card server-whitelist-members items my-2"<?=count($Whitelist) < 1 ? ' style="display:none"':''?>>
|
|
<?php foreach ($Whitelist as $Member) { $Username = Users::GetNameFromID($Member); ?>
|
|
<div class="item-striped px-2 py-1" data-username="<?=$Username?>"><a class="text-danger remove-whitelist-button" href="#"><i class="far fa-trash-alt"></i></a> <?=$Username?></div>
|
|
<?php } ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pbs-tools mb-3 form-group row"<?=in_array($server->version, [2010])?' style="display:none"':''?>>
|
|
<label class="col-sm-4 mb-0">Enable PBS tools:</label>
|
|
<div class="form-check col-sm-8">
|
|
<input type="checkbox" class="form-check-input" id="pbs" name="pbs"<?=$server->pbs?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="pbs"> (experimental)</label>
|
|
</div>
|
|
</div>
|
|
<div class="gear-types mb-3">
|
|
<label class="mb-0">Gear types:</label>
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_melee" name="gear_melee"<?=Catalog::$GearAttributes["melee"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_melee">Melee</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_powerup" name="gear_powerup"<?=Catalog::$GearAttributes["powerup"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_powerup">Power ups</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_ranged" name="gear_ranged"<?=Catalog::$GearAttributes["ranged"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_ranged">Ranged</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_navigation" name="gear_navigation"<?=Catalog::$GearAttributes["navigation"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_navigation">Navigation</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_explosive" name="gear_explosive"<?=Catalog::$GearAttributes["explosive"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_explosive">Explosives</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_musical" name="gear_musical"<?=Catalog::$GearAttributes["musical"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_musical">Musical</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_social" name="gear_social"<?=Catalog::$GearAttributes["social"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_social">Social</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_transport" name="gear_transport"<?=Catalog::$GearAttributes["transport"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_transport">Transport</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="gear_building" name="gear_building"<?=Catalog::$GearAttributes["building"]?' checked="checked"':''?>>
|
|
<label class="form-check-label" for="gear_building">Building</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="text-center">
|
|
<button type="submit" class="btn btn-primary btn-sm" style="min-width:4rem">Update</button>
|
|
<a class="btn btn-secondary btn-sm" href="/games/server?ID=<?=$server->id?>" style="min-width:4rem">Cancel</a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<a href="/games/server?ID=<?=$server->id?>">Back</a>
|
|
<script>
|
|
$("#version").change(function()
|
|
{
|
|
if ($(this).val() == 2010)
|
|
$('.pbs-tools').hide(400);
|
|
else
|
|
$('.pbs-tools').show(400);
|
|
});
|
|
|
|
$("#privacy").change(function()
|
|
{
|
|
if ($(this).val() == "Public")
|
|
$('.server-whitelist').hide(400);
|
|
else
|
|
$('.server-whitelist').show(400);
|
|
});
|
|
|
|
$(".add-whitelist-button").click(function(event)
|
|
{
|
|
event.preventDefault();
|
|
|
|
var button = this;
|
|
var Username = $(".add-whitelist-username").val();
|
|
|
|
polygon.button.busy(button);
|
|
|
|
$.post(
|
|
"/api/games/edit-whitelist",
|
|
{ServerID: <?=$server->id?>, Username: Username, Action: "Add"},
|
|
function(data)
|
|
{
|
|
if (data.success)
|
|
{
|
|
toastr["success"](data.message);
|
|
$(".server-whitelist-members").append("<div class=\"item-striped px-2 py-1\" data-username=\"" + Username + "\"><a class=\"text-danger remove-whitelist-button\" href=\"#\"><i class=\"far fa-trash-alt\"></i></a> " + Username + "</div>");
|
|
$(".server-whitelist-members").show();
|
|
}
|
|
else
|
|
{
|
|
toastr["error"](data.message);
|
|
}
|
|
|
|
polygon.button.active(button);
|
|
}
|
|
);
|
|
});
|
|
|
|
$(".app").on("click", ".remove-whitelist-button", function()
|
|
{
|
|
var Listing = $(this).closest(".item-striped");
|
|
var Username = Listing.attr("data-username");
|
|
|
|
$.post(
|
|
"/api/games/edit-whitelist",
|
|
{ServerID: <?=$server->id?>, Username: Username, Action: "Remove"},
|
|
function(data)
|
|
{
|
|
if (data.success)
|
|
{
|
|
toastr["success"](data.message);
|
|
Listing.remove();
|
|
|
|
if ($(".server-whitelist-members div").length < 1)
|
|
$(".server-whitelist-members").hide();
|
|
}
|
|
else
|
|
{
|
|
toastr["error"](data.message);
|
|
}
|
|
}
|
|
);
|
|
});
|
|
</script>
|
|
<?php pageBuilder::buildFooter(); ?>
|