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

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
UTF-8
import { importInventory, importLoadOutPresets, importPersonalRooms } from "../../services/importService.ts";
import { ensureUserHasFounderHonoria, getInventory } from "../../services/inventoryService.ts";
import { getLoadout } from "../../services/loadoutService.ts";
import { getAccountForRequest, hasPermission } from "../../services/loginService.ts";
import { getPersonalRooms } from "../../services/personalRoomsService.ts";
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
import type { IInventoryClient } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IGetShipResponse } from "../../types/personalRoomsTypes.ts";
import type { RequestHandler } from "express";

export const importController: RequestHandler = async (req, res) => {
    const account = await getAccountForRequest(req);
    if (!hasPermission(account, "import")) {
        res.status(500).send(`Permission denied`).end();
        return;
    }
    const request = req.body as IImportRequest;

    let anyKnownKey = false;
    try {
        const inventory = await getInventory(account._id, undefined);
        importInventory(inventory, request.inventory);
        if (inventory.isModified()) {
            anyKnownKey = true;
            if (inventory.Founder) {
                await ensureUserHasFounderHonoria(inventory);
            }
            await inventory.save();
        }

        if ("LoadOutPresets" in request.inventory && request.inventory.LoadOutPresets) {
            const loadout = await getLoadout(account._id);
            importLoadOutPresets(loadout, request.inventory.LoadOutPresets);
            if (loadout.isModified()) {
                anyKnownKey = true;
                await loadout.save();
            }
        }

        if (
            request.inventory.Ship?.Rooms || // very old accounts may have Ship with { Features: [ ... ] }
            "Apartment" in request.inventory ||
            "TailorShop" in request.inventory
        ) {
            const personalRooms = await getPersonalRooms(account._id);
            importPersonalRooms(personalRooms, request.inventory);
            if (personalRooms.isModified()) {
                anyKnownKey = true;
                await personalRooms.save();
            }
        }

        if (!anyKnownKey) {
            res.send("noKnownKey").end();
        }

        broadcastInventoryUpdate(req);
    } catch (e) {
        console.error(e);
        res.send((e as Error).message);
    }
    res.end();
};

interface IImportRequest {
    inventory: Partial<IInventoryClient> | Partial<IGetShipResponse>;
}