forked from OpenWF/SpaceNinjaServer
Compare commits
No commits in common. "d62ef9bbf36a31c3a8e8207b09e8f5d641ecb8ae" and "0f250c61033ba76615ddf28b67224ed75dc1876e" have entirely different histories.
d62ef9bbf3
...
0f250c6103
8
package-lock.json
generated
8
package-lock.json
generated
@ -12,7 +12,7 @@
|
||||
"copyfiles": "^2.4.1",
|
||||
"express": "^5",
|
||||
"mongoose": "^8.9.4",
|
||||
"warframe-public-export-plus": "^0.5.26",
|
||||
"warframe-public-export-plus": "^0.5.24",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
@ -4092,9 +4092,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.26",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.26.tgz",
|
||||
"integrity": "sha512-oRcz14nBHcwx5CgCbxw5bhesiJtVlspuHyqzjOwRu63c2Vs+1TgfqbVGdqc9sm3AZL9eJhtay+khc1h7r3BM/A=="
|
||||
"version": "0.5.25",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.25.tgz",
|
||||
"integrity": "sha512-vYEm6q7zECk+2xi9pb6KEksoNNEqSqcrbEtwuEDCySAzZJwbE8iErFtTA2ZAK81LOG42i8yDMevvldyke/Sr3A=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
@ -16,7 +16,7 @@
|
||||
"copyfiles": "^2.4.1",
|
||||
"express": "^5",
|
||||
"mongoose": "^8.9.4",
|
||||
"warframe-public-export-plus": "^0.5.26",
|
||||
"warframe-public-export-plus": "^0.5.24",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
|
@ -2,21 +2,40 @@ import { RequestHandler } from "express";
|
||||
import { isEmptyObject, parseString } from "@/src/helpers/general";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { addKeyChainItems, getInventory } from "@/src/services/inventoryService";
|
||||
import { IGroup } from "@/src/types/loginTypes";
|
||||
import { updateQuestStage } from "@/src/services/questService";
|
||||
|
||||
export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
|
||||
const accountId = parseString(req.query.accountId);
|
||||
const keyChainInfo = getJSONfromString<IKeyChainRequest>((req.body as string).toString());
|
||||
const keyChainTriggeredItemsRequest = getJSONfromString<IGiveKeyChainTriggeredItemsRequest>(
|
||||
(req.body as string).toString()
|
||||
);
|
||||
|
||||
const inventory = await getInventory(accountId);
|
||||
const inventoryChanges = await addKeyChainItems(inventory, keyChainInfo);
|
||||
const inventoryChanges = await addKeyChainItems(inventory, keyChainTriggeredItemsRequest);
|
||||
|
||||
if (isEmptyObject(inventoryChanges)) {
|
||||
throw new Error("inventory changes was empty after getting keychain items: should not happen");
|
||||
}
|
||||
// items were added: update quest stage's i (item was given)
|
||||
updateQuestStage(inventory, keyChainInfo, { i: true });
|
||||
const quest = inventory.QuestKeys.find(quest => quest.ItemType === keyChainTriggeredItemsRequest.KeyChain);
|
||||
|
||||
if (!quest) {
|
||||
throw new Error(`Quest ${keyChainTriggeredItemsRequest.KeyChain} not found in QuestKeys`);
|
||||
}
|
||||
if (!quest.Progress) {
|
||||
throw new Error(`Progress should always exist when giving keychain triggered items`);
|
||||
}
|
||||
|
||||
const questStage = quest.Progress[keyChainTriggeredItemsRequest.ChainStage];
|
||||
if (questStage) {
|
||||
questStage.i = true;
|
||||
} else {
|
||||
const questStageIndex = quest.Progress.push({ i: true }) - 1;
|
||||
if (questStageIndex !== keyChainTriggeredItemsRequest.ChainStage) {
|
||||
throw new Error(
|
||||
`Quest stage index mismatch: ${questStageIndex} !== ${keyChainTriggeredItemsRequest.ChainStage}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await inventory.save();
|
||||
res.send(inventoryChanges);
|
||||
@ -31,8 +50,7 @@ export const giveKeyChainTriggeredItemsController: RequestHandler = async (req,
|
||||
//{"WishlistChanges":["/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem"],"MiscItems":[{"ItemType":"/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem","ItemCount":1}]}
|
||||
};
|
||||
|
||||
export interface IKeyChainRequest {
|
||||
export interface IGiveKeyChainTriggeredItemsRequest {
|
||||
KeyChain: string;
|
||||
ChainStage: number;
|
||||
Groups?: IGroup[];
|
||||
}
|
||||
|
@ -1,36 +0,0 @@
|
||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { IMessage } from "@/src/models/inboxModel";
|
||||
import { createMessage } from "@/src/services/inboxService";
|
||||
import { getInventory } from "@/src/services/inventoryService";
|
||||
import { getKeyChainMessage } from "@/src/services/itemDataService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { updateQuestStage } from "@/src/services/questService";
|
||||
import { RequestHandler } from "express";
|
||||
|
||||
export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const keyChainInfo = JSON.parse((req.body as Buffer).toString()) as IKeyChainRequest;
|
||||
console.log(keyChainInfo);
|
||||
|
||||
const keyChainMessage = getKeyChainMessage(keyChainInfo);
|
||||
|
||||
const message = {
|
||||
sndr: keyChainMessage.sender,
|
||||
msg: keyChainMessage.body,
|
||||
sub: keyChainMessage.title,
|
||||
att: keyChainMessage.attachments.length > 0 ? keyChainMessage.attachments : undefined,
|
||||
icon: keyChainMessage.icon ?? "",
|
||||
transmission: keyChainMessage.transmission ?? "",
|
||||
highPriority: keyChainMessage.highPriority ?? false,
|
||||
r: false
|
||||
} satisfies IMessage;
|
||||
|
||||
const savedMessages = await createMessage(accountId, [message]);
|
||||
console.log("savedMessages", savedMessages);
|
||||
|
||||
const inventory = await getInventory(accountId, "QuestKeys");
|
||||
updateQuestStage(inventory, keyChainInfo, { m: true });
|
||||
await inventory.save();
|
||||
|
||||
res.send(1);
|
||||
};
|
@ -1,45 +0,0 @@
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { addItem, getInventory } from "@/src/services/inventoryService";
|
||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||
import { IOid } from "@/src/types/commonTypes";
|
||||
import { RequestHandler } from "express";
|
||||
|
||||
export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {
|
||||
const accountId = await getAccountIdForRequest(req);
|
||||
const rewardRequest = getJSONfromString<IQuestKeyRewardRequest>((req.body as Buffer).toString());
|
||||
|
||||
if (Array.isArray(rewardRequest.reward)) {
|
||||
throw new Error("Multiple rewards not expected");
|
||||
}
|
||||
|
||||
const reward = rewardRequest.reward;
|
||||
const inventory = await getInventory(accountId);
|
||||
const inventoryChanges = await addItem(inventory, reward.ItemType, reward.Amount);
|
||||
await inventory.save();
|
||||
res.json(inventoryChanges.InventoryChanges);
|
||||
//TODO: consider whishlist changes
|
||||
};
|
||||
|
||||
export interface IQuestKeyRewardRequest {
|
||||
reward: IQuestKeyReward;
|
||||
}
|
||||
|
||||
export interface IQuestKeyReward {
|
||||
RewardType: string;
|
||||
CouponType: string;
|
||||
Icon: string;
|
||||
ItemType: string;
|
||||
StoreItemType: string;
|
||||
ProductCategory: string;
|
||||
Amount: number;
|
||||
ScalingMultiplier: number;
|
||||
Durability: string;
|
||||
DisplayName: string;
|
||||
Duration: number;
|
||||
CouponSku: number;
|
||||
Syndicate: string;
|
||||
Milestones: any[];
|
||||
ChooseSetIndex: number;
|
||||
NewSystemReward: boolean;
|
||||
_id: IOid;
|
||||
}
|
@ -4,8 +4,7 @@ import { logger } from "@/src/utils/logger";
|
||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||
import { updateQuestKey, IUpdateQuestRequest } from "@/src/services/questService";
|
||||
import { getQuestCompletionItems } from "@/src/services/itemDataService";
|
||||
import { addItems, getInventory } from "@/src/services/inventoryService";
|
||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
||||
import { addItem, combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||
export const updateQuestController: RequestHandler = async (req, res) => {
|
||||
@ -19,28 +18,24 @@ export const updateQuestController: RequestHandler = async (req, res) => {
|
||||
|
||||
const inventory = await getInventory(accountId);
|
||||
|
||||
const updateQuestResponse: { CustomData?: string; InventoryChanges?: IInventoryChanges; MissionRewards: [] } = {
|
||||
MissionRewards: []
|
||||
};
|
||||
updateQuestKey(inventory, updateQuestRequest.QuestKeys);
|
||||
|
||||
if (updateQuestRequest.QuestKeys[0].Completed) {
|
||||
logger.debug(`completed quest ${updateQuestRequest.QuestKeys[0].ItemType} `);
|
||||
const questKeyName = updateQuestRequest.QuestKeys[0].ItemType;
|
||||
const questCompletionItems = getQuestCompletionItems(questKeyName);
|
||||
logger.debug(`quest completion items`, questCompletionItems);
|
||||
|
||||
const inventoryChanges = await addItems(inventory, questCompletionItems);
|
||||
inventory.ActiveQuest = "";
|
||||
logger.debug(`quest completion items { ${questCompletionItems.map(item => item.ItemType).join(", ")} }`);
|
||||
|
||||
updateQuestResponse.InventoryChanges = inventoryChanges;
|
||||
const inventoryChanges = {};
|
||||
for (const item of questCompletionItems) {
|
||||
const inventoryDelta = await addItem(inventory, item.ItemType, item.ItemCount);
|
||||
combineInventoryChanges(inventoryChanges, inventoryDelta.InventoryChanges);
|
||||
}
|
||||
|
||||
//TODO: might need to parse the custom data and add the associated items to inventory
|
||||
if (updateQuestRequest.QuestKeys[0].CustomData) {
|
||||
updateQuestResponse.CustomData = updateQuestRequest.QuestKeys[0].CustomData;
|
||||
res.json({ MissionRewards: [], inventoryChanges });
|
||||
return;
|
||||
}
|
||||
|
||||
await inventory.save();
|
||||
res.send(updateQuestResponse);
|
||||
res.send({ MissionRewards: [] });
|
||||
};
|
||||
|
@ -12,26 +12,23 @@ export interface IMessageClient extends Omit<IMessageDatabase, "_id" | "date" |
|
||||
messageId: IOid;
|
||||
}
|
||||
|
||||
export interface IMessageDatabase extends IMessage {
|
||||
export interface IMessageDatabase {
|
||||
ownerId: Types.ObjectId;
|
||||
date: Date; //created at
|
||||
date: Date;
|
||||
_id: Types.ObjectId;
|
||||
}
|
||||
|
||||
export interface IMessage {
|
||||
sndr: string;
|
||||
msg: string;
|
||||
sub: string;
|
||||
icon?: string;
|
||||
icon: string;
|
||||
highPriority?: boolean;
|
||||
lowPrioNewPlayers?: boolean;
|
||||
startDate?: Date;
|
||||
endDate?: Date;
|
||||
r?: boolean;
|
||||
att?: string[];
|
||||
countedAtt?: ITypeCount[];
|
||||
transmission?: string;
|
||||
arg?: Arg[];
|
||||
r?: boolean;
|
||||
}
|
||||
|
||||
export interface Arg {
|
||||
|
@ -60,10 +60,7 @@ import {
|
||||
ITraits,
|
||||
IKubrowPetDetailsClient,
|
||||
IKubrowPetEggDatabase,
|
||||
IKubrowPetEggClient,
|
||||
ICustomMarkers,
|
||||
IMarkerInfo,
|
||||
IMarker
|
||||
IKubrowPetEggClient
|
||||
} from "../../types/inventoryTypes/inventoryTypes";
|
||||
import { IOid } from "../../types/commonTypes";
|
||||
import {
|
||||
@ -482,22 +479,19 @@ const helminthResourceSchema = new Schema<IHelminthResource>(
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const questProgressSchema = new Schema<IQuestStage>(
|
||||
{
|
||||
const questProgressSchema = new Schema<IQuestStage>({
|
||||
c: Number,
|
||||
i: Boolean,
|
||||
m: Boolean,
|
||||
b: []
|
||||
},
|
||||
{ _id: false }
|
||||
);
|
||||
});
|
||||
|
||||
const questKeysSchema = new Schema<IQuestKeyDatabase>(
|
||||
{
|
||||
Progress: { type: [questProgressSchema], default: undefined },
|
||||
unlock: Boolean,
|
||||
Completed: Boolean,
|
||||
CustomData: String,
|
||||
//CustomData: Schema.Types.Mixed,
|
||||
CompletionDate: Date,
|
||||
ItemType: String
|
||||
},
|
||||
@ -852,35 +846,6 @@ infestedFoundrySchema.set("toJSON", {
|
||||
}
|
||||
});
|
||||
|
||||
const markerSchema = new Schema<IMarker>(
|
||||
{
|
||||
anchorName: String,
|
||||
color: Number,
|
||||
label: String,
|
||||
x: Number,
|
||||
y: Number,
|
||||
z: Number,
|
||||
showInHud: Boolean
|
||||
},
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const markerInfoSchema = new Schema<IMarkerInfo>(
|
||||
{
|
||||
icon: String,
|
||||
markers: [markerSchema]
|
||||
},
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const CustomMarkersSchema = new Schema<ICustomMarkers>(
|
||||
{
|
||||
tag: String,
|
||||
markerInfos: [markerInfoSchema]
|
||||
},
|
||||
{ _id: false }
|
||||
);
|
||||
|
||||
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||
{
|
||||
accountOwnerId: Schema.Types.ObjectId,
|
||||
@ -1165,9 +1130,6 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||
//https://warframe.fandom.com/wiki/Incarnon
|
||||
EvolutionProgress: { type: [evolutionProgressSchema], default: undefined },
|
||||
|
||||
//https://warframe.fandom.com/wiki/Loc-Pin
|
||||
CustomMarkers: { type: [CustomMarkersSchema], default: undefined },
|
||||
|
||||
//Unknown and system
|
||||
DuviriInfo: DuviriInfoSchema,
|
||||
Mailbox: MailboxSchema,
|
||||
|
@ -82,8 +82,6 @@ import { updateQuestController } from "@/src/controllers/api/updateQuestControll
|
||||
import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController";
|
||||
import { updateThemeController } from "../controllers/api/updateThemeController";
|
||||
import { upgradesController } from "@/src/controllers/api/upgradesController";
|
||||
import { giveKeyChainTriggeredMessageController } from "@/src/controllers/api/giveKeyChainTriggeredMessageController";
|
||||
import { giveQuestKeyRewardController } from "@/src/controllers/api/giveQuestKey";
|
||||
|
||||
const apiRouter = express.Router();
|
||||
|
||||
@ -140,8 +138,6 @@ apiRouter.post("/getAlliance.php", getAllianceController);
|
||||
apiRouter.post("/getVoidProjectionRewards.php", getVoidProjectionRewardsController);
|
||||
apiRouter.post("/gildWeapon.php", gildWeaponController);
|
||||
apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController);
|
||||
apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController);
|
||||
apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController);
|
||||
apiRouter.post("/guildTech.php", guildTechController);
|
||||
apiRouter.post("/hostSession.php", hostSessionController);
|
||||
apiRouter.post("/infestedFoundry.php", infestedFoundryController);
|
||||
|
@ -46,6 +46,7 @@ export const createNewEventMessages = async (req: Request) => {
|
||||
prev.eventMessageDate > current.eventMessageDate ? prev : current
|
||||
);
|
||||
|
||||
console.log("latestEventMessage", latestEventMessage);
|
||||
account.LatestEventMessageDate = new Date(latestEventMessage.eventMessageDate);
|
||||
await account.save();
|
||||
};
|
||||
|
@ -41,14 +41,13 @@ import {
|
||||
ExportRecipes,
|
||||
ExportResources,
|
||||
ExportSentinels,
|
||||
ExportSyndicates,
|
||||
ExportUpgrades,
|
||||
ExportWeapons,
|
||||
TStandingLimitBin
|
||||
} from "warframe-public-export-plus";
|
||||
import { createShip } from "./shipService";
|
||||
import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpdateService";
|
||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { IGiveKeyChainTriggeredItemsRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { toOid } from "../helpers/inventoryHelpers";
|
||||
|
||||
export const createInventory = async (
|
||||
@ -500,16 +499,11 @@ export const addItem = async (
|
||||
|
||||
export const addItems = async (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
items: ITypeCount[] | string[],
|
||||
items: ITypeCount[],
|
||||
inventoryChanges: IInventoryChanges = {}
|
||||
): Promise<IInventoryChanges> => {
|
||||
let inventoryDelta;
|
||||
for (const item of items) {
|
||||
if (typeof item === "string") {
|
||||
inventoryDelta = await addItem(inventory, item);
|
||||
} else {
|
||||
inventoryDelta = await addItem(inventory, item.ItemType, item.ItemCount);
|
||||
}
|
||||
const inventoryDelta = await addItem(inventory, item.ItemType, item.ItemCount);
|
||||
combineInventoryChanges(inventoryChanges, inventoryDelta.InventoryChanges);
|
||||
}
|
||||
return inventoryChanges;
|
||||
@ -1055,11 +1049,12 @@ export const addBooster = (ItemType: string, time: number, inventory: TInventory
|
||||
export const updateSyndicate = (
|
||||
inventory: HydratedDocument<IInventoryDatabase, InventoryDocumentProps>,
|
||||
syndicateUpdate: IMissionInventoryUpdateRequest["AffiliationChanges"]
|
||||
): void => {
|
||||
) => {
|
||||
syndicateUpdate?.forEach(affiliation => {
|
||||
const syndicate = inventory.Affiliations.find(x => x.Tag == affiliation.Tag);
|
||||
if (syndicate !== undefined) {
|
||||
syndicate.Standing += affiliation.Standing;
|
||||
syndicate.Standing =
|
||||
syndicate.Standing === undefined ? affiliation.Standing : syndicate.Standing + affiliation.Standing;
|
||||
syndicate.Title = syndicate.Title === undefined ? affiliation.Title : syndicate.Title + affiliation.Title;
|
||||
} else {
|
||||
inventory.Affiliations.push({
|
||||
@ -1070,8 +1065,8 @@ export const updateSyndicate = (
|
||||
FreeFavorsUsed: []
|
||||
});
|
||||
}
|
||||
updateStandingLimit(inventory, ExportSyndicates[affiliation.Tag].dailyLimitBin, affiliation.Standing);
|
||||
});
|
||||
return { AffiliationMods: [] };
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1079,7 +1074,7 @@ export const updateSyndicate = (
|
||||
*/
|
||||
export const addKeyChainItems = async (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
keyChainData: IKeyChainRequest
|
||||
keyChainData: IGiveKeyChainTriggeredItemsRequest
|
||||
): Promise<IInventoryChanges> => {
|
||||
const keyChainItems = getKeyChainItems(keyChainData);
|
||||
|
||||
@ -1097,7 +1092,5 @@ export const addKeyChainItems = async (
|
||||
combineInventoryChanges(inventoryChanges, inventoryChangesDelta.InventoryChanges);
|
||||
}
|
||||
|
||||
await addItems(inventory, nonStoreItems);
|
||||
|
||||
return inventoryChanges;
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { IGiveKeyChainTriggeredItemsRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { getIndexAfter } from "@/src/helpers/stringHelpers";
|
||||
import { ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
@ -142,7 +142,7 @@ export const getString = (key: string, dict: Record<string, string>): string =>
|
||||
return dict[key] ?? key;
|
||||
};
|
||||
|
||||
export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): string[] => {
|
||||
export const getKeyChainItems = ({ KeyChain, ChainStage }: IGiveKeyChainTriggeredItemsRequest): string[] => {
|
||||
const chainStages = ExportKeys[KeyChain].chainStages;
|
||||
if (!chainStages) {
|
||||
throw new Error(`KeyChain ${KeyChain} does not contain chain stages`);
|
||||
@ -154,9 +154,7 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
|
||||
}
|
||||
|
||||
if (keyChainStage.itemsToGiveWhenTriggered.length === 0) {
|
||||
throw new Error(
|
||||
`client requested key chain items in KeyChain ${KeyChain} at stage ${ChainStage}, but they did not exist`
|
||||
);
|
||||
throw new Error(`No items to give for KeyChain ${KeyChain} at stage ${ChainStage}`);
|
||||
}
|
||||
|
||||
return keyChainStage.itemsToGiveWhenTriggered;
|
||||
@ -196,24 +194,3 @@ export const getQuestCompletionItems = (questKey: string) => {
|
||||
|
||||
return items;
|
||||
};
|
||||
|
||||
export const getKeyChainMessage = ({ KeyChain, ChainStage }: IKeyChainRequest) => {
|
||||
const chainStages = ExportKeys[KeyChain]?.chainStages;
|
||||
if (!chainStages) {
|
||||
throw new Error(`KeyChain ${KeyChain} does not contain chain stages`);
|
||||
}
|
||||
|
||||
const keyChainStage = chainStages[ChainStage];
|
||||
if (!keyChainStage) {
|
||||
throw new Error(`KeyChainStage ${ChainStage} not found`);
|
||||
}
|
||||
|
||||
const chainStageMessage = keyChainStage.messageToSendWhenTriggered;
|
||||
|
||||
if (!chainStageMessage) {
|
||||
throw new Error(
|
||||
`client requested key chain message in keychain ${KeyChain} at stage ${ChainStage} but they did not exist`
|
||||
);
|
||||
}
|
||||
return chainStageMessage;
|
||||
};
|
||||
|
@ -155,20 +155,6 @@ export const addMissionInventoryUpdates = (
|
||||
inventory.PlayerSkills.LPP_DRIFTER += value.LPP_DRIFTER;
|
||||
break;
|
||||
}
|
||||
case "CustomMarkers": {
|
||||
value.forEach(markers => {
|
||||
const map = inventory.CustomMarkers
|
||||
? inventory.CustomMarkers.find(entry => entry.tag == markers.tag)
|
||||
: undefined;
|
||||
if (map) {
|
||||
map.markerInfos = markers.markerInfos;
|
||||
} else {
|
||||
inventory.CustomMarkers ??= [];
|
||||
inventory.CustomMarkers.push(markers);
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// Equipment XP updates
|
||||
if (equipmentKeys.includes(key as TEquipmentKey)) {
|
||||
@ -224,15 +210,11 @@ export const addMissionRewards = async (
|
||||
}
|
||||
|
||||
if (missions) {
|
||||
const node = getNode(missions.Tag);
|
||||
|
||||
if (node.missionIndex !== 28) {
|
||||
const levelCreditReward = getLevelCreditRewards(missions?.Tag);
|
||||
missionCompletionCredits += levelCreditReward;
|
||||
inventory.RegularCredits += levelCreditReward;
|
||||
logger.debug(`levelCreditReward ${levelCreditReward}`);
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: resolve issue with creditbundles
|
||||
for (const reward of MissionRewards) {
|
||||
|
@ -1,18 +1,7 @@
|
||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
|
||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
||||
import { IInventoryDatabase, IQuestKeyDatabase, IQuestStage } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { IInventoryDatabase, IQuestKeyDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||
import { logger } from "@/src/utils/logger";
|
||||
import { HydratedDocument } from "mongoose";
|
||||
|
||||
export interface IUpdateQuestRequest {
|
||||
QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
|
||||
PS: string;
|
||||
questCompletion: boolean;
|
||||
PlayerShipEvents: unknown[];
|
||||
crossPlaySetting: string;
|
||||
DoQuestReward: boolean;
|
||||
}
|
||||
|
||||
export const updateQuestKey = (
|
||||
inventory: HydratedDocument<IInventoryDatabase>,
|
||||
questKeyUpdate: IUpdateQuestRequest["QuestKeys"]
|
||||
@ -28,7 +17,6 @@ export const updateQuestKey = (
|
||||
throw new Error(`quest key ${questKeyUpdate[0].ItemType} not found`);
|
||||
}
|
||||
|
||||
console.log(questKeyUpdate[0]);
|
||||
inventory.QuestKeys[questKeyIndex] = questKeyUpdate[0];
|
||||
|
||||
if (questKeyUpdate[0].Completed) {
|
||||
@ -36,30 +24,11 @@ export const updateQuestKey = (
|
||||
}
|
||||
};
|
||||
|
||||
export const updateQuestStage = (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
{ KeyChain, ChainStage }: IKeyChainRequest,
|
||||
questStageUpdate: IQuestStage
|
||||
): void => {
|
||||
const quest = inventory.QuestKeys.find(quest => quest.ItemType === KeyChain);
|
||||
|
||||
if (!quest) {
|
||||
throw new Error(`Quest ${KeyChain} not found in QuestKeys`);
|
||||
export interface IUpdateQuestRequest {
|
||||
QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
|
||||
PS: string;
|
||||
questCompletion: boolean;
|
||||
PlayerShipEvents: unknown[];
|
||||
crossPlaySetting: string;
|
||||
DoQuestReward: boolean;
|
||||
}
|
||||
|
||||
if (!quest.Progress) {
|
||||
throw new Error(`Progress should always exist when giving keychain triggered items or messages`);
|
||||
}
|
||||
|
||||
const questStage = quest.Progress[ChainStage];
|
||||
|
||||
if (!questStage) {
|
||||
const questStageIndex = quest.Progress.push(questStageUpdate) - 1;
|
||||
if (questStageIndex !== ChainStage) {
|
||||
throw new Error(`Quest stage index mismatch: ${questStageIndex} !== ${ChainStage}`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Object.assign(questStage, questStageUpdate);
|
||||
};
|
||||
|
@ -86,7 +86,7 @@ export interface IQuestKeyDatabase {
|
||||
Progress?: IQuestStage[];
|
||||
unlock?: boolean;
|
||||
Completed?: boolean;
|
||||
CustomData?: string;
|
||||
CustomData?: string; //TODO: check whether this actually exists
|
||||
ItemType: string;
|
||||
CompletionDate?: Date;
|
||||
}
|
||||
@ -343,7 +343,6 @@ export interface IInventoryClient extends IDailyAffiliations {
|
||||
LastInventorySync: IOid;
|
||||
NextRefill: IMongoDate; // Next time argon crystals will have a decay tick
|
||||
FoundToday?: IMiscItem[]; // for Argon Crystals
|
||||
CustomMarkers: ICustomMarkers[];
|
||||
ActiveLandscapeTraps: any[];
|
||||
EvolutionProgress?: IEvolutionProgress[];
|
||||
RepVotes: any[];
|
||||
@ -1057,23 +1056,3 @@ export interface ICompletedDialogue {
|
||||
Booleans: string[];
|
||||
Choices: number[];
|
||||
}
|
||||
|
||||
export interface ICustomMarkers {
|
||||
tag: string;
|
||||
markerInfos: IMarkerInfo[];
|
||||
}
|
||||
|
||||
export interface IMarkerInfo {
|
||||
icon: string;
|
||||
markers: IMarker[];
|
||||
}
|
||||
|
||||
export interface IMarker {
|
||||
anchorName: string;
|
||||
color: number;
|
||||
label?: string;
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
showInHud: boolean;
|
||||
}
|
||||
|
@ -11,9 +11,8 @@ import {
|
||||
TSolarMapRegion,
|
||||
TEquipmentKey,
|
||||
IFusionTreasure,
|
||||
ICustomMarkers,
|
||||
IPlayerSkills,
|
||||
IQuestKeyDatabase
|
||||
IQuestKeyClient,
|
||||
IPlayerSkills
|
||||
} from "./inventoryTypes/inventoryTypes";
|
||||
|
||||
export interface IThemeUpdateRequest {
|
||||
@ -47,7 +46,7 @@ export type IMissionInventoryUpdateRequest = {
|
||||
Consumables?: ITypeCount[];
|
||||
FusionTreasures?: IFusionTreasure[];
|
||||
Recipes?: ITypeCount[];
|
||||
QuestKeys?: Omit<IQuestKeyDatabase, "CompletionDate">[];
|
||||
QuestKeys?: IQuestKeyClient[];
|
||||
RegularCredits?: number;
|
||||
MissionFailed: boolean;
|
||||
MissionStatus: IMissionStatus;
|
||||
@ -76,7 +75,6 @@ export type IMissionInventoryUpdateRequest = {
|
||||
EvolutionProgress?: IEvolutionProgress[];
|
||||
FocusXpIncreases?: number[];
|
||||
PlayerSkillGains: IPlayerSkills;
|
||||
CustomMarkers?: ICustomMarkers[];
|
||||
} & {
|
||||
[K in TEquipmentKey]?: IEquipmentClient[];
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user