XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
UTF-8
import express, { type RequestHandler } from "express";
import path from "path";
import fs from "fs/promises";
import { repoDir, rootDir } from "../helpers/pathHelper.ts";
import { args } from "../helpers/commandLineArguments.ts";
import { config, type IWebuiConfig } from "../services/configService.ts";

const baseDir = args.dev ? repoDir : rootDir;

const webuiRouter = express.Router();

// Redirect / to /webui/
webuiRouter.get("/", (_req, res) => {
    if (config.webui?.enabled ?? true) {
        res.redirect("/webui/");
    } else {
        res.sendStatus(404);
    }
});

// Redirect /webui to /webui/
webuiRouter.use("/webui", (req, res, next) => {
    if (req.originalUrl === "/webui" && (config.webui?.enabled ?? true)) {
        return res.redirect("/webui/");
    }
    next();
});

// Serve virtual routes
const virtualRouteController: RequestHandler = async (_req, res) => {
    if (config.webui?.enabled ?? true) {
        res.set("Content-Type", "text/html;charset=utf8");
        res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
    } else {
        res.sendStatus(404);
    }
};
webuiRouter.get("/webui/", virtualRouteController); // can be handled by express.static, but would not check webui.enabled config.
webuiRouter.get("/webui/inventory", virtualRouteController);
webuiRouter.get("/webui/details", virtualRouteController);
webuiRouter.get("/webui/detailedView", virtualRouteController);
webuiRouter.get("/webui/mods", virtualRouteController);
webuiRouter.get("/webui/cheats", virtualRouteController);
webuiRouter.get("/webui/settings", virtualRouteController);
webuiRouter.get("/webui/import", virtualRouteController);
webuiRouter.get("/webui/clan", virtualRouteController);
webuiRouter.get("/webui/guildView", virtualRouteController);
webuiRouter.get("/webui/users", virtualRouteController);
webuiRouter.get("/webui/admin", virtualRouteController);

// Serve static files
webuiRouter.use("/webui", express.static(path.join(baseDir, "static/webui")));

// Serve favicon
webuiRouter.get("/favicon.ico", async (_req, res) => {
    res.set("Content-Type", "image/vnd.microsoft.icon");
    res.send(await fs.readFile(path.join(repoDir, "static/fixed_responses/favicon.ico")));
});

// Serve config
webuiRouter.get("/webui/config.js", (_req, res) => {
    const client_config: Pick<IWebuiConfig, "defaultLanguage"> = {
        defaultLanguage: config.webui?.defaultLanguage
    };
    res.set("Content-Type", "text/javascript;charset=utf8");
    res.send("webui_conf=" + JSON.stringify(client_config));
});

// Serve warframe-riven-info
webuiRouter.get("/webui/riven-tool/", async (_req, res) => {
    res.set("Content-Type", "text/html;charset=utf8");
    res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/index.html")));
});
webuiRouter.get("/webui/riven-tool/RivenParser.js", async (_req, res) => {
    res.set("Content-Type", "text/javascript;charset=utf8");
    res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/RivenParser.js")));
});

// Serve translations
webuiRouter.get("/webui/translations/:file", async (req, res) => {
    res.set("Content-Type", "text/javascript;charset=utf8");
    res.send(await fs.readFile(path.join(baseDir, `static/webui/translations/${req.params.file}`)));
});

export { webuiRouter };