mcgrizz/routes/api/forge/index.ts

79 lines
2.2 KiB
TypeScript

import { Handlers } from "$fresh/server.ts";
import { SERVER_STATE } from "../../../state/serverState.ts";
import { downloadFile } from "../../../util/download.ts";
import { getForgeDownload } from "../../../util/forge.ts";
import { getGameVersions } from "../../../util/gameVersions.ts";
export const handler: Handlers = {
async GET(_req, _ctx) {
const gameVersions = await getGameVersions();
return new Response(JSON.stringify({
gameVersions,
}));
},
async POST(req, _ctx) {
try {
const data = await req.formData();
// TODO: update for instances
await downloadFile(
await getForgeDownload(data.get("game") as string || "1.20.1"),
"./server/installer.jar",
);
const installer = new Deno.Command("java", {
args: [
"-Xmx2G",
"-jar",
"./installer.jar",
"--installServer",
],
stderr: "piped",
stdout: "piped",
cwd: "./server",
});
// const process = installer.spawn();
// process.stderr.pipeTo(Deno.stderr.writable);
// process.stdout.pipeTo(Deno.stdout.writable);
const { success } = await installer.output();
if (!success) throw "failed to install forge server";
const argFile = "./server/user_jvm_args.txt";
const jvmArgs = await Deno.readTextFile(argFile);
const memArgRx = /^(#\s)?(-Xmx)(.+)$/m;
await Deno.writeTextFile(
argFile,
jvmArgs.replace(
memArgRx,
jvmArgs.match(memArgRx)?.at(0)?.replace(/#\s?/, "") || "-Xmx4G",
),
);
const runFiles = ["./server/run.sh", "./server/run.bat"];
for (const runFile of runFiles) {
const file = (await Deno.readTextFile(runFile))
.replace("_args.txt", (e) => e + " nogui");
await Deno.writeTextFile(runFile, file);
}
SERVER_STATE.serverType = "forge";
await SERVER_STATE.startMCServer();
const url = new URL(req.url);
return Response.redirect(url.origin + "/setup/eula", 303);
// return Response.redirect(url.origin + "/terminal", 303);
} catch (e) {
console.log(e);
return new Response("Something bad happened", { status: 500 });
}
},
};