forked from OpenWF/SpaceNinjaServer
feat: handle EmailItems received during mission (#1088)
Closes #1087 Reviewed-on: OpenWF/SpaceNinjaServer#1088
This commit is contained in:
parent
530713ce5c
commit
59fd816b0c
@ -54,7 +54,7 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
|
|||||||
logger.debug("mission report:", missionReport);
|
logger.debug("mission report:", missionReport);
|
||||||
|
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
const inventoryUpdates = addMissionInventoryUpdates(inventory, missionReport);
|
const inventoryUpdates = await addMissionInventoryUpdates(inventory, missionReport);
|
||||||
|
|
||||||
if (missionReport.MissionStatus !== "GS_SUCCESS") {
|
if (missionReport.MissionStatus !== "GS_SUCCESS") {
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
@ -428,10 +428,8 @@ export const addItem = async (
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (typeName in ExportEmailItems) {
|
if (typeName in ExportEmailItems) {
|
||||||
const emailItem = ExportEmailItems[typeName];
|
|
||||||
await createMessage(inventory.accountOwnerId.toString(), [convertInboxMessage(emailItem.message)]);
|
|
||||||
return {
|
return {
|
||||||
InventoryChanges: {}
|
InventoryChanges: await addEmailItem(inventory, typeName)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,6 +941,28 @@ const addDrone = (
|
|||||||
return inventoryChanges;
|
return inventoryChanges;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const addEmailItem = async (
|
||||||
|
inventory: TInventoryDatabaseDocument,
|
||||||
|
typeName: string,
|
||||||
|
inventoryChanges: IInventoryChanges = {}
|
||||||
|
): Promise<IInventoryChanges> => {
|
||||||
|
const meta = ExportEmailItems[typeName];
|
||||||
|
const emailItem = inventory.EmailItems.find(x => x.ItemType == typeName);
|
||||||
|
if (!emailItem || !meta.sendOnlyOnce) {
|
||||||
|
await createMessage(inventory.accountOwnerId.toString(), [convertInboxMessage(meta.message)]);
|
||||||
|
|
||||||
|
if (emailItem) {
|
||||||
|
emailItem.ItemCount += 1;
|
||||||
|
} else {
|
||||||
|
inventory.EmailItems.push({ ItemType: typeName, ItemCount: 1 });
|
||||||
|
}
|
||||||
|
|
||||||
|
inventoryChanges.EmailItems ??= [];
|
||||||
|
inventoryChanges.EmailItems.push({ ItemType: typeName, ItemCount: 1 });
|
||||||
|
}
|
||||||
|
return inventoryChanges;
|
||||||
|
};
|
||||||
|
|
||||||
//TODO: wrong id is not erroring
|
//TODO: wrong id is not erroring
|
||||||
export const addGearExpByCategory = (
|
export const addGearExpByCategory = (
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
|
@ -14,6 +14,7 @@ import {
|
|||||||
addConsumables,
|
addConsumables,
|
||||||
addCrewShipAmmo,
|
addCrewShipAmmo,
|
||||||
addCrewShipRawSalvage,
|
addCrewShipRawSalvage,
|
||||||
|
addEmailItem,
|
||||||
addFocusXpIncreases,
|
addFocusXpIncreases,
|
||||||
addFusionTreasures,
|
addFusionTreasures,
|
||||||
addGearExpByCategory,
|
addGearExpByCategory,
|
||||||
@ -61,10 +62,10 @@ const getRandomRewardByChance = (pool: IReward[]): IRngResult | undefined => {
|
|||||||
//type TignoredInventoryUpdateKeys = (typeof ignoredInventoryUpdateKeys)[number];
|
//type TignoredInventoryUpdateKeys = (typeof ignoredInventoryUpdateKeys)[number];
|
||||||
//const knownUnhandledKeys: readonly string[] = ["test"] as const; // for unimplemented but important keys
|
//const knownUnhandledKeys: readonly string[] = ["test"] as const; // for unimplemented but important keys
|
||||||
|
|
||||||
export const addMissionInventoryUpdates = (
|
export const addMissionInventoryUpdates = async (
|
||||||
inventory: HydratedDocument<IInventoryDatabase, InventoryDocumentProps>,
|
inventory: HydratedDocument<IInventoryDatabase, InventoryDocumentProps>,
|
||||||
inventoryUpdates: IMissionInventoryUpdateRequest
|
inventoryUpdates: IMissionInventoryUpdateRequest
|
||||||
): Partial<IInventoryDatabase> | undefined => {
|
): Promise<Partial<IInventoryDatabase> | undefined> => {
|
||||||
//TODO: type this properly
|
//TODO: type this properly
|
||||||
const inventoryChanges: Partial<IInventoryDatabase> = {};
|
const inventoryChanges: Partial<IInventoryDatabase> = {};
|
||||||
if (inventoryUpdates.MissionFailed === true) {
|
if (inventoryUpdates.MissionFailed === true) {
|
||||||
@ -156,6 +157,12 @@ export const addMissionInventoryUpdates = (
|
|||||||
inventoryChanges.FusionPoints = fusionPoints;
|
inventoryChanges.FusionPoints = fusionPoints;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "EmailItems": {
|
||||||
|
for (const tc of value) {
|
||||||
|
await addEmailItem(inventory, tc.ItemType);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "FocusXpIncreases": {
|
case "FocusXpIncreases": {
|
||||||
addFocusXpIncreases(inventory, value);
|
addFocusXpIncreases(inventory, value);
|
||||||
break;
|
break;
|
||||||
@ -237,32 +244,32 @@ export const addMissionInventoryUpdates = (
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case "CollectibleScans":
|
case "CollectibleScans":
|
||||||
value.forEach(scan => {
|
for (const scan of value) {
|
||||||
const entry = inventory.CollectibleSeries?.find(x => x.CollectibleType == scan.CollectibleType);
|
const entry = inventory.CollectibleSeries?.find(x => x.CollectibleType == scan.CollectibleType);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
entry.Count = scan.Count;
|
entry.Count = scan.Count;
|
||||||
entry.Tracking = scan.Tracking;
|
entry.Tracking = scan.Tracking;
|
||||||
if (entry.CollectibleType == "/Lotus/Objects/Orokin/Props/CollectibleSeriesOne") {
|
if (entry.CollectibleType == "/Lotus/Objects/Orokin/Props/CollectibleSeriesOne") {
|
||||||
const progress = entry.Count / entry.ReqScans;
|
const progress = entry.Count / entry.ReqScans;
|
||||||
entry.IncentiveStates.forEach(gate => {
|
for (const gate of entry.IncentiveStates) {
|
||||||
gate.complete = progress >= gate.threshold;
|
gate.complete = progress >= gate.threshold;
|
||||||
if (gate.complete && !gate.sent) {
|
if (gate.complete && !gate.sent) {
|
||||||
gate.sent = true;
|
gate.sent = true;
|
||||||
if (gate.threshold == 0.5) {
|
if (gate.threshold == 0.5) {
|
||||||
void createMessage(inventory.accountOwnerId.toString(), [kuriaMessage50]);
|
await createMessage(inventory.accountOwnerId.toString(), [kuriaMessage50]);
|
||||||
} else {
|
} else {
|
||||||
void createMessage(inventory.accountOwnerId.toString(), [kuriaMessage75]);
|
await createMessage(inventory.accountOwnerId.toString(), [kuriaMessage75]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
if (progress >= 1.0) {
|
if (progress >= 1.0) {
|
||||||
void createMessage(inventory.accountOwnerId.toString(), [kuriaMessage100]);
|
await createMessage(inventory.accountOwnerId.toString(), [kuriaMessage100]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.warn(`${scan.CollectibleType} was not found in inventory, ignoring scans`);
|
logger.warn(`${scan.CollectibleType} was not found in inventory, ignoring scans`);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
break;
|
break;
|
||||||
case "Upgrades":
|
case "Upgrades":
|
||||||
value.forEach(clientUpgrade => {
|
value.forEach(clientUpgrade => {
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
import { IEquipmentClient } from "./inventoryTypes/commonInventoryTypes";
|
import { IEquipmentClient } from "./inventoryTypes/commonInventoryTypes";
|
||||||
import { IDroneClient, IInfestedFoundryClient, IMiscItem, TEquipmentKey } from "./inventoryTypes/inventoryTypes";
|
import {
|
||||||
|
IDroneClient,
|
||||||
|
IInfestedFoundryClient,
|
||||||
|
IMiscItem,
|
||||||
|
ITypeCount,
|
||||||
|
TEquipmentKey
|
||||||
|
} from "./inventoryTypes/inventoryTypes";
|
||||||
|
|
||||||
export interface IPurchaseRequest {
|
export interface IPurchaseRequest {
|
||||||
PurchaseParams: IPurchaseParams;
|
PurchaseParams: IPurchaseParams;
|
||||||
@ -33,6 +39,7 @@ export type IInventoryChanges = {
|
|||||||
InfestedFoundry?: IInfestedFoundryClient;
|
InfestedFoundry?: IInfestedFoundryClient;
|
||||||
Drones?: IDroneClient[];
|
Drones?: IDroneClient[];
|
||||||
MiscItems?: IMiscItem[];
|
MiscItems?: IMiscItem[];
|
||||||
|
EmailItems?: ITypeCount[];
|
||||||
} & Record<
|
} & Record<
|
||||||
Exclude<
|
Exclude<
|
||||||
string,
|
string,
|
||||||
@ -44,6 +51,7 @@ export type IInventoryChanges = {
|
|||||||
| "InfestedFoundry"
|
| "InfestedFoundry"
|
||||||
| "Drones"
|
| "Drones"
|
||||||
| "MiscItems"
|
| "MiscItems"
|
||||||
|
| "EmailItems"
|
||||||
>,
|
>,
|
||||||
number | object[]
|
number | object[]
|
||||||
>;
|
>;
|
||||||
|
@ -46,6 +46,7 @@ export type IMissionInventoryUpdateRequest = {
|
|||||||
CrewShipRawSalvage?: ITypeCount[];
|
CrewShipRawSalvage?: ITypeCount[];
|
||||||
CrewShipAmmo?: ITypeCount[];
|
CrewShipAmmo?: ITypeCount[];
|
||||||
BonusMiscItems?: ITypeCount[];
|
BonusMiscItems?: ITypeCount[];
|
||||||
|
EmailItems?: ITypeCount[];
|
||||||
|
|
||||||
SyndicateId?: string;
|
SyndicateId?: string;
|
||||||
SortieId?: string;
|
SortieId?: string;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user