diff --git a/src/controllers/api/contributeToDojoComponentController.ts b/src/controllers/api/contributeToDojoComponentController.ts index 9261627e..05859ad4 100644 --- a/src/controllers/api/contributeToDojoComponentController.ts +++ b/src/controllers/api/contributeToDojoComponentController.ts @@ -1,4 +1,4 @@ -import { TGuildDatabaseDocument } from "@/src/models/guildModel"; +import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { getDojoClient, @@ -10,7 +10,7 @@ import { } from "@/src/services/guildService"; import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { IDojoContributable } from "@/src/types/guildTypes"; +import { IDojoContributable, IGuildMemberDatabase } from "@/src/types/guildTypes"; import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { RequestHandler } from "express"; @@ -35,6 +35,10 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r return; } const guild = await getGuildForRequestEx(req, inventory); + const guildMember = (await GuildMember.findOne( + { accountId, guildId: guild._id }, + "RegularCreditsContributed MiscItemsContributed" + ))!; const request = JSON.parse(String(req.body)) as IContributeToDojoComponentRequest; const component = guild.DojoComponents.id(request.ComponentId)!; @@ -45,7 +49,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r 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)!; - processContribution(guild, request, inventory, inventoryChanges, meta, component); + processContribution(guild, guildMember, request, inventory, inventoryChanges, meta, component); // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (component.CompletionTime) { setDojoRoomLogFunded(guild, component); @@ -55,12 +59,13 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r if (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)!; - processContribution(guild, request, inventory, inventoryChanges, meta, deco); + processContribution(guild, guildMember, request, inventory, inventoryChanges, meta, deco); } } await guild.save(); await inventory.save(); + await guildMember.save(); res.json({ ...(await getDojoClient(guild, 0, component._id)), InventoryChanges: inventoryChanges @@ -69,6 +74,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r const processContribution = ( guild: TGuildDatabaseDocument, + guildMember: IGuildMemberDatabase, request: IContributeToDojoComponentRequest, inventory: TInventoryDatabaseDocument, inventoryChanges: IInventoryChanges, @@ -80,6 +86,9 @@ const processContribution = ( component.RegularCredits += request.RegularCredits; inventoryChanges.RegularCredits = -request.RegularCredits; updateCurrency(inventory, request.RegularCredits, false); + + guildMember.RegularCreditsContributed ??= 0; + guildMember.RegularCreditsContributed += request.RegularCredits; } if (request.VaultCredits) { component.RegularCredits += request.VaultCredits; @@ -133,6 +142,9 @@ const processContribution = ( ItemType: ingredientContribution.ItemType, ItemCount: ingredientContribution.ItemCount * -1 }); + + guildMember.MiscItemsContributed ??= []; + guildMember.MiscItemsContributed.push(ingredientContribution); } addMiscItems(inventory, miscItemChanges); inventoryChanges.MiscItems = miscItemChanges; diff --git a/src/controllers/api/contributeToVaultController.ts b/src/controllers/api/contributeToVaultController.ts index dd8b18fa..b1ac10d8 100644 --- a/src/controllers/api/contributeToVaultController.ts +++ b/src/controllers/api/contributeToVaultController.ts @@ -1,3 +1,4 @@ +import { GuildMember } from "@/src/models/guildModel"; import { getGuildForRequestEx } from "@/src/services/guildService"; import { addFusionTreasures, addMiscItems, addShipDecorations, getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; @@ -8,23 +9,34 @@ export const contributeToVaultController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId); const guild = await getGuildForRequestEx(req, inventory); + const guildMember = (await GuildMember.findOne( + { accountId, guildId: guild._id }, + "RegularCreditsContributed MiscItemsContributed ShipDecorationsContributed" + ))!; const request = JSON.parse(String(req.body)) as IContributeToVaultRequest; if (request.RegularCredits) { guild.VaultRegularCredits ??= 0; guild.VaultRegularCredits += request.RegularCredits; + + guildMember.RegularCreditsContributed ??= 0; + guildMember.RegularCreditsContributed += request.RegularCredits; } if (request.MiscItems.length) { guild.VaultMiscItems ??= []; + guildMember.MiscItemsContributed ??= []; for (const item of request.MiscItems) { guild.VaultMiscItems.push(item); + guildMember.MiscItemsContributed.push(item); addMiscItems(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); } } if (request.ShipDecorations.length) { guild.VaultShipDecorations ??= []; + guildMember.ShipDecorationsContributed ??= []; for (const item of request.ShipDecorations) { guild.VaultShipDecorations.push(item); + guildMember.ShipDecorationsContributed.push(item); addShipDecorations(inventory, [{ ...item, ItemCount: item.ItemCount * -1 }]); } } @@ -38,6 +50,7 @@ export const contributeToVaultController: RequestHandler = async (req, res) => { await guild.save(); await inventory.save(); + await guildMember.save(); res.end(); }; diff --git a/src/controllers/api/dojoComponentRushController.ts b/src/controllers/api/dojoComponentRushController.ts index 633b38e1..5f334356 100644 --- a/src/controllers/api/dojoComponentRushController.ts +++ b/src/controllers/api/dojoComponentRushController.ts @@ -1,3 +1,4 @@ +import { GuildMember } from "@/src/models/guildModel"; import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService"; import { getInventory, updateCurrency } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; @@ -48,6 +49,12 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => { await guild.save(); await inventory.save(); + + const guildMember = (await GuildMember.findOne({ accountId, guildId: guild._id }, "PremiumCreditsContributed"))!; + guildMember.PremiumCreditsContributed ??= 0; + guildMember.PremiumCreditsContributed += request.Amount; + await guildMember.save(); + res.json({ ...(await getDojoClient(guild, 0, component._id)), InventoryChanges: inventoryChanges diff --git a/src/controllers/api/getGuildContributionsController.ts b/src/controllers/api/getGuildContributionsController.ts new file mode 100644 index 00000000..e5ff9086 --- /dev/null +++ b/src/controllers/api/getGuildContributionsController.ts @@ -0,0 +1,16 @@ +import { GuildMember } from "@/src/models/guildModel"; +import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; +import { RequestHandler } from "express"; + +export const getGuildContributionsController: RequestHandler = async (req, res) => { + const guildId = (await Inventory.findOne({ accountOwnerId: req.query.accountId }, "GuildId"))!.GuildId; + const guildMember = (await GuildMember.findOne({ guildId, accountId: req.query.buddyId }))!; + res.json({ + _id: { $oid: req.query.buddyId }, + RegularCreditsContributed: guildMember.RegularCreditsContributed, + PremiumCreditsContributed: guildMember.PremiumCreditsContributed, + MiscItemsContributed: guildMember.MiscItemsContributed, + ConsumablesContributed: [], // ??? + ShipDecorationsContributed: guildMember.ShipDecorationsContributed + }); +}; diff --git a/src/controllers/api/guildTechController.ts b/src/controllers/api/guildTechController.ts index 2faf34c7..58c505b0 100644 --- a/src/controllers/api/guildTechController.ts +++ b/src/controllers/api/guildTechController.ts @@ -21,7 +21,7 @@ import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { config } from "@/src/services/configService"; import { GuildPermission, ITechProjectClient, ITechProjectDatabase } from "@/src/types/guildTypes"; -import { TGuildDatabaseDocument } from "@/src/models/guildModel"; +import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel"; import { toMongoDate } from "@/src/helpers/inventoryHelpers"; import { logger } from "@/src/utils/logger"; @@ -90,6 +90,12 @@ export const guildTechController: RequestHandler = async (req, res) => { res.status(400).send("-1").end(); return; } + + const guildMember = (await GuildMember.findOne( + { accountId, guildId: guild._id }, + "RegularCreditsContributed MiscItemsContributed" + ))!; + const contributions = data; const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!; @@ -106,6 +112,9 @@ export const guildTechController: RequestHandler = async (req, res) => { } techProject.ReqCredits -= contributions.RegularCredits; + guildMember.RegularCreditsContributed ??= 0; + guildMember.RegularCreditsContributed += contributions.RegularCredits; + if (contributions.VaultMiscItems.length) { for (const miscItem of contributions.VaultMiscItems) { const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType); @@ -133,6 +142,9 @@ export const guildTechController: RequestHandler = async (req, res) => { ItemType: miscItem.ItemType, ItemCount: miscItem.ItemCount * -1 }); + + guildMember.MiscItemsContributed ??= []; + guildMember.MiscItemsContributed.push(miscItem); } } addMiscItems(inventory, miscItemChanges); @@ -151,6 +163,7 @@ export const guildTechController: RequestHandler = async (req, res) => { await guild.save(); await inventory.save(); + await guildMember.save(); res.json({ InventoryChanges: inventoryChanges, Vault: getGuildVault(guild) diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index bfd3e4d3..5ba44fc1 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -215,7 +215,11 @@ const guildMemberSchema = new Schema({ accountId: Types.ObjectId, guildId: Types.ObjectId, status: { type: Number, required: true }, - rank: { type: Number, default: 7 } + rank: { type: Number, default: 7 }, + RegularCreditsContributed: Number, + PremiumCreditsContributed: Number, + MiscItemsContributed: { type: [typeCountSchema], default: undefined }, + ShipDecorationsContributed: { type: [typeCountSchema], default: undefined } }); guildMemberSchema.index({ accountId: 1, guildId: 1 }, { unique: true }); diff --git a/src/routes/api.ts b/src/routes/api.ts index 686a5a61..30d93d0e 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -42,6 +42,7 @@ import { genericUpdateController } from "@/src/controllers/api/genericUpdateCont import { getAllianceController } from "@/src/controllers/api/getAllianceController"; import { getDailyDealStockLevelsController } from "@/src/controllers/api/getDailyDealStockLevelsController"; import { getFriendsController } from "@/src/controllers/api/getFriendsController"; +import { getGuildContributionsController } from "@/src/controllers/api/getGuildContributionsController"; import { getGuildController } from "@/src/controllers/api/getGuildController"; import { getGuildDojoController } from "@/src/controllers/api/getGuildDojoController"; import { getGuildLogController } from "@/src/controllers/api/getGuildLogController"; @@ -139,6 +140,7 @@ apiRouter.get("/drones.php", dronesController); apiRouter.get("/getDailyDealStockLevels.php", getDailyDealStockLevelsController); apiRouter.get("/getFriends.php", getFriendsController); apiRouter.get("/getGuild.php", getGuildController); +apiRouter.get("/getGuildContributions.php", getGuildContributionsController); apiRouter.get("/getGuildDojo.php", getGuildDojoController); apiRouter.get("/getGuildLog.php", getGuildLogController); apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController); diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 0237cd2b..1d5dda15 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -58,12 +58,7 @@ export const getGuildClient = async (guild: TGuildDatabaseDocument, accountId: s if (guildMember.accountId.equals(accountId)) { missingEntry = false; } else { - member.DisplayName = (await Account.findOne( - { - _id: guildMember.accountId - }, - "DisplayName" - ))!.DisplayName; + member.DisplayName = (await Account.findById(guildMember.accountId, "DisplayName"))!.DisplayName; await fillInInventoryDataForGuildMember(member); } members.push(member); diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index da444a2b..ab4d1c06 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -88,6 +88,10 @@ export interface IGuildMemberDatabase { guildId: Types.ObjectId; status: number; rank: number; + RegularCreditsContributed?: number; + PremiumCreditsContributed?: number; + MiscItemsContributed?: IMiscItem[]; + ShipDecorationsContributed?: ITypeCount[]; } export interface IGuildMemberClient {