SpaceNinjaServer/src/services/guildService.ts

93 lines
3.7 KiB
TypeScript
Raw Normal View History

import { Request } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory } from "@/src/services/inventoryService";
import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel";
2025-01-03 22:17:34 +01:00
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes";
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { Types } from "mongoose";
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId);
2025-01-03 09:06:50 +01:00
return await getGuildForRequestEx(req, inventory);
};
export const getGuildForRequestEx = async (
req: Request,
inventory: TInventoryDatabaseDocument
): Promise<TGuildDatabaseDocument> => {
const guildId = req.query.guildId as string;
if (!inventory.GuildId || inventory.GuildId.toString() != guildId) {
throw new Error("Account is not in the guild that it has sent a request for");
}
const guild = await Guild.findOne({ _id: guildId });
if (!guild) {
2025-01-03 09:06:50 +01:00
throw new Error("Account thinks it is in a guild that doesn't exist");
}
return guild;
};
export const getDojoClient = (
guild: TGuildDatabaseDocument,
status: number,
componentId: Types.ObjectId | undefined = undefined
): IDojoClient => {
const dojo: IDojoClient = {
_id: { $oid: guild._id.toString() },
Name: guild.Name,
Tier: 1,
FixedContributions: true,
DojoRevision: 1,
RevisionTime: Math.round(Date.now() / 1000),
Energy: guild.DojoEnergy,
Capacity: guild.DojoCapacity,
DojoRequestStatus: status,
DojoComponents: []
};
guild.DojoComponents.forEach(dojoComponent => {
if (!componentId || componentId == dojoComponent._id) {
const clientComponent: IDojoComponentClient = {
id: toOid(dojoComponent._id),
pf: dojoComponent.pf,
ppf: dojoComponent.ppf,
Name: dojoComponent.Name,
Message: dojoComponent.Message,
DecoCapacity: dojoComponent.DecoCapacity ?? 600
};
if (dojoComponent.pi) {
clientComponent.pi = toOid(dojoComponent.pi);
clientComponent.op = dojoComponent.op!;
clientComponent.pp = dojoComponent.pp!;
}
if (dojoComponent.CompletionTime) {
clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime);
} else {
clientComponent.RegularCredits = dojoComponent.RegularCredits;
clientComponent.MiscItems = dojoComponent.MiscItems;
}
if (dojoComponent.Decos) {
clientComponent.Decos = [];
for (const deco of dojoComponent.Decos) {
clientComponent.Decos.push({
id: toOid(deco._id),
Type: deco.Type,
Pos: deco.Pos,
Rot: deco.Rot,
CompletionTime: deco.CompletionTime ? toMongoDate(deco.CompletionTime) : undefined,
RegularCredits: deco.RegularCredits,
MiscItems: deco.MiscItems
});
}
}
dojo.DojoComponents.push(clientComponent);
}
});
return dojo;
};
export const scaleRequiredCount = (count: number): number => {
// The recipes in the export are for Moon clans. For now we'll just assume we only have Ghost clans.
return Math.max(1, Math.trunc(count / 100));
};