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

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat: clan vault (#1093)

Closes #1080 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1093

57b3a5b9
Sainan <sainan@calamity.inc>
提交于

代码差异

10 个文件 +238 -62
Modified src/controllers/api/contributeToDojoComponentController.ts +61 -40
@@ -13,12 +13,9 @@ interface IContributeToDojoComponentRequest {
13 13 ComponentId: string;
14 14 DecoId?: string;
15 15 DecoType?: string;
16 IngredientContributions: {
17 ItemType: string;
18 ItemCount: number;
19 }[];
16 IngredientContributions: IMiscItem[];
20 17 RegularCredits: number;
21 VaultIngredientContributions: [];
18 VaultIngredientContributions: IMiscItem[];
22 19 VaultCredits: number;
23 20 }
24 21
@@ -37,13 +34,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
37 34 throw new Error("attempt to contribute to a deco in an unfinished room?!");
38 35 }
39 36 const meta = Object.values(ExportDojoRecipes.rooms).find(x => x.resultType == component.pf)!;
40 await processContribution(guild, request, inventory, inventoryChanges, meta, component);
37 processContribution(guild, request, inventory, inventoryChanges, meta, component);
41 38 } else {
42 39 // Room is past "Collecting Materials"
43 40 if (request.DecoId) {
44 41 const deco = component.Decos!.find(x => x._id.equals(request.DecoId))!;
45 42 const meta = Object.values(ExportDojoRecipes.decos).find(x => x.resultType == deco.Type)!;
46 await processContribution(guild, request, inventory, inventoryChanges, meta, deco);
43 processContribution(guild, request, inventory, inventoryChanges, meta, deco);
47 44 }
48 45 }
49 46
@@ -55,46 +52,76 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
55 52 });
56 53 };
57 54
58 const processContribution = async (
55 const processContribution = (
59 56 guild: TGuildDatabaseDocument,
60 57 request: IContributeToDojoComponentRequest,
61 58 inventory: TInventoryDatabaseDocument,
62 59 inventoryChanges: IInventoryChanges,
63 60 meta: IDojoRecipe,
64 61 component: IDojoContributable
65 ): Promise<void> => {
62 ): void => {
66 63 component.RegularCredits ??= 0;
67 if (component.RegularCredits + request.RegularCredits > scaleRequiredCount(meta.price)) {
68 request.RegularCredits = scaleRequiredCount(meta.price) - component.RegularCredits;
64 if (request.RegularCredits) {
65 component.RegularCredits += request.RegularCredits;
66 inventoryChanges.RegularCredits = -request.RegularCredits;
67 updateCurrency(inventory, request.RegularCredits, false);
68 }
69 if (request.VaultCredits) {
70 component.RegularCredits += request.VaultCredits;
71 guild.VaultRegularCredits! -= request.VaultCredits;
72 }
73 if (component.RegularCredits > scaleRequiredCount(meta.price)) {
74 guild.VaultRegularCredits ??= 0;
75 guild.VaultRegularCredits += component.RegularCredits - scaleRequiredCount(meta.price);
76 component.RegularCredits = scaleRequiredCount(meta.price);
69 77 }
70 component.RegularCredits += request.RegularCredits;
71 inventoryChanges.RegularCredits = -request.RegularCredits;
72 updateCurrency(inventory, request.RegularCredits, false);
73 78
74 79 component.MiscItems ??= [];
75 const miscItemChanges: IMiscItem[] = [];
76 for (const ingredientContribution of request.IngredientContributions) {
77 const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
78 if (componentMiscItem) {
79 const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
80 if (
81 componentMiscItem.ItemCount + ingredientContribution.ItemCount >
82 scaleRequiredCount(ingredientMeta.ItemCount)
83 ) {
84 ingredientContribution.ItemCount =
85 scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
80 if (request.VaultIngredientContributions.length) {
81 for (const ingredientContribution of request.VaultIngredientContributions) {
82 const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
83 if (componentMiscItem) {
84 const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
85 if (
86 componentMiscItem.ItemCount + ingredientContribution.ItemCount >
87 scaleRequiredCount(ingredientMeta.ItemCount)
88 ) {
89 ingredientContribution.ItemCount =
90 scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
91 }
92 componentMiscItem.ItemCount += ingredientContribution.ItemCount;
93 } else {
94 component.MiscItems.push(ingredientContribution);
95 }
96 const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == ingredientContribution.ItemType)!;
97 vaultMiscItem.ItemCount -= ingredientContribution.ItemCount;
98 }
99 }
100 if (request.IngredientContributions.length) {
101 const miscItemChanges: IMiscItem[] = [];
102 for (const ingredientContribution of request.IngredientContributions) {
103 const componentMiscItem = component.MiscItems.find(x => x.ItemType == ingredientContribution.ItemType);
104 if (componentMiscItem) {
105 const ingredientMeta = meta.ingredients.find(x => x.ItemType == ingredientContribution.ItemType)!;
106 if (
107 componentMiscItem.ItemCount + ingredientContribution.ItemCount >
108 scaleRequiredCount(ingredientMeta.ItemCount)
109 ) {
110 ingredientContribution.ItemCount =
111 scaleRequiredCount(ingredientMeta.ItemCount) - componentMiscItem.ItemCount;
112 }
113 componentMiscItem.ItemCount += ingredientContribution.ItemCount;
114 } else {
115 component.MiscItems.push(ingredientContribution);
86 116 }
87 componentMiscItem.ItemCount += ingredientContribution.ItemCount;
88 } else {
89 component.MiscItems.push(ingredientContribution);
117 miscItemChanges.push({
118 ItemType: ingredientContribution.ItemType,
119 ItemCount: ingredientContribution.ItemCount * -1
120 });
90 121 }
91 miscItemChanges.push({
92 ItemType: ingredientContribution.ItemType,
93 ItemCount: ingredientContribution.ItemCount * -1
94 });
122 addMiscItems(inventory, miscItemChanges);
123 inventoryChanges.MiscItems = miscItemChanges;
95 124 }
96 addMiscItems(inventory, miscItemChanges);
97 inventoryChanges.MiscItems = miscItemChanges;
98 125
99 126 if (component.RegularCredits >= scaleRequiredCount(meta.price)) {
100 127 let fullyFunded = true;
@@ -106,12 +133,6 @@ const processContribution = async (
106 133 }
107 134 }
108 135 if (fullyFunded) {
109 if (request.IngredientContributions.length) {
110 // We've already updated subpaths of MiscItems, we need to allow MongoDB to save this before we remove MiscItems.
111 await guild.save();
112 }
113 component.RegularCredits = undefined;
114 component.MiscItems = undefined;
115 136 component.CompletionTime = new Date(Date.now() + meta.time * 1000);
116 137 }
117 138 }
Added src/controllers/api/contributeToVaultController.ts +49 -0
@@ -0,0 +1,49 @@
1 import { getGuildForRequestEx } from "@/src/services/guildService";
2 import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService";
3 import { getAccountIdForRequest } from "@/src/services/loginService";
4 import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
5 import { RequestHandler } from "express";
6
7 export const contributeToVaultController: RequestHandler = async (req, res) => {
8 const accountId = await getAccountIdForRequest(req);
9 const inventory = await getInventory(accountId);
10 const guild = await getGuildForRequestEx(req, inventory);
11 const request = JSON.parse(String(req.body)) as IContributeToVaultRequest;
12
13 if (request.RegularCredits) {
14 guild.VaultRegularCredits ??= 0;
15 guild.VaultRegularCredits += request.RegularCredits;
16 }
17 if (request.MiscItems.length) {
18 guild.VaultMiscItems ??= [];
19 for (const item of request.MiscItems) {
20 guild.VaultMiscItems.push(item);
21 addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
22 }
23 }
24 if (request.ShipDecorations.length) {
25 guild.VaultShipDecorations ??= [];
26 for (const item of request.ShipDecorations) {
27 guild.VaultShipDecorations.push(item);
28 addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
29 }
30 }
31 if (request.FusionTreasures.length) {
32 guild.VaultFusionTreasures ??= [];
33 for (const item of request.FusionTreasures) {
34 guild.VaultFusionTreasures.push(item);
35 addFusionTreasures(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]);
36 }
37 }
38
39 await guild.save();
40 await inventory.save();
41 res.end();
42 };
43
44 interface IContributeToVaultRequest {
45 RegularCredits: number;
46 MiscItems: IMiscItem[];
47 ShipDecorations: ITypeCount[];
48 FusionTreasures: IFusionTreasure[];
49 }
Modified src/controllers/api/dojoComponentRushController.ts +2 -0
@@ -47,4 +47,6 @@ const processContribution = (component: IDojoContributable, meta: IDojoRecipe, p
47 47 component.CompletionTime = new Date(
48 48 component.CompletionTime!.getTime() - secondsPerPlatinum * platinumDonated * 1000
49 49 );
50 component.RushPlatinum ??= 0;
51 component.RushPlatinum += platinumDonated;
50 52 };
Modified src/controllers/api/getGuildController.ts +3 -1
@@ -3,6 +3,7 @@ import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
3 3 import { Guild } from "@/src/models/guildModel";
4 4 import { getAccountIdForRequest } from "@/src/services/loginService";
5 5 import { toOid } from "@/src/helpers/inventoryHelpers";
6 import { getGuildVault } from "@/src/services/guildService";
6 7
7 8 const getGuildController: RequestHandler = async (req, res) => {
8 9 const accountId = await getAccountIdForRequest(req);
@@ -62,7 +63,8 @@ const getGuildController: RequestHandler = async (req, res) => {
62 63 Permissions: 4096
63 64 }
64 65 ],
65 Tier: 1
66 Tier: 1,
67 Vault: getGuildVault(guild)
66 68 });
67 69 return;
68 70 }
Modified src/controllers/api/guildTechController.ts +28 -2
@@ -1,5 +1,5 @@
1 1 import { RequestHandler } from "express";
2 import { getGuildForRequestEx, scaleRequiredCount } from "@/src/services/guildService";
2 import { getGuildForRequestEx, getGuildVault, scaleRequiredCount } from "@/src/services/guildService";
3 3 import { ExportDojoRecipes, IDojoResearch } from "warframe-public-export-plus";
4 4 import { getAccountIdForRequest } from "@/src/services/loginService";
5 5 import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/services/inventoryService";
@@ -43,10 +43,35 @@ export const guildTechController: RequestHandler = async (req, res) => {
43 43 } else if (action == "Contribute") {
44 44 const contributions = data as IGuildTechContributeFields;
45 45 const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!;
46
47 if (contributions.VaultCredits) {
48 if (contributions.VaultCredits > techProject.ReqCredits) {
49 contributions.VaultCredits = techProject.ReqCredits;
50 }
51 techProject.ReqCredits -= contributions.VaultCredits;
52 guild.VaultRegularCredits! -= contributions.VaultCredits;
53 }
54
46 55 if (contributions.RegularCredits > techProject.ReqCredits) {
47 56 contributions.RegularCredits = techProject.ReqCredits;
48 57 }
49 58 techProject.ReqCredits -= contributions.RegularCredits;
59
60 if (contributions.VaultMiscItems.length) {
61 for (const miscItem of contributions.VaultMiscItems) {
62 const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
63 if (reqItem) {
64 if (miscItem.ItemCount > reqItem.ItemCount) {
65 miscItem.ItemCount = reqItem.ItemCount;
66 }
67 reqItem.ItemCount -= miscItem.ItemCount;
68
69 const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == miscItem.ItemType)!;
70 vaultMiscItem.ItemCount -= miscItem.ItemCount;
71 }
72 }
73 }
74
50 75 const miscItemChanges = [];
51 76 for (const miscItem of contributions.MiscItems) {
52 77 const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
@@ -74,7 +99,8 @@ export const guildTechController: RequestHandler = async (req, res) => {
74 99 await guild.save();
75 100 await inventory.save();
76 101 res.json({
77 InventoryChanges: inventoryChanges
102 InventoryChanges: inventoryChanges,
103 Vault: getGuildVault(guild)
78 104 });
79 105 } else if (action == "Buy") {
80 106 const purchase = data as IGuildTechBuyFields;
Modified src/models/guildModel.ts +9 -2
@@ -6,7 +6,7 @@ import {
6 6 IDojoDecoDatabase
7 7 } from "@/src/types/guildTypes";
8 8 import { Document, Model, model, Schema, Types } from "mongoose";
9 import { typeCountSchema } from "./inventoryModels/inventoryModel";
9 import { fusionTreasuresSchema, typeCountSchema } from "./inventoryModels/inventoryModel";
10 10 import { toMongoDate } from "../helpers/inventoryHelpers";
11 11
12 12 const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
@@ -16,7 +16,8 @@ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
16 16 Name: String,
17 17 RegularCredits: Number,
18 18 MiscItems: { type: [typeCountSchema], default: undefined },
19 CompletionTime: Date
19 CompletionTime: Date,
20 RushPlatinum: Number
20 21 });
21 22
22 23 const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
@@ -30,6 +31,7 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
30 31 RegularCredits: Number,
31 32 MiscItems: { type: [typeCountSchema], default: undefined },
32 33 CompletionTime: Date,
34 RushPlatinum: Number,
33 35 DestructionTime: Date,
34 36 Decos: [dojoDecoSchema],
35 37 DecoCapacity: Number
@@ -63,6 +65,11 @@ const guildSchema = new Schema<IGuildDatabase>(
63 65 DojoComponents: { type: [dojoComponentSchema], default: [] },
64 66 DojoCapacity: { type: Number, default: 100 },
65 67 DojoEnergy: { type: Number, default: 5 },
68 VaultRegularCredits: Number,
69 VaultPremiumCredits: Number,
70 VaultMiscItems: { type: [typeCountSchema], default: undefined },
71 VaultShipDecorations: { type: [typeCountSchema], default: undefined },
72 VaultFusionTreasures: { type: [fusionTreasuresSchema], default: undefined },
66 73 TechProjects: { type: [techProjectSchema], default: undefined }
67 74 },
68 75 { id: false }
Modified src/models/inventoryModels/inventoryModel.ts +1 -1
@@ -552,7 +552,7 @@ questKeysSchema.set("toJSON", {
552 552 }
553 553 });
554 554
555 const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number });
555 export const fusionTreasuresSchema = new Schema<IFusionTreasure>().add(typeCountSchema).add({ Sockets: Number });
556 556
557 557 const spectreLoadoutsSchema = new Schema<ISpectreLoadout>(
558 558 {
Modified src/routes/api.ts +2 -0
@@ -14,6 +14,7 @@ import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/cla
14 14 import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
15 15 import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
16 16 import { contributeToDojoComponentController } from "@/src/controllers/api/contributeToDojoComponentController";
17 import { contributeToVaultController } from "@/src/controllers/api/contributeToVaultController";
17 18 import { createGuildController } from "@/src/controllers/api/createGuildController";
18 19 import { creditsController } from "@/src/controllers/api/creditsController";
19 20 import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
@@ -153,6 +154,7 @@ apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
153 154 apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController);
154 155 apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController);
155 156 apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController);
157 apiRouter.post("/contributeToVault.php", contributeToVaultController);
156 158 apiRouter.post("/createGuild.php", createGuildController);
157 159 apiRouter.post("/destroyDojoDeco.php", destroyDojoDecoController);
158 160 apiRouter.post("/dojoComponentRush.php", dojoComponentRushController);
Modified src/services/guildService.ts +53 -8
@@ -3,7 +3,13 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
3 3 import { getInventory } from "@/src/services/inventoryService";
4 4 import { Guild, TGuildDatabaseDocument } from "@/src/models/guildModel";
5 5 import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
6 import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes";
6 import {
7 IDojoClient,
8 IDojoComponentClient,
9 IDojoContributable,
10 IDojoDecoClient,
11 IGuildVault
12 } from "@/src/types/guildTypes";
7 13 import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
8 14 import { Types } from "mongoose";
9 15 import { ExportDojoRecipes } from "warframe-public-export-plus";
@@ -30,6 +36,16 @@ export const getGuildForRequestEx = async (
30 36 return guild;
31 37 };
32 38
39 export const getGuildVault = (guild: TGuildDatabaseDocument): IGuildVault => {
40 return {
41 DojoRefundRegularCredits: guild.VaultRegularCredits,
42 DojoRefundMiscItems: guild.VaultMiscItems,
43 DojoRefundPremiumCredits: guild.VaultPremiumCredits,
44 ShipDecorations: guild.VaultShipDecorations,
45 FusionTreasures: guild.VaultFusionTreasures
46 };
47 };
48
33 49 export const getDojoClient = async (
34 50 guild: TGuildDatabaseDocument,
35 51 status: number,
@@ -41,6 +57,7 @@ export const getDojoClient = async (
41 57 Tier: 1,
42 58 FixedContributions: true,
43 59 DojoRevision: 1,
60 Vault: getGuildVault(guild),
44 61 RevisionTime: Math.round(Date.now() / 1000),
45 62 Energy: guild.DojoEnergy,
46 63 Capacity: guild.DojoCapacity,
@@ -79,15 +96,20 @@ export const getDojoClient = async (
79 96 if (dojoComponent.Decos) {
80 97 clientComponent.Decos = [];
81 98 for (const deco of dojoComponent.Decos) {
82 clientComponent.Decos.push({
99 const clientDeco: IDojoDecoClient = {
83 100 id: toOid(deco._id),
84 101 Type: deco.Type,
85 102 Pos: deco.Pos,
86 103 Rot: deco.Rot,
87 CompletionTime: deco.CompletionTime ? toMongoDate(deco.CompletionTime) : undefined,
88 RegularCredits: deco.RegularCredits,
89 MiscItems: deco.MiscItems
90 });
104 Name: deco.Name
105 };
106 if (deco.CompletionTime) {
107 clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
108 } else {
109 clientDeco.RegularCredits = deco.RegularCredits;
110 clientDeco.MiscItems = deco.MiscItems;
111 }
112 clientComponent.Decos.push(clientDeco);
91 113 }
92 114 }
93 115 dojo.DojoComponents.push(clientComponent);
@@ -118,7 +140,8 @@ export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types
118 140 guild.DojoCapacity -= meta.capacity;
119 141 guild.DojoEnergy -= meta.energy;
120 142 }
121 // TODO: Add resources spent to the clan vault
143 moveResourcesToVault(guild, component);
144 component.Decos?.forEach(deco => moveResourcesToVault(guild, deco));
122 145 };
123 146
124 147 export const removeDojoDeco = (
@@ -135,5 +158,27 @@ export const removeDojoDeco = (
135 158 if (meta && meta.capacityCost) {
136 159 component.DecoCapacity! += meta.capacityCost;
137 160 }
138 // TODO: Add resources spent to the clan vault
161 moveResourcesToVault(guild, deco);
162 };
163
164 const moveResourcesToVault = (guild: TGuildDatabaseDocument, component: IDojoContributable): void => {
165 if (component.RegularCredits) {
166 guild.VaultRegularCredits ??= 0;
167 guild.VaultRegularCredits += component.RegularCredits;
168 }
169 if (component.MiscItems) {
170 guild.VaultMiscItems ??= [];
171 for (const componentMiscItem of component.MiscItems) {
172 const vaultMiscItem = guild.VaultMiscItems.find(x => x.ItemType == componentMiscItem.ItemType);
173 if (vaultMiscItem) {
174 vaultMiscItem.ItemCount += componentMiscItem.ItemCount;
175 } else {
176 guild.VaultMiscItems.push(componentMiscItem);
177 }
178 }
179 }
180 if (component.RushPlatinum) {
181 guild.VaultPremiumCredits ??= 0;
182 guild.VaultPremiumCredits += component.RushPlatinum;
183 }
139 184 };
Modified src/types/guildTypes.ts +30 -8
@@ -1,6 +1,6 @@
1 1 import { Types } from "mongoose";
2 2 import { IOid, IMongoDate } from "@/src/types/commonTypes";
3 import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
3 import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
4 4
5 5 export interface IGuild {
6 6 Name: string;
@@ -11,19 +11,38 @@ export interface IGuildDatabase extends IGuild {
11 11 DojoComponents: IDojoComponentDatabase[];
12 12 DojoCapacity: number;
13 13 DojoEnergy: number;
14 VaultRegularCredits?: number;
15 VaultPremiumCredits?: number;
16 VaultMiscItems?: IMiscItem[];
17 VaultShipDecorations?: ITypeCount[];
18 VaultFusionTreasures?: IFusionTreasure[];
14 19 TechProjects?: ITechProjectDatabase[];
15 20 }
16 21
22 export interface IGuildVault {
23 DojoRefundRegularCredits?: number;
24 DojoRefundMiscItems?: IMiscItem[];
25 DojoRefundPremiumCredits?: number;
26 ShipDecorations?: ITypeCount[];
27 FusionTreasures?: IFusionTreasure[];
28 DecoRecipes?: ITypeCount[]; // Event Trophies
29 }
30
17 31 export interface IDojoClient {
18 32 _id: IOid; // ID of the guild
19 33 Name: string;
20 34 Tier: number;
21 35 FixedContributions: boolean;
22 36 DojoRevision: number;
37 AllianceId?: IOid;
38 Vault?: IGuildVault;
39 Class?: number; // Level
23 40 RevisionTime: number;
24 41 Energy: number;
25 42 Capacity: number;
26 43 DojoRequestStatus: number;
44 ContentURL?: string;
45 GuildEmblem?: boolean;
27 46 DojoComponents: IDojoComponentClient[];
28 47 }
29 48
@@ -46,7 +65,7 @@ export interface IDojoComponentClient {
46 65 }
47 66
48 67 export interface IDojoComponentDatabase
49 extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "RushPlatinum" | "DestructionTime" | "Decos"> {
68 extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> {
50 69 _id: Types.ObjectId;
51 70 pi?: Types.ObjectId;
52 71 CompletionTime?: Date;
@@ -63,6 +82,7 @@ export interface IDojoDecoClient {
63 82 RegularCredits?: number;
64 83 MiscItems?: IMiscItem[];
65 84 CompletionTime?: IMongoDate;
85 RushPlatinum?: number;
66 86 }
67 87
68 88 export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {
@@ -70,6 +90,14 @@ export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "Complet
70 90 CompletionTime?: Date;
71 91 }
72 92
93 // A common subset of the database representation of rooms & decos.
94 export interface IDojoContributable {
95 RegularCredits?: number;
96 MiscItems?: IMiscItem[];
97 CompletionTime?: Date;
98 RushPlatinum?: number;
99 }
100
73 101 export interface ITechProjectClient {
74 102 ItemType: string;
75 103 ReqCredits: number;
@@ -81,9 +109,3 @@ export interface ITechProjectClient {
81 109 export interface ITechProjectDatabase extends Omit<ITechProjectClient, "CompletionDate"> {
82 110 CompletionDate?: Date;
83 111 }
84
85 export interface IDojoContributable {
86 RegularCredits?: number;
87 MiscItems?: IMiscItem[];
88 CompletionTime?: Date;
89 }