feat: auto-contribute from clan vault
All checks were successful
Build / build (20) (push) Successful in 42s
Build / build (18) (push) Successful in 1m17s
Build / build (22) (push) Successful in 1m23s
Build / build (18) (pull_request) Successful in 44s
Build / build (20) (pull_request) Successful in 1m15s
Build / build (22) (pull_request) Successful in 1m20s

The wiki says this is also supposed to do partial fills, but didn't see that in my testing on live.
This commit is contained in:
Sainan 2025-04-02 19:15:55 +02:00
parent 74d9428a66
commit dc68fafe2c
5 changed files with 68 additions and 1 deletions

View File

@ -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 { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { GuildPermission } from "@/src/types/guildTypes"; 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) { if (meta.price == 0 && meta.ingredients.length == 0) {
deco.CompletionTime = new Date(); 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);
}
}
} }
} }

View File

@ -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<ISetVaultAutoContributeRequest>(String(req.body));
guild.AutoContributeFromVault = data.autoContributeFromVault;
await guild.save();
res.end();
};
interface ISetVaultAutoContributeRequest {
autoContributeFromVault: boolean;
}

View File

@ -169,6 +169,7 @@ const guildSchema = new Schema<IGuildDatabase>(
TradeTax: { type: Number, default: 0 }, TradeTax: { type: Number, default: 0 },
Tier: { type: Number, default: 1 }, Tier: { type: Number, default: 1 },
Emblem: { type: Boolean }, Emblem: { type: Boolean },
AutoContributeFromVault: { type: Boolean },
AllianceId: { type: Types.ObjectId }, AllianceId: { type: Types.ObjectId },
DojoComponents: { type: [dojoComponentSchema], default: [] }, DojoComponents: { type: [dojoComponentSchema], default: [] },
DojoCapacity: { type: Number, default: 100 }, DojoCapacity: { type: Number, default: 100 },

View File

@ -94,6 +94,7 @@ import { retrievePetFromStasisController } from "@/src/controllers/api/retrieveP
import { saveDialogueController } from "@/src/controllers/api/saveDialogueController"; import { saveDialogueController } from "@/src/controllers/api/saveDialogueController";
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout";
import { saveSettingsController } from "@/src/controllers/api/saveSettingsController"; import { saveSettingsController } from "@/src/controllers/api/saveSettingsController";
import { saveVaultAutoContributeController } from "@/src/controllers/api/saveVaultAutoContributeController";
import { sellController } from "@/src/controllers/api/sellController"; import { sellController } from "@/src/controllers/api/sellController";
import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController"; import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController";
import { setActiveShipController } from "@/src/controllers/api/setActiveShipController"; import { setActiveShipController } from "@/src/controllers/api/setActiveShipController";
@ -246,6 +247,7 @@ apiRouter.post("/retrievePetFromStasis.php", retrievePetFromStasisController);
apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveDialogue.php", saveDialogueController);
apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/saveLoadout.php", saveLoadoutController);
apiRouter.post("/saveSettings.php", saveSettingsController); apiRouter.post("/saveSettings.php", saveSettingsController);
apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController);
apiRouter.post("/sell.php", sellController); apiRouter.post("/sell.php", sellController);
apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController); apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController);
apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController); apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController);

View File

@ -32,6 +32,7 @@ export interface IGuildDatabase {
TradeTax: number; TradeTax: number;
Tier: number; Tier: number;
Emblem?: boolean; Emblem?: boolean;
AutoContributeFromVault?: boolean;
AllianceId?: Types.ObjectId; AllianceId?: Types.ObjectId;
DojoComponents: IDojoComponentDatabase[]; DojoComponents: IDojoComponentDatabase[];