feat: clan vault #1093

Merged
Sainan merged 5 commits from clan-vault into main 2025-03-06 21:24:26 -08:00
10 changed files with 238 additions and 62 deletions

View File

@ -13,12 +13,9 @@ interface IContributeToDojoComponentRequest {
ComponentId: string; ComponentId: string;
DecoId?: string; DecoId?: string;
DecoType?: string; DecoType?: string;
IngredientContributions: { IngredientContributions: IMiscItem[];
ItemType: string;
ItemCount: number;
}[];
RegularCredits: number; RegularCredits: number;
VaultIngredientContributions: []; VaultIngredientContributions: IMiscItem[];
VaultCredits: number; VaultCredits: number;
} }
@ -37,13 +34,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
throw new Error("attempt to contribute to a deco in an unfinished room?!"); throw new Error("attempt to contribute to a deco in an unfinished room?!");
} }
const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!; const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!;
await processContribution(guild, request, inventory, inventoryChanges, meta, component); processContribution(guild, request, inventory, inventoryChanges, meta, component);
} else { } else {
// Room is past "Collecting Materials" // Room is past "Collecting Materials"
if (request.DecoId) { if (request.DecoId) {
const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!; const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!;
const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!; const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!;
await processContribution(guild, request, inventory, inventoryChanges, meta, deco); processContribution(guild, request, inventory, inventoryChanges, meta, deco);
} }
} }
@ -55,23 +52,52 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
}); });
}; };
const processContribution = async ( const processContribution = (
guild: TGuildDatabaseDocument, guild: TGuildDatabaseDocument,
request: IContributeToDojoComponentRequest, request: IContributeToDojoComponentRequest,
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
inventoryChanges: IInventoryChanges, inventoryChanges: IInventoryChanges,
meta: IDojoRecipe, meta: IDojoRecipe,
component: IDojoContributable component: IDojoContributable
): Promise<void> => { ): void => {
component.RegularCredits ??= 0; component.RegularCredits ??= 0;
if (component.RegularCredits + request.RegularCredits > scaleRequiredCount(meta.price)) { if (request.RegularCredits) {
request.RegularCredits = scaleRequiredCount(meta.price) - component.RegularCredits;
}
component.RegularCredits += request.RegularCredits; component.RegularCredits += request.RegularCredits;
inventoryChanges.RegularCredits = -request.RegularCredits; inventoryChanges.RegularCredits = -request.RegularCredits;
updateCurrency(inventory, request.RegularCredits, false); updateCurrency(inventory, request.RegularCredits, false);
}
if (request.VaultCredits) {
component.RegularCredits += request.VaultCredits;
guild.VaultRegularCredits! -= request.VaultCredits;
}
if (component.RegularCredits > scaleRequiredCount(meta.price)) {
guild.VaultRegularCredits ??= 0;
guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price);
component.RegularCredits = scaleRequiredCount(meta.price);
}
component.MiscItems ??= []; component.MiscItems ??= [];
if (request.VaultIngredientContributions.length) {
for (const ingredientContribution of request.VaultIngredientContributions) {
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
if (componentMiscItem) {
const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
if (
componentMiscItem.ItemCount + ingredientContribution.ItemCount >
scaleRequiredCount(ingredientMeta.ItemCount)
) {
ingredientContribution.ItemCount =
scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
}
componentMiscItem.ItemCount += ingredientContribution.ItemCount;
} else {
component.MiscItems.push(ingredientContribution);
}
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == ingredientContribution.ItemType)!;
vaultMiscItem.ItemCount -= ingredientContribution.ItemCount;
}
}
if (request.IngredientContributions.length) {
const miscItemChanges: IMiscItem[] = []; const miscItemChanges: IMiscItem[] = [];
for (const ingredientContribution of request.IngredientContributions) { for (const ingredientContribution of request.IngredientContributions) {
const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType); const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
@ -95,6 +121,7 @@ const processContribution = async (
} }
addMiscItems(inventory, miscItemChanges); addMiscItems(inventory, miscItemChanges);
inventoryChanges.MiscItems = miscItemChanges; inventoryChanges.MiscItems = miscItemChanges;
}
if (component.RegularCredits >= scaleRequiredCount(meta.price)) { if (component.RegularCredits >= scaleRequiredCount(meta.price)) {
let fullyFunded = true; let fullyFunded = true;
@ -106,12 +133,6 @@ const processContribution = async (
} }
} }
if (fullyFunded) { if (fullyFunded) {
if (request.IngredientContributions.length) {
// We've already updated subpaths of MiscItems, we need to allow MongoDB to save this before we remove MiscItems.
await guild.save();
}
component.RegularCredits = undefined;
component.MiscItems = undefined;
component.CompletionTime = new Date(Date.now() + meta.time * 1000); component.CompletionTime = new Date(Date.now() + meta.time * 1000);
} }
} }

View File

@ -0,0 +1,49 @@
import { getGuildForRequestEx } from "@/src/services/guildService";
import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
import { RequestHandler } from "express";
export const contributeToVaultController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId);
const guild = await getGuildForRequestEx(req, inventory);
const request = JSON.parse(String(req.body)) as IContributeToVaultRequest;
if (request.RegularCredits) {
guild.VaultRegularCredits ??= 0;
guild.VaultRegularCredits += request.RegularCredits;
}
if (request.MiscItems.length) {
guild.VaultMiscItems ??= [];
for (const item of request.MiscItems) {
guild.VaultMiscItems.push(item);
addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
}
}
if (request.ShipDecorations.length) {
guild.VaultShipDecorations ??= [];
for (const item of request.ShipDecorations) {
guild.VaultShipDecorations.push(item);
addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
}
}
if (request.FusionTreasures.length) {
guild.VaultFusionTreasures ??= [];
for (const item of request.FusionTreasures) {
guild.VaultFusionTreasures.push(item);
addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
}
}
await guild.save();
await inventory.save();
res.end();
};
interface IContributeToVaultRequest {
RegularCredits: number;
MiscItems: IMiscItem[];
ShipDecorations: ITypeCount[];
FusionTreasures: IFusionTreasure[];
}

View File

@ -47,4 +47,6 @@ const processContribution = (component: IDojoContributable, meta: IDojoRecipe, p
component.CompletionTime = new Date( component.CompletionTime = new Date(
component.CompletionTime!.getTime() - secondsPerPlatinum * platinumDonated * 1000 component.CompletionTime!.getTime() - secondsPerPlatinum * platinumDonated * 1000
); );
component.RushPlatinum ??= 0;
component.RushPlatinum += platinumDonated;
}; };

View File

@ -3,6 +3,7 @@ import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
import { Guild } from "@/src/models/guildModel"; import { Guild } from "@/src/models/guildModel";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { toOid } from "@/src/helpers/inventoryHelpers"; import { toOid } from "@/src/helpers/inventoryHelpers";
import { getGuildVault } from "@/src/services/guildService";
const getGuildController: RequestHandler = async (req, res) => { const getGuildController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -62,7 +63,8 @@ const getGuildController: RequestHandler = async (req, res) => {
Permissions: 4096 Permissions: 4096
} }
], ],
Tier: 1 Tier: 1,
Vault: getGuildVault(guild)
}); });
return; return;
} }

View File

@ -1,5 +1,5 @@
import { RequestHandler } from "express"; import { RequestHandler } from "express";
import { getGuildForRequestEx, scaleRequiredCount } from "@/src/services/guildService"; import { getGuildForRequestEx, getGuildVault, scaleRequiredCount } from "@/src/services/guildService";
import { ExportDojoRecipes, IDojoResearch } from "warframe-public-export-plus"; import { ExportDojoRecipes, IDojoResearch } from "warframe-public-export-plus";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/services/inventoryService"; import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/services/inventoryService";
@ -43,10 +43,35 @@ export const guildTechController: RequestHandler = async (req, res) => {
} else if (action == "Contribute") { } else if (action == "Contribute") {
const contributions = data as IGuildTechContributeFields; const contributions = data as IGuildTechContributeFields;
const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!; const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!;
if (contributions.VaultCredits) {
if (contributions.VaultCredits > techProject.ReqCredits) {
contributions.VaultCredits = techProject.ReqCredits;
}
techProject.ReqCredits -= contributions.VaultCredits;
guild.VaultRegularCredits! -= contributions.VaultCredits;
}
if (contributions.RegularCredits > techProject.ReqCredits) { if (contributions.RegularCredits > techProject.ReqCredits) {
contributions.RegularCredits = techProject.ReqCredits; contributions.RegularCredits = techProject.ReqCredits;
} }
techProject.ReqCredits -= contributions.RegularCredits; techProject.ReqCredits -= contributions.RegularCredits;
if (contributions.VaultMiscItems.length) {
for (const miscItem of contributions.VaultMiscItems) {
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
if (reqItem) {
if (miscItem.ItemCount > reqItem.ItemCount) {
miscItem.ItemCount = reqItem.ItemCount;
}
reqItem.ItemCount -= miscItem.ItemCount;
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == miscItem.ItemType)!;
vaultMiscItem.ItemCount -= miscItem.ItemCount;
}
}
}
const miscItemChanges = []; const miscItemChanges = [];
for (const miscItem of contributions.MiscItems) { for (const miscItem of contributions.MiscItems) {
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType); const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
@ -74,7 +99,8 @@ export const guildTechController: RequestHandler = async (req, res) => {
await guild.save(); await guild.save();
await inventory.save(); await inventory.save();
res.json({ res.json({
InventoryChanges: inventoryChanges InventoryChanges: inventoryChanges,
Vault: getGuildVault(guild)
}); });
} else if (action == "Buy") { } else if (action == "Buy") {
const purchase = data as IGuildTechBuyFields; const purchase = data as IGuildTechBuyFields;

View File

@ -6,7 +6,7 @@ import {
IDojoDecoDatabase IDojoDecoDatabase
} from "@/src/types/guildTypes"; } from "@/src/types/guildTypes";
import { Document, Model, model, Schema, Types } from "mongoose"; import { Document, Model, model, Schema, Types } from "mongoose";
import { typeCountSchema } from "./inventoryModels/inventoryModel"; import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
import { toMongoDate } from "../helpers/inventoryHelpers"; import { toMongoDate } from "../helpers/inventoryHelpers";
const dojoDecoSchema = new Schema<IDojoDecoDatabase>({ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
@ -16,7 +16,8 @@ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
Name: String, Name: String,
RegularCredits: Number, RegularCredits: Number,
MiscItems: { type: [typeCountSchema], default: undefined }, MiscItems: { type: [typeCountSchema], default: undefined },
CompletionTime: Date CompletionTime: Date,
RushPlatinum: Number
}); });
const dojoComponentSchema = new Schema<IDojoComponentDatabase>({ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
@ -30,6 +31,7 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
RegularCredits: Number, RegularCredits: Number,
MiscItems: { type: [typeCountSchema], default: undefined }, MiscItems: { type: [typeCountSchema], default: undefined },
CompletionTime: Date, CompletionTime: Date,
RushPlatinum: Number,
DestructionTime: Date, DestructionTime: Date,
Decos: [dojoDecoSchema], Decos: [dojoDecoSchema],
DecoCapacity: Number DecoCapacity: Number
@ -63,6 +65,11 @@ const guildSchema = new Schema<IGuildDatabase>(
DojoComponents: { type: [dojoComponentSchema], default: [] }, DojoComponents: { type: [dojoComponentSchema], default: [] },
DojoCapacity: { type: Number, default: 100 }, DojoCapacity: { type: Number, default: 100 },
DojoEnergy: { type: Number, default: 5 }, DojoEnergy: { type: Number, default: 5 },
VaultRegularCredits: Number,
VaultPremiumCredits: Number,
VaultMiscItems: { type: [typeCountSchema], default: undefined },
VaultShipDecorations: { type: [typeCountSchema], default: undefined },
VaultFusionTreasures: { type: [fusionTreasuresSchema], default: undefined },
TechProjects: { type: [techProjectSchema], default: undefined } TechProjects: { type: [techProjectSchema], default: undefined }
}, },
{ id: false } { id: false }

View File

@ -552,7 +552,7 @@ questKeysSchema.set("toJSON", {
} }
}); });
const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number }); export const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number });
const spectreLoadoutsSchema = new Schema<ISpectreLoadout>( const spectreLoadoutsSchema = new Schema<ISpectreLoadout>(
{ {

View File

@ -14,6 +14,7 @@ import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/cla
import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController"; import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController"; import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
import { contributeToDojoComponentController } from "@/src/controllers/api/contributeToDojoComponentController"; import { contributeToDojoComponentController } from "@/src/controllers/api/contributeToDojoComponentController";
import { contributeToVaultController } from "@/src/controllers/api/contributeToVaultController";
import { createGuildController } from "@/src/controllers/api/createGuildController"; import { createGuildController } from "@/src/controllers/api/createGuildController";
import { creditsController } from "@/src/controllers/api/creditsController"; import { creditsController } from "@/src/controllers/api/creditsController";
import { deleteSessionController } from "@/src/controllers/api/deleteSessionController"; import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
@ -153,6 +154,7 @@ apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController); apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController);
apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController); apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController);
apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController); apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController);
apiRouter.post("/contributeToVault.php", contributeToVaultController);
apiRouter.post("/createGuild.php", createGuildController); apiRouter.post("/createGuild.php", createGuildController);
apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController); apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController);
apiRouter.post("/dojoComponentRush.php", dojoComponentRushController); apiRouter.post("/dojoComponentRush.php", dojoComponentRushController);

View File

@ -3,7 +3,13 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory } from "@/src/services/inventoryService"; import { getInventory } from "@/src/services/inventoryService";
import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel"; import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel";
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes"; import {
IDojoClient,
IDojoComponentClient,
IDojoContributable,
IDojoDecoClient,
IGuildVault
} from "@/src/types/guildTypes";
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { Types } from "mongoose"; import { Types } from "mongoose";
import { ExportDojoRecipes } from "warframe-public-export-plus"; import { ExportDojoRecipes } from "warframe-public-export-plus";
@ -30,6 +36,16 @@ export const getGuildForRequestEx = async (
return guild; return guild;
}; };
export const getGuildVault = (guild: TGuildDatabaseDocument): IGuildVault => {
return {
DojoRefundRegularCredits: guild.VaultRegularCredits,
DojoRefundMiscItems: guild.VaultMiscItems,
DojoRefundPremiumCredits: guild.VaultPremiumCredits,
ShipDecorations: guild.VaultShipDecorations,
FusionTreasures: guild.VaultFusionTreasures
};
};
export const getDojoClient = async ( export const getDojoClient = async (
guild: TGuildDatabaseDocument, guild: TGuildDatabaseDocument,
status: number, status: number,
@ -41,6 +57,7 @@ export const getDojoClient = async (
Tier: 1, Tier: 1,
FixedContributions: true, FixedContributions: true,
DojoRevision: 1, DojoRevision: 1,
Vault: getGuildVault(guild),
RevisionTime: Math.round(Date.now() / 1000), RevisionTime: Math.round(Date.now() / 1000),
Energy: guild.DojoEnergy, Energy: guild.DojoEnergy,
Capacity: guild.DojoCapacity, Capacity: guild.DojoCapacity,
@ -79,15 +96,20 @@ export const getDojoClient = async (
if (dojoComponent.Decos) { if (dojoComponent.Decos) {
clientComponent.Decos = []; clientComponent.Decos = [];
for (const deco of dojoComponent.Decos) { for (const deco of dojoComponent.Decos) {
clientComponent.Decos.push({ const clientDeco: IDojoDecoClient = {
id: toOid(deco._id), id: toOid(deco._id),
Type: deco.Type, Type: deco.Type,
Pos: deco.Pos, Pos: deco.Pos,
Rot: deco.Rot, Rot: deco.Rot,
CompletionTime: deco.CompletionTime ? toMongoDate(deco.CompletionTime) : undefined, Name: deco.Name
RegularCredits: deco.RegularCredits, };
MiscItems: deco.MiscItems if (deco.CompletionTime) {
}); clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
} else {
clientDeco.RegularCredits = deco.RegularCredits;
clientDeco.MiscItems = deco.MiscItems;
}
clientComponent.Decos.push(clientDeco);
} }
} }
dojo.DojoComponents.push(clientComponent); dojo.DojoComponents.push(clientComponent);
@ -118,7 +140,8 @@ export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types
guild.DojoCapacity -= meta.capacity; guild.DojoCapacity -= meta.capacity;
guild.DojoEnergy -= meta.energy; guild.DojoEnergy -= meta.energy;
} }
// TODO: Add resources spent to the clan vault moveResourcesToVault(guild, component);
component.Decos?.forEach(deco => moveResourcesToVault(guild, deco));
}; };
export const removeDojoDeco = ( export const removeDojoDeco = (
@ -135,5 +158,27 @@ export const removeDojoDeco = (
if (meta && meta.capacityCost) { if (meta && meta.capacityCost) {
component.DecoCapacity! += meta.capacityCost; component.DecoCapacity! += meta.capacityCost;
} }
// TODO: Add resources spent to the clan vault moveResourcesToVault(guild, deco);
};
const moveResourcesToVault = (guild: TGuildDatabaseDocument, component: IDojoContributable): void => {
if (component.RegularCredits) {
guild.VaultRegularCredits ??= 0;
guild.VaultRegularCredits += component.RegularCredits;
}
if (component.MiscItems) {
guild.VaultMiscItems ??= [];
for (const componentMiscItem of component.MiscItems) {
const vaultMiscItem = guild.VaultMiscItems.find(x => x.ItemType == componentMiscItem.ItemType);
if (vaultMiscItem) {
vaultMiscItem.ItemCount += componentMiscItem.ItemCount;
} else {
guild.VaultMiscItems.push(componentMiscItem);
}
}
}
if (component.RushPlatinum) {
guild.VaultPremiumCredits ??= 0;
guild.VaultPremiumCredits += component.RushPlatinum;
}
}; };

View File

@ -1,6 +1,6 @@
import { Types } from "mongoose"; import { Types } from "mongoose";
import { IOid, IMongoDate } from "@/src/types/commonTypes"; import { IOid, IMongoDate } from "@/src/types/commonTypes";
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
export interface IGuild { export interface IGuild {
Name: string; Name: string;
@ -11,19 +11,38 @@ export interface IGuildDatabase extends IGuild {
DojoComponents: IDojoComponentDatabase[]; DojoComponents: IDojoComponentDatabase[];
DojoCapacity: number; DojoCapacity: number;
DojoEnergy: number; DojoEnergy: number;
VaultRegularCredits?: number;
VaultPremiumCredits?: number;
VaultMiscItems?: IMiscItem[];
VaultShipDecorations?: ITypeCount[];
VaultFusionTreasures?: IFusionTreasure[];
TechProjects?: ITechProjectDatabase[]; TechProjects?: ITechProjectDatabase[];
} }
export interface IGuildVault {
DojoRefundRegularCredits?: number;
DojoRefundMiscItems?: IMiscItem[];
DojoRefundPremiumCredits?: number;
ShipDecorations?: ITypeCount[];
FusionTreasures?: IFusionTreasure[];
DecoRecipes?: ITypeCount[]; // Event Trophies
}
export interface IDojoClient { export interface IDojoClient {
_id: IOid; // ID of the guild _id: IOid; // ID of the guild
Name: string; Name: string;
Tier: number; Tier: number;
FixedContributions: boolean; FixedContributions: boolean;
DojoRevision: number; DojoRevision: number;
AllianceId?: IOid;
Vault?: IGuildVault;
Class?: number; // Level
RevisionTime: number; RevisionTime: number;
Energy: number; Energy: number;
Capacity: number; Capacity: number;
DojoRequestStatus: number; DojoRequestStatus: number;
ContentURL?: string;
GuildEmblem?: boolean;
DojoComponents: IDojoComponentClient[]; DojoComponents: IDojoComponentClient[];
} }
@ -46,7 +65,7 @@ export interface IDojoComponentClient {
} }
export interface IDojoComponentDatabase export interface IDojoComponentDatabase
extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "RushPlatinum" | "DestructionTime" | "Decos"> { extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> {
_id: Types.ObjectId; _id: Types.ObjectId;
pi?: Types.ObjectId; pi?: Types.ObjectId;
CompletionTime?: Date; CompletionTime?: Date;
@ -63,6 +82,7 @@ export interface IDojoDecoClient {
RegularCredits?: number; RegularCredits?: number;
MiscItems?: IMiscItem[]; MiscItems?: IMiscItem[];
CompletionTime?: IMongoDate; CompletionTime?: IMongoDate;
RushPlatinum?: number;
} }
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> { export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
@ -70,6 +90,14 @@ export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "Complet
CompletionTime?: Date; CompletionTime?: Date;
} }
// A common subset of the database representation of rooms & decos.
export interface IDojoContributable {
RegularCredits?: number;
MiscItems?: IMiscItem[];
CompletionTime?: Date;
RushPlatinum?: number;
}
export interface ITechProjectClient { export interface ITechProjectClient {
ItemType: string; ItemType: string;
ReqCredits: number; ReqCredits: number;
@ -81,9 +109,3 @@ export interface ITechProjectClient {
export interface ITechProjectDatabase extends Omit<ITechProjectClient, "CompletionDate"> { export interface ITechProjectDatabase extends Omit<ITechProjectClient, "CompletionDate"> {
CompletionDate?: Date; CompletionDate?: Date;
} }
export interface IDojoContributable {
RegularCredits?: number;
MiscItems?: IMiscItem[];
CompletionTime?: Date;
}