<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>StarKingdoms</title>
</head>
<body>
<h1>StarKingdoms</h1>
<fieldset class="joingamebox">
<legend>Join Game</legend>
<form action="/play.html" method="GET">
<label for="server">Choose server</label>
<select class="joingamecontent" name="server" id="server">
<!-- Dynamically filled by the JS later in this file -->
</select>
<br>
<label for="textures">Texture quality</label>
<select class="joingamecontent" name="textures" id="textures">
<option value="full">Full quality (May impact loading times)</option>
<option selected value="375">Medium quality (Recommended)</option>
<option value="125">Low quality</option>
</select>
<br>
<label for="username">Username</label>
<br>
<input class="m-5px" type="text" name="username" id="username" required/>
<br>
<button class="m-5px w-full">Launch!</button>
<br>
<p id="loginstatus">You are not logged in.</p>
<button style="display: none;" id="logout">Log out</button>
<a href="http://localhost:8080/select-realm" id="login">Click here to log in or change accounts.</a>
</form>
</fieldset>
<script type="module">
let api_server = "http://localhost:8080";
let servers = [];
function server_url_to_ping_url(server) {
if(server.endsWith('/')) {
return server + "ping"
} else {
return server + "/ping"
}
}
function server_url_to_gateway_url(server) {
let url = new URL(server);
if (url.protocol === "https:") {
return "wss://" + url.host + "/ws";
} else {
return "ws://" + url.host + "/ws";
}
}
function load_server(server) {
// ping the server to get server information
fetch(server_url_to_ping_url(server)).then(response => {
response.json().then(response => {
let elem = document.createElement("option");
elem.value = server_url_to_gateway_url(server);
elem.text = `${response.description} - ${response.version.name} - ${response.players} online`;
document.getElementById("server").appendChild(elem);
})
})
}
// load servers from the api
fetch(`${api_server}/server-list`).then(response => {
response.json().then(response => {
servers = response["servers"];
for (let i = 0; i < servers.length; i++) {
load_server(servers[i]);
}
})
})
let query = new URLSearchParams(window.location.search);
if (query.has("token") && query.has("user")) {
window.localStorage.setItem("token", query.get("token"));
window.localStorage.setItem("user", query.get("user"));
}
if (window.localStorage.getItem("token") !== null && window.localStorage.getItem("user") !== null) {
document.getElementById("logout").style.setProperty("display", "block");
document.getElementById("logout").addEventListener("click", () => {
window.localStorage.clear();
window.location.reload();
})
document.getElementById("loginstatus").innerText = `Logged in! (you are ${window.localStorage.getItem("user")})`;
}
document.getElementById("login").href = `${api_server}/select-realm`;
</script>
</body>
<style>
.joingamebox {
width: min-content;
padding: 10px;
}
.m-5px {
margin: 5px;
}
.w-full {
width: 100%;
}
</style>
</html>