diff --git a/src/services/guildService.ts b/src/services/guildService.ts index d81f4002..1c666488 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -816,3 +816,85 @@ export const getAllianceClient = async ( } }; }; + +export const handleGuildGoalProgress = async ( + guild: TGuildDatabaseDocument, + upload: { Count: number; Tag: string; goalId: Types.ObjectId } +) => { + guild.GoalProgress ??= []; + const goalProgress = guild.GoalProgress.find(x => x.goalId.equals(upload.goalId)); + if (!goalProgress) { + guild.GoalProgress.push({ + Count: upload.Count, + Tag: upload.Tag, + goalId: upload.goalId + }); + } + const totalCount = (goalProgress?.Count ?? 0) + upload.Count; + const guildRewards = goalGuildRewardByTag[upload.Tag].rewards; + const tierGoals = goalGuildRewardByTag[upload.Tag].guildGoals[guild.Tier - 1]; + const rewards = []; + if (tierGoals.length && guildRewards.length) { + for (let i = 0; i < tierGoals.length; i++) { + if ( + tierGoals[i] && + tierGoals[i] <= totalCount && + (!goalProgress || goalProgress.Count < tierGoals[i]) && + guildRewards[i] + ) { + rewards.push(guildRewards[i]); + } + } + + if (rewards.length) { + logger.debug(`guild goal rewards`, rewards); + guild.VaultDecoRecipes ??= []; + rewards.forEach(type => { + guild.VaultDecoRecipes!.push({ + ItemType: type, + ItemCount: 1 + }); + }); + } + } + + if (goalProgress) { + goalProgress.Count += upload.Count; + } + await guild.save(); +}; + +export const goalGuildRewardByTag: Record = { + JadeShadowsEvent: { + guildGoals: [ + // I don't know what ClanGoal means + [15, 30, 45, 60], + [45, 90, 135, 180], + [150, 300, 450, 600], + [450, 900, 1350, 1800], + [1500, 3000, 4500, 6000] + ], + rewards: [ + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventPewterTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventBronzeTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventSilverTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventGoldTrophyRecipe" + ] + }, + DuviriMurmurEvent: { + guildGoals: [ + // I don't know what ClanGoal means + [260, 519, 779, 1038], + [779, 1557, 2336, 3114], + [2595, 5190, 7785, 10380], + [7785, 15570, 23355, 31140], + [29950, 51900, 77850, 103800] + ], + rewards: [ + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventClayTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventBronzeTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventSilverTrophyRecipe", + "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventGoldTrophyRecipe" + ] + } +}; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index cfa24f06..85f85e59 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -82,6 +82,7 @@ import { TAccountDocument } from "@/src/services/loginService"; import { ITypeCount } from "@/src/types/commonTypes"; import { IEquipmentClient } from "@/src/types/equipmentTypes"; import { Guild } from "@/src/models/guildModel"; +import { handleGuildGoalProgress } from "@/src/services/guildService"; const getRotations = (rewardInfo: IRewardInfo, tierOverride?: number): number[] => { // Disruption missions just tell us (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2599) @@ -720,47 +721,11 @@ export const addMissionInventoryUpdates = async ( if (goal && goal.ClanGoal && inventory.GuildId) { const guild = await Guild.findById(inventory.GuildId, "GoalProgress Tier VaultDecoRecipes"); if (guild) { - guild.GoalProgress ??= []; - const goalProgress = guild.GoalProgress.find(x => x.goalId.equals(goal._id.$oid)); - if (!goalProgress) { - guild.GoalProgress.push({ - Count: uploadProgress.Count, - Tag: goal.Tag, - goalId: new Types.ObjectId(goal._id.$oid) - }); - } - const totalCount = (goalProgress?.Count ?? 0) + uploadProgress.Count; - const guildRewards = goalGuildRewardByTag[goal.Tag].rewards; - const tierGoals = goalGuildRewardByTag[goal.Tag].guildGoals[guild.Tier - 1]; - const rewards = []; - if (tierGoals.length && guildRewards.length) { - for (let i = 0; i < tierGoals.length; i++) { - if ( - tierGoals[i] && - tierGoals[i] <= totalCount && - (!goalProgress || goalProgress.Count < tierGoals[i]) && - guildRewards[i] - ) { - rewards.push(guildRewards[i]); - } - } - - if (rewards.length) { - logger.debug(`guild goal rewards`, rewards); - guild.VaultDecoRecipes ??= []; - rewards.forEach(type => { - guild.VaultDecoRecipes!.push({ - ItemType: type, - ItemCount: 1 - }); - }); - } - } - - if (goalProgress) { - goalProgress.Count += uploadProgress.Count; - } - await guild.save(); + handleGuildGoalProgress(guild, { + Count: uploadProgress.Count, + Tag: goal.Tag, + goalId: new Types.ObjectId(goal._id.$oid) + }); } } } @@ -2434,38 +2399,3 @@ const goalMessagesByKey: Record = { - JadeShadowsEvent: { - guildGoals: [ - // I don't know what ClanGoal means - [15, 30, 45, 60], - [45, 90, 135, 180], - [150, 300, 450, 600], - [450, 900, 1350, 1800], - [1500, 3000, 4500, 6000] - ], - rewards: [ - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventPewterTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventBronzeTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventSilverTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/JadeShadowsEventGoldTrophyRecipe" - ] - }, - DuviriMurmurEvent: { - guildGoals: [ - // I don't know what ClanGoal means - [260, 519, 779, 1038], - [779, 1557, 2336, 3114], - [2595, 5190, 7785, 10380], - [7785, 15570, 23355, 31140], - [29950, 51900, 77850, 103800] - ], - rewards: [ - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventClayTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventBronzeTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventSilverTrophyRecipe", - "/Lotus/Levels/ClanDojo/ComponentPropRecipes/DuviriMurmurEventGoldTrophyRecipe" - ] - } -}; diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index 8f9d8f3f..167f076f 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -37,6 +37,10 @@ import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/invento import { fromStoreItem, toStoreItem } from "@/src/services/itemDataService"; import { DailyDeal } from "@/src/models/worldStateModel"; import { fromMongoDate, toMongoDate } from "@/src/helpers/inventoryHelpers"; +import { Account } from "@/src/models/loginModel"; +import { Guild } from "@/src/models/guildModel"; +import { handleGuildGoalProgress } from "@/src/services/guildService"; +import { Types } from "mongoose"; export const getStoreItemCategory = (storeItem: string): string => { const storeItemString = getSubstringFromKeyword(storeItem, "StoreItems/"); @@ -138,6 +142,22 @@ export const handlePurchase = async ( updateCurrency(inventory, offer.PremiumPrice[0], true, prePurchaseInventoryChanges); } } + if ( + inventory.GuildId && + offer.ItemPrices && + manifest.VendorInfo.TypeName == + "/Lotus/Types/Game/VendorManifests/Events/DuviriMurmurInvasionVendorManifest" + ) { + const guild = await Guild.findById(inventory.GuildId, "GoalProgress Tier VaultDecoRecipes"); + const goal = getWorldState().Goals.find(x => x.Tag == "DuviriMurmurEvent"); + if (guild && goal) { + handleGuildGoalProgress(guild, { + Count: offer.ItemPrices[0].ItemCount * purchaseRequest.PurchaseParams.Quantity, + Tag: goal.Tag, + goalId: new Types.ObjectId(goal._id.$oid) + }); + } + } if (!config.dontSubtractPurchaseItemCost) { if (offer.ItemPrices) { handleItemPrices(