Skip to content

Commit

Permalink
feat(admin,sm): Add controls for configuring the servers.2.json endpo…
Browse files Browse the repository at this point in the history
…int (#125)
  • Loading branch information
jespertheend committed Nov 7, 2023
1 parent dbf71cb commit 17ea110
Show file tree
Hide file tree
Showing 11 changed files with 204 additions and 23 deletions.
2 changes: 1 addition & 1 deletion adminPanel/src/GameServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class GameServer {
deleteButton.textContent = "Delete";
this.el.appendChild(deleteButton);
deleteButton.addEventListener("click", () => {
mainInstance.webSocketManager.requestDeleteGameServer(id);
mainInstance.webSocketManager.messenger.send.requestDeleteGameServer(id);
});
}

Expand Down
45 changes: 45 additions & 0 deletions adminPanel/src/LegacyServerManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Main } from "./main.js";

export class LegacyServerManager {
#mainInstance;
#ip4El;
#ip6El;

/**
* @param {Main} mainInstance
*/
constructor(mainInstance) {
this.#mainInstance = mainInstance;

this.el = document.createElement("div");
this.el.classList.add("legay-server-manager");

this.#ip4El = this.#createIpInput("Legacy IPv4: ");
this.#ip6El = this.#createIpInput("Legacy IPv6: ");
}

/**
* @param {string} labelText
*/
#createIpInput(labelText) {
const labelEl = document.createElement("label");
this.el.append(labelEl);
const inputEl = document.createElement("input");
inputEl.addEventListener("change", () => {
this.#mainInstance.webSocketManager.messenger.send.setLegacyServerData({
ipv4: this.#ip4El.value,
ipv6: this.#ip6El.value,
});
});
labelEl.append(labelText, inputEl);
return inputEl;
}

/**
* @param {import("../../serverManager/src/LegacyServerManager.js").LegacyServerData} serverData
*/
setServerData(serverData) {
this.#ip4El.value = serverData.ipv4;
this.#ip6El.value = serverData.ipv6;
}
}
7 changes: 5 additions & 2 deletions adminPanel/src/ServerManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export class ServerManager {
createGameServerButton.textContent = "Create Game Server";
this.el.appendChild(createGameServerButton);
createGameServerButton.addEventListener("click", () => {
main.webSocketManager.requestCreateGameServer();
main.webSocketManager.messenger.send.createGameServer();
});
}

Expand All @@ -36,7 +36,10 @@ export class ServerManager {

const createdGameServer = gameServer;
gameServer.onConfigChange(() => {
this.#mainInstance.webSocketManager.setServerConfig(config.id, createdGameServer.getConfig());
this.#mainInstance.webSocketManager.messenger.send.setGameServerConfig(
config.id,
createdGameServer.getConfig(),
);
});
}

Expand Down
30 changes: 10 additions & 20 deletions adminPanel/src/WebsocketManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ import { TypedMessenger } from "renda";
/** @typedef {ReturnType<WebSocketManager["getResponseHandlers"]>} AdminPanelResponseHandlers */

export class WebSocketManager {
#mainInstance;
/** @type {TypedMessenger<AdminPanelResponseHandlers, import("../../serverManager/src/WebSocketConnection.js").ServerManagerResponseHandlers>} */
#messenger;
#mainInstance;
get messenger() {
return this.#messenger;
}

/**
* @param {import("./main.js").Main} mainInstance
Expand Down Expand Up @@ -53,25 +56,6 @@ export class WebSocketManager {
});
}

requestCreateGameServer() {
this.#messenger.send.createGameServer();
}

/**
* @param {number} id
*/
requestDeleteGameServer(id) {
this.#messenger.send.requestDeleteGameServer(id);
}

/**
* @param {number} id
* @param {import("../../serverManager/src/GameServer.js").GameServerConfig} config
*/
setServerConfig(id, config) {
this.#messenger.send.setGameServerConfig(id, config);
}

getResponseHandlers() {
return {
/**
Expand All @@ -87,6 +71,12 @@ export class WebSocketManager {
udpateServerConfig: (id, config) => {
this.#mainInstance.serverManager.updateGameServerConfig(id, config);
},
/**
* @param {import("../../serverManager/src/LegacyServerManager.js").LegacyServerData} serverData
*/
updateLegacyServerData: (serverData) => {
this.#mainInstance.legacyServersManager.setServerData(serverData);
},
};
}
}
3 changes: 3 additions & 0 deletions adminPanel/src/main.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import { LegacyServerManager } from "./LegacyServerManager.js";
import { ServerManager } from "./ServerManager.js";
import { WebSocketManager } from "./WebsocketManager.js";

export class Main {
constructor() {
this.webSocketManager = new WebSocketManager(this);
this.legacyServersManager = new LegacyServerManager(this);
this.serverManager = new ServerManager(this);
}
}

const main = new Main();
globalThis.main = main;

document.body.appendChild(main.legacyServersManager.el);
document.body.appendChild(main.serverManager.el);
6 changes: 6 additions & 0 deletions adminPanel/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,9 @@ html, body{
display: flex;
gap: 15px;
}

.legay-server-manager {
display: flex;
flex-direction: column;
margin-bottom: 10px;
}
3 changes: 3 additions & 0 deletions serverManager/src/GameServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ export class GameServer {
#public = false;
#official = false;
#recommended = false;
get recommended() {
return this.#recommended;
}
#needsControlSocket = true;
#displayName = "";
#endpoint = "";
Expand Down
97 changes: 97 additions & 0 deletions serverManager/src/LegacyServerManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { Main } from "./Main.js";

/**
* @typedef LegacyServerData
* @property {string} ipv6
* @property {string} ipv4
*/

const PERSISTENT_STORAGE_KEY = "legacyServersManagerData";

export class LegacyServerManager {
#mainInstance;

/** @type {LegacyServerData} */
#serverData = {
ipv4: "",
ipv6: "",
};

/**
* @param {Main} mainInstance
*/
constructor(mainInstance) {
this.#mainInstance = mainInstance;

const loadedData = this.#mainInstance.persistentStorage.get(PERSISTENT_STORAGE_KEY);
if (loadedData && typeof loadedData == "object") {
if ("ipv4" in loadedData && typeof loadedData.ipv4 == "string") {
this.#serverData.ipv4 = loadedData.ipv4;
}
if ("ipv6" in loadedData && typeof loadedData.ipv6 == "string") {
this.#serverData.ipv6 = loadedData.ipv6;
}
}
}

/**
* @param {LegacyServerData} data
*/
setServerData(data) {
this.#serverData = data;
this.#mainInstance.websocketManager.sendAllLegacyServerData(data);
this.#mainInstance.persistentStorage.set(PERSISTENT_STORAGE_KEY, data);
}

getServerData() {
return {
...this.#serverData,
};
}

getServersJson() {
return {
retentionSamples: [],
teamServers: [],
mobileAdData: {
videoInterstitialRate: -1,
limitFrequencySeconds: 300,
disabledNetworks: "",
promoBannerUrls: [
"ducklings",
],
doBanner: true,
promoBannerUrl: "https://splix.io/banners/ducklings/index.html",
showPromoForPatreonUsers: true,
},
locations: [
{
pingIpv4: "splix.io",
loc: "nyc",
gamemodes: [
{
gm: "default",
versions: [
{
lobbies: [
{
securePort: 443,
ipv6: this.#serverData.ipv6,
port: 80,
hash: "fish",
ipv4: this.#serverData.ipv4,
},
],
ver: 1,
},
],
},
],
locId: 3,
pingIpv6: "splix.io",
},
],
"requiredMobileVersion": 11,
};
}
}
2 changes: 2 additions & 0 deletions serverManager/src/Main.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { RateLimitManager } from "../../shared/RateLimitManager.js";
import { LeaderboardManager } from "./LeaderboardManager.js";
import { LegacyServerManager } from "./LegacyServerManager.js";
import { PersistentStorage } from "./PersistentStorage.js";
import { ServerManager } from "./ServerManager.js";
import { WebSocketManager } from "./WebSocketManager.js";
Expand All @@ -14,6 +15,7 @@ export class Main {
this.persistentStorage = new PersistentStorage(persistentStoragePath);
this.leaderboardManager = new LeaderboardManager(this.persistentStorage);
this.servermanager = new ServerManager(this);
this.legacyServerManager = new LegacyServerManager(this);
this.websocketManager = new WebSocketManager(this, websocketAuthToken);
this.authRateLimitManager = new RateLimitManager({ alwaysUseMultiConnectionLimit: true });
}
Expand Down
15 changes: 15 additions & 0 deletions serverManager/src/WebSocketConnection.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export class WebSocketConnection {
}
this.#authenticated = true;
this.sendAllServerConfigs();
this.#messenger.send.updateLegacyServerData(this.#mainInstance.legacyServerManager.getServerData());
return true;
},
createGameServer: () => {
Expand All @@ -77,6 +78,12 @@ export class WebSocketConnection {
setGameServerConfig: (id, config) => {
this.#mainInstance.servermanager.setGameServerConfig(id, config);
},
/**
* @param {import("./LegacyServerManager.js").LegacyServerData} serverData
*/
setLegacyServerData: (serverData) => {
return this.#mainInstance.legacyServerManager.setServerData(serverData);
},
};

// Add an assertion that the client is authenticated for all handlers except 'authenticate'.
Expand Down Expand Up @@ -109,4 +116,12 @@ export class WebSocketConnection {
this.#assertAuthenticated();
this.#messenger.send.udpateServerConfig(id, config);
}

/**
* @param {import("./LegacyServerManager.js").LegacyServerData} serverData
*/
sendLegacyServerData(serverData) {
this.#assertAuthenticated();
this.#messenger.send.updateLegacyServerData(serverData);
}
}
17 changes: 17 additions & 0 deletions serverManager/src/WebSocketManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ export class WebSocketManager {
const response = Response.json(data);
response.headers.set("Access-Control-Allow-Origin", "*");
return response;
} else if (
url.pathname == "/servermanager/legacygameservers" || url.pathname == "/json/servers.2.json"
) {
const data = mainInstance.legacyServerManager.getServersJson();
const response = Response.json(data);
response.headers.set("Access-Control-Allow-Origin", "*");
return response;
} else if (url.pathname == "/servermanager/leaderboards" || url.pathname == "/api/leaderboards") {
const data = mainInstance.leaderboardManager.getApiJson();
const response = Response.json(data);
Expand Down Expand Up @@ -80,4 +87,14 @@ export class WebSocketManager {
connection.sendServerConfig(id, config);
}
}

/**
* @param {import("./LegacyServerManager.js").LegacyServerData} serverData
*/
sendAllLegacyServerData(serverData) {
for (const connection of this.#activeConnections) {
if (!connection.authenticated) continue;
connection.sendLegacyServerData(serverData);
}
}
}

0 comments on commit 17ea110

Please sign in to comment.