<!DOCTYPE html> <html lang="en"> <head> <title>MC-Server-Manager</title> <style> .server-listing { border: 3px solid black; padding: 0.5em; } .server-listing + .server-listing { margin-top: 10px; } .server-listing h3 { margin: 0 0 0.5em 0; } .server-listing p { margin: 0.5em 0 0.5em 0; } </style> </head> <body> <h1>MC-Server-Manager</h1> <p> On this site, you'll see a list of available servers. If you've got the correct credentials, you may request to turn on a server if it has automatically shut off due to inactivity. </p> <hr> <div id="servers-container"> <!-- This container will be populated with the list of available servers. --> </div> <dialog id="request-dialog"> <p> Request to start the selected server. </p> <div style="margin-bottom: 0.5em"> <label for="client-key-input">Enter your client key:</label> <input type="password" name="client-key" id="client-key-input"/> </div> <div style="margin-bottom: 0.5em"> <label for="server-name-input">Server Name</label> <input type="text" name="server-name" id="server-name-input" disabled/> </div> <button onclick="submitServerRequest()">Submit</button> <button onclick="closeRequestDialog()">Cancel</button> </dialog> <dialog id="message-dialog"> <p></p> <button onclick="document.getElementById('message-dialog').close()">Close</button> </dialog> <script> async function getServers() { const response = await fetch("/api/servers"); return await response.json(); } function makeServerListingDiv(serverObj) { const div = document.createElement("div"); div.className = "server-listing"; const header = document.createElement("h3"); header.innerText = serverObj.name; div.appendChild(header); const playersList = document.createElement("p"); let text = "Players: "; if (serverObj.playerNames.length == 0) { text += "None"; } else { for (let i = 0; i < serverObj.playerNames.length; i++) { text += serverObj.playerNames[i]; if (i + 1 < serverObj.playerNames.length) { text += ", "; } } } playersList.innerText = text; div.appendChild(playersList); const onlineIndicator = document.createElement("p"); onlineIndicator.innerText = serverObj.online ? "Online" : "Offline"; if (serverObj.online) { onlineIndicator.style = "color: green"; } else { onlineIndicator.style = "color: red"; } div.appendChild(onlineIndicator); if (serverObj.startupRequested) { const startupRequestedIndicator = document.createElement("p"); startupRequestedIndicator.innerText = "Startup has been requested. Server should start shortly."; startupRequestedIndicator.style = "font-style: italic"; div.appendChild(startupRequestedIndicator); } if (!serverObj.online && !serverObj.startupRequested) { const requestButton = document.createElement("button"); requestButton.innerText = "Request to start this server"; requestButton.addEventListener("click", () => openRequestDialog(serverObj.name)); div.appendChild(requestButton); } return div; } function openRequestDialog(serverName) { const serverNameInput = document.getElementById("server-name-input"); serverNameInput.value = serverName; const dialog = document.getElementById("request-dialog"); dialog.showModal(); } function closeRequestDialog() { const dialog = document.getElementById("request-dialog"); dialog.close(); const clientKeyInput = document.getElementById("client-key-input"); clientKeyInput.value = ""; } async function submitServerRequest() { const serverName = document.getElementById("server-name-input").value; const clientKey = document.getElementById("client-key-input").value; if (typeof(serverName) !== "string" || typeof(clientKey) !== "string") { return; } const dialog = document.getElementById("request-dialog"); closeRequestDialog(); try { const response = await fetch(`/api/servers/${serverName}/requests`, { method: "POST", headers: { "X-Client-Key": clientKey } }); if (!response.ok) { showMessageDialog("The request was rejected: " + response.status); } else { showMessageDialog("The request was submitted."); } } catch (error) { showMessageDialog("Failed to submit request: " + error); } } function showMessageDialog(message) { const dialog = document.getElementById("message-dialog"); const p = dialog.children[0]; p.innerText = message; dialog.showModal(); window.setTimeout(() => dialog.close(), 3000); } async function refreshServers() { const containerDiv = document.getElementById("servers-container"); try { const servers = await getServers(); containerDiv.replaceChildren(...servers.map(s => makeServerListingDiv(s))); } catch (error) { console.error("Failed to fetch servers from the API.", error); const errorMessage = document.createElement("p"); errorMessage.innerText = "Failed to fetch servers from the API. " + error; errorMessage.style = "color: red"; containerDiv.replaceChildren(errorMessage); } } refreshServers(); window.setInterval(refreshServers, 1000); </script> </body> </html>