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 { getJSONfromString } from "../../helpers/stringHelpers.ts";
import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
import { getAllianceClient } from "../../services/guildService.ts";
import { getInventory } from "../../services/inventoryService.ts";
import { getAccountForRequest, getBuildLabel } from "../../services/loginService.ts";
import { broadcastGuildUpdate } from "../../services/wsService.ts";
import { eGuildPermission } from "../../types/guildTypes.ts";
import type { RequestHandler } from "express";

export const createAllianceController: RequestHandler = async (req, res) => {
    const account = await getAccountForRequest(req);
    const inventory = await getInventory(account._id, "GuildId");
    const guild = (await Guild.findById(inventory.GuildId!, "Name Tier AllianceId"))!;
    if (guild.AllianceId) {
        res.status(400).send("Guild is already in an alliance").end();
        return;
    }
    const guildMember = (await GuildMember.findOne({ guildId: guild._id, accountId: account._id }, "rank"))!;
    if (guildMember.rank > 1) {
        res.status(400).send("Invalid permission").end();
        return;
    }
    const data: ICreateAllianceRequest = req.body
        ? getJSONfromString<ICreateAllianceRequest>(String(req.body))
        : { allianceName: decodeURIComponent(req.query.allianceName as string) };
    const alliance = new Alliance({ Name: data.allianceName });
    try {
        await alliance.save();
    } catch (e) {
        res.status(400).send("Alliance name already in use").end();
        return;
    }
    guild.AllianceId = alliance._id;
    await Promise.all([
        guild.save(),
        AllianceMember.insertOne({
            allianceId: alliance._id,
            guildId: guild._id,
            Pending: false,
            Permissions:
                eGuildPermission.Ruler |
                eGuildPermission.Promoter |
                eGuildPermission.Recruiter |
                eGuildPermission.Treasurer |
                eGuildPermission.ChatModerator |
                eGuildPermission.Tactician
        })
    ]);
    const buildLabel = getBuildLabel(req, account);
    res.json(await getAllianceClient(alliance, guild, buildLabel));
    broadcastGuildUpdate(req, guild._id.toString());
};

interface ICreateAllianceRequest {
    allianceName: string;
}