Update Healer Man server

This commit is contained in:
phenom committed 2026-09-26 17:51:56 -04:00
1 parent 9c5fb4c614
commit bd073fb00f
113 files changed
+4902 -273

No files matched your search

+75 -1
View File
@@ -4,6 +4,7 @@ import path from "node:path";
import { fileURLToPath } from "node:url";
import { GameDatabaseError, openGameDatabase } from "./database.mjs";
import { createArenaService } from "./arena-service.mjs";
import { createDungeonRaceService } from "./dungeon-race-service.mjs";
import { publicManastormAdminConfig } from "./manastorm-config.mjs";
import { createOnlineSessionManager } from "./online-session.mjs";
import { upgradeArenaWebSocket } from "./websocket.mjs";
@@ -188,6 +189,7 @@ export function createGameServer(options = {}) {
});
const onlineSessions = createOnlineSessionManager();
const arenaService = createArenaService({ database: gameDatabase, autoPump: enableShelvedModes });
const dungeonRaceService = createDungeonRaceService({ database: gameDatabase });
const allowAuthRequest = createAuthLimiter();
const allowReportRequest = createAuthLimiter();
const allowDungeonRunRequest = createAuthLimiter();
@@ -303,6 +305,40 @@ export function createGameServer(options = {}) {
json(response, 200, { account: gameDatabase.authenticate(bearerToken(request)) });
return;
}
if (url.pathname === "/api/dungeon-races/leaderboard" && request.method === "GET") {
json(response, 200, gameDatabase.listDungeonRaceLeaderboard({
view: url.searchParams.get("view") ?? "wins",
period: url.searchParams.get("period") ?? "30d",
dungeonId: url.searchParams.get("dungeon") || null,
limit: Number(url.searchParams.get("limit") ?? 20),
offset: Number(url.searchParams.get("offset") ?? 0),
}));
return;
}
if (url.pathname === "/api/dungeon-races/queue" && request.method === "POST") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, dungeonRaceService.queue(account, await readJson(request, 4 * 1024)));
return;
}
if (url.pathname === "/api/dungeon-races/queue" && request.method === "DELETE") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, dungeonRaceService.leave(account));
return;
}
if (url.pathname === "/api/dungeon-races/state" && request.method === "GET") {
const account = gameDatabase.authenticate(bearerToken(request));
json(response, 200, dungeonRaceService.state(account));
return;
}
const dungeonRaceMatch = /^\/api\/dungeon-races\/(race-[A-Za-z0-9-]+)\/(ready|finish|forfeit)$/.exec(url.pathname);
if (dungeonRaceMatch && request.method === "POST") {
const account = gameDatabase.authenticate(bearerToken(request));
const [, id, action] = dungeonRaceMatch;
json(response, 200, action === "ready" ? dungeonRaceService.ready(account, id)
: action === "finish" ? dungeonRaceService.finish(account, id, await readJson(request, 4 * 1024))
: dungeonRaceService.leave(account, id));
return;
}
if (url.pathname === "/api/dungeon-leaderboards" && request.method === "GET") {
json(response, 200, gameDatabase.listDungeonLeaderboard({ dungeonId: url.searchParams.get("dungeon"),
difficultyId: url.searchParams.get("difficulty"), clear: url.searchParams.get("clear"),
@@ -540,6 +576,43 @@ export function createGameServer(options = {}) {
json(response, 200, result);
return;
}
if (url.pathname === "/api/party-buff-policy" && request.method === "GET") {
const current = gameDatabase.getPartyBuffPolicy();
json(response, 200, { revision: current.revision, updatedAt: current.updatedAt, config: current.config });
return;
}
if (url.pathname === "/api/dungeon-queue-policy" && request.method === "GET") {
const current = gameDatabase.getDungeonQueuePolicy();
json(response, 200, { revision: current.revision, updatedAt: current.updatedAt, config: current.config });
return;
}
if (url.pathname === "/api/gm/dungeon-queue-policy" && request.method === "GET") {
const account = gameDatabase.authenticate(bearerToken(request));
if (!gameDatabase.isGameMaster(account)) throw new GameDatabaseError("Game Master access is required.", 403, "gm_required");
json(response, 200, gameDatabase.getDungeonQueuePolicy());
return;
}
if (url.pathname === "/api/gm/dungeon-queue-policy" && request.method === "PUT") {
const account = gameDatabase.authenticate(bearerToken(request));
if (!gameDatabase.isGameMaster(account)) throw new GameDatabaseError("Game Master access is required.", 403, "gm_required");
const body = await readJson(request, bodyLimit);
json(response, 200, gameDatabase.putDungeonQueuePolicy(account, body.expectedRevision, body.config));
return;
}
if (url.pathname === "/api/gm/party-buff-policy" && request.method === "GET") {
const account = gameDatabase.authenticate(bearerToken(request));
if (!gameDatabase.isGameMaster(account)) throw new GameDatabaseError("Game Master access is required.", 403, "gm_required");
json(response, 200, gameDatabase.getPartyBuffPolicy());
return;
}
if (url.pathname === "/api/gm/party-buff-policy" && request.method === "PUT") {
const account = gameDatabase.authenticate(bearerToken(request));
if (!gameDatabase.isGameMaster(account)) throw new GameDatabaseError("Game Master access is required.", 403, "gm_required");
const body = await readJson(request, bodyLimit);
const result = gameDatabase.putPartyBuffPolicy(account, body.expectedRevision, body.config);
json(response, 200, result);
return;
}
if (url.pathname === "/api/companion-spec-readiness" && request.method === "GET") {
const current = gameDatabase.getCompanionSpecReadiness();
json(response, 200, {
@@ -686,9 +759,10 @@ export function createGameServer(options = {}) {
balanceLabJobs.close?.();
onlineSessions.clear();
arenaService.close();
dungeonRaceService.close();
gameDatabase.close();
});
return { server, database: gameDatabase, arenaService, balanceLabJobs, staticDir, contentDir, enableShelvedModes };
return { server, database: gameDatabase, arenaService, dungeonRaceService, balanceLabJobs, staticDir, contentDir, enableShelvedModes };
}
if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {