From 9eadc7fa21567498a7456e9504a16cb23c577307 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:39:16 -0700 Subject: [PATCH] feat: auto-contribute from clan vault (#1435) The wiki says this is also supposed to do partial fills, but didn't see that in my testing on live. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1435 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- .../api/placeDecoInComponentController.ts | 40 ++++++++++++++++++- .../api/saveVaultAutoContributeController.ts | 25 ++++++++++++ src/models/guildModel.ts | 1 + src/routes/api.ts | 2 + src/types/guildTypes.ts | 1 + 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/controllers/api/saveVaultAutoContributeController.ts diff --git a/src/controllers/api/placeDecoInComponentController.ts b/src/controllers/api/placeDecoInComponentController.ts index 08f814da..3a09ddfc 100644 --- a/src/controllers/api/placeDecoInComponentController.ts +++ b/src/controllers/api/placeDecoInComponentController.ts @@ -1,4 +1,12 @@ -import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService"; +import { + getDojoClient, + getGuildForRequestEx, + getVaultMiscItemCount, + hasAccessToDojo, + hasGuildPermission, + processDojoBuildMaterialsGathered, + scaleRequiredCount +} from "@/src/services/guildService"; import { getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { GuildPermission } from "@/src/types/guildTypes"; @@ -42,6 +50,36 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) = } if (meta.price == 0 && meta.ingredients.length == 0) { deco.CompletionTime = new Date(); + } else if (guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems) { + if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) { + let enoughMiscItems = true; + for (const ingredient of meta.ingredients) { + if ( + getVaultMiscItemCount(guild, ingredient.ItemType) < + scaleRequiredCount(guild.Tier, ingredient.ItemCount) + ) { + enoughMiscItems = false; + break; + } + } + if (enoughMiscItems) { + guild.VaultRegularCredits -= meta.price; + deco.RegularCredits = meta.price; + + deco.MiscItems = []; + for (const ingredient of meta.ingredients) { + guild.VaultMiscItems.find(x => x.ItemType == ingredient.ItemType)!.ItemCount -= + scaleRequiredCount(guild.Tier, ingredient.ItemCount); + deco.MiscItems.push({ + ItemType: ingredient.ItemType, + ItemCount: scaleRequiredCount(guild.Tier, ingredient.ItemCount) + }); + } + + deco.CompletionTime = new Date(Date.now() + meta.time * 1000); + processDojoBuildMaterialsGathered(guild, meta); + } + } } } diff --git a/src/controllers/api/saveVaultAutoContributeController.ts b/src/controllers/api/saveVaultAutoContributeController.ts new file mode 100644 index 00000000..5c5f51c5 --- /dev/null +++ b/src/controllers/api/saveVaultAutoContributeController.ts @@ -0,0 +1,25 @@ +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { Guild } from "@/src/models/guildModel"; +import { hasGuildPermission } from "@/src/services/guildService"; +import { getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { GuildPermission } from "@/src/types/guildTypes"; +import { RequestHandler } from "express"; + +export const saveVaultAutoContributeController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId, "GuildId"); + const guild = (await Guild.findById(inventory.GuildId!, "Ranks AutoContributeFromVault"))!; + if (!(await hasGuildPermission(guild, accountId, GuildPermission.Treasurer))) { + res.status(400).send("Invalid permission").end(); + return; + } + const data = getJSONfromString(String(req.body)); + guild.AutoContributeFromVault = data.autoContributeFromVault; + await guild.save(); + res.end(); +}; + +interface ISetVaultAutoContributeRequest { + autoContributeFromVault: boolean; +} diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index cd173522..cce21847 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -170,6 +170,7 @@ const guildSchema = new Schema( TradeTax: { type: Number, default: 0 }, Tier: { type: Number, default: 1 }, Emblem: { type: Boolean }, + AutoContributeFromVault: { type: Boolean }, AllianceId: { type: Types.ObjectId }, DojoComponents: { type: [dojoComponentSchema], default: [] }, DojoCapacity: { type: Number, default: 100 }, diff --git a/src/routes/api.ts b/src/routes/api.ts index 979090f4..cadce506 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -94,6 +94,7 @@ import { retrievePetFromStasisController } from "@/src/controllers/api/retrieveP import { saveDialogueController } from "@/src/controllers/api/saveDialogueController"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { saveSettingsController } from "@/src/controllers/api/saveSettingsController"; +import { saveVaultAutoContributeController } from "@/src/controllers/api/saveVaultAutoContributeController"; import { sellController } from "@/src/controllers/api/sellController"; import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController"; import { setActiveShipController } from "@/src/controllers/api/setActiveShipController"; @@ -246,6 +247,7 @@ apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController); apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/saveSettings.php", saveSettingsController); +apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController); apiRouter.post("/sell.php", sellController); apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController); apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController); diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 5ec147d0..21cb16c6 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -32,6 +32,7 @@ export interface IGuildDatabase { TradeTax: number; Tier: number; Emblem?: boolean; + AutoContributeFromVault?: boolean; AllianceId?: Types.ObjectId; DojoComponents: IDojoComponentDatabase[];