This commit is contained in:
Ordis 2023-09-03 14:59:45 +02:00
parent e9bbab8f41
commit 3a4d117f62
11 changed files with 131 additions and 49 deletions

View File

@ -5,6 +5,7 @@ import { Request, RequestHandler, Response } from "express";
import config from "@/config.json"; import config from "@/config.json";
import testMissions from "@/static/fixed_responses/testMissions.json"; import testMissions from "@/static/fixed_responses/testMissions.json";
import testQuestKeys from "@/static/fixed_responses/testQuestKeys.json"; import testQuestKeys from "@/static/fixed_responses/testQuestKeys.json";
import testInventory from "../../../static/testInventory.json";
const inventoryController: RequestHandler = async (request: Request, response: Response) => { const inventoryController: RequestHandler = async (request: Request, response: Response) => {
const accountId = request.query.accountId; const accountId = request.query.accountId;
@ -23,12 +24,16 @@ const inventoryController: RequestHandler = async (request: Request, response: R
const inventoryJSON = inventory.toJSON(); const inventoryJSON = inventory.toJSON();
const inventoreResponse = toInventoryResponse(inventoryJSON); const inventoryResponse = toInventoryResponse(inventoryJSON);
if (config.testMission) inventoreResponse.Missions = testMissions; if (config.testMission) inventoryResponse.Missions = testMissions;
if (config.testQuestKey) inventoreResponse.QuestKeys = testQuestKeys; if (config.testQuestKey) inventoryResponse.QuestKeys = testQuestKeys;
response.json(inventoreResponse); const now = Math.floor(Date.now()) - 129600;
const date: string = (now + 24 * 60 * 60 * 1000).toString();
inventoryResponse.TrainingDate = { $date: { $numberLong: "1693769173000" } };
console.log(inventoryResponse.TrainingDate);
response.json(inventoryResponse);
}; };
export { inventoryController }; export { inventoryController };

View File

@ -0,0 +1,51 @@
import { parseString } from "@/src/helpers/general";
import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { Inventory } from "@/src/models/inventoryModel";
import { getInventory } from "@/src/services/inventoryService";
import { RequestHandler } from "express";
interface ITrainingResultsRequest {
numLevelsGained: number;
}
const epochDay = 86400 * 1000; // in ms
const timeNow = Date.now() + epochDay;
// eslint-disable-next-line @typescript-eslint/no-misused-promises
const trainingResultController: RequestHandler = async (req, res): Promise<void> => {
console.log(req.body.toString());
const accountId = parseString(req.query.accountId);
const trainingResults = getJSONfromString(req.body.toString()) as ITrainingResultsRequest;
const nextTrainingDate = Date.now().toString;
if (trainingResults.numLevelsGained == 0) {
res.json({
NewTrainingDate: {
$date: { $numberLong: nextTrainingDate }
},
NewLevel: 0,
InventoryChanges: []
});
}
const inventory = await getInventory(accountId);
console.log("inventory", inventory.TrainingDate);
inventory.TrainingDate = new Date(Date.now() + epochDay * 500);
console.log("inventory after", inventory.TrainingDate);
await inventory.save();
if (trainingResults.numLevelsGained == 1) {
res.json({
NewTrainingDate: {
$date: { $numberLong: nextTrainingDate }
},
NewLevel: 1,
InventoryChanges: []
});
}
};
export { trainingResultController };

View File

@ -1,7 +1,7 @@
import { RequestHandler } from "express"; import { RequestHandler } from "express";
const uploadController: RequestHandler = (_req, res) => { const uploadController: RequestHandler = (_req, res) => {
res.json({}); res.status(200).end();
}; };
export { uploadController }; export { uploadController };

View File

@ -1,9 +1,10 @@
import { IInventoryDatabase, IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryDatabase, IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes";
// a schema's toJSON is responsible for changing Oid and Date to their corresponding Response versions __id to "ItemId":{"$oid":"6450f720bc562ebf030222d4"}, and a Date to "date":{"$date":{"$numberLong":"unix timestamp"})
const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => { const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { accountOwnerId, ...inventoreResponse } = inventoryDatabase; const { accountOwnerId, ...inventoryResponse } = inventoryDatabase;
return inventoreResponse; return inventoryResponse as unknown as IInventoryResponse;
}; };
export { toInventoryResponse }; export { toInventoryResponse };

View File

@ -1,4 +1,4 @@
const getJSONfromString = (str: string): any => { export const getJSONfromString = (str: string): any => {
const jsonSubstring = str.substring(0, str.lastIndexOf("}") + 1); const jsonSubstring = str.substring(0, str.lastIndexOf("}") + 1);
return JSON.parse(jsonSubstring); return JSON.parse(jsonSubstring);
}; };

View File

@ -1,5 +1,14 @@
import { Model, Schema, Types, model } from "mongoose"; import { Model, Schema, Types, model } from "mongoose";
import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes"; import {
FlavourItem,
RawUpgrade,
MiscItem,
IInventoryDatabase,
Booster,
IInventoryResponse,
IInventoryDatabaseDocument,
IInventoryResponseDocument
} from "../types/inventoryTypes/inventoryTypes";
import { Oid } from "../types/commonTypes"; import { Oid } from "../types/commonTypes";
import { ISuitDatabase, ISuitDocument } from "@/src/types/inventoryTypes/SuitTypes"; import { ISuitDatabase, ISuitDocument } from "@/src/types/inventoryTypes/SuitTypes";
import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
@ -19,7 +28,7 @@ const colorSchema = new Schema({
m1: Number m1: Number
}); });
const longGunConfigSchema = new Schema({ const weaponConfigSchema = new Schema({
Skins: [String], Skins: [String],
pricol: colorSchema, pricol: colorSchema,
attcol: colorSchema, attcol: colorSchema,
@ -51,7 +60,7 @@ const longGunConfigSchema = new Schema({
const WeaponSchema = new Schema({ const WeaponSchema = new Schema({
ItemType: String, ItemType: String,
Configs: [longGunConfigSchema], Configs: [weaponConfigSchema],
UpgradeVer: Number, UpgradeVer: Number,
XP: Number, XP: Number,
Features: Number, Features: Number,
@ -201,7 +210,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
Recipes: [Schema.Types.Mixed], Recipes: [Schema.Types.Mixed],
WeaponSkins: [Schema.Types.Mixed], WeaponSkins: [Schema.Types.Mixed],
PendingRecipes: [Schema.Types.Mixed], PendingRecipes: [Schema.Types.Mixed],
TrainingDate: Schema.Types.Mixed, TrainingDate: Date,
PlayerLevel: Number, PlayerLevel: Number,
Upgrades: [Schema.Types.Mixed], Upgrades: [Schema.Types.Mixed],
EquippedGear: [String], EquippedGear: [String],
@ -327,9 +336,17 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
}); });
inventorySchema.set("toJSON", { inventorySchema.set("toJSON", {
transform(_document, returnedObject) { transform(_document, returnedObject: IInventoryDatabaseDocument) {
delete returnedObject._id; delete returnedObject._id;
delete returnedObject.__v; delete returnedObject.__v;
const trainingDate = returnedObject.TrainingDate;
(returnedObject as unknown as IInventoryResponse).TrainingDate = {
$date: {
$numberLong: trainingDate.getTime().toString()
}
};
} }
}); });

View File

@ -29,6 +29,7 @@ import { updateSessionGetController, updateSessionPostController } from "@/src/c
import { viewController } from "@/src/controllers/api/viewController"; import { viewController } from "@/src/controllers/api/viewController";
import { joinSessionController } from "@/src/controllers/api/joinSessionController"; import { joinSessionController } from "@/src/controllers/api/joinSessionController";
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout";
import { trainingResultController } from "@/src/controllers/api/trainingResultController";
import express from "express"; import express from "express";
@ -71,4 +72,6 @@ apiRouter.post("/genericUpdate.php", genericUpdateController);
apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
apiRouter.post("/joinSession.php", joinSessionController); apiRouter.post("/joinSession.php", joinSessionController);
apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/saveLoadout.php", saveLoadoutController);
apiRouter.post("/trainingResult.php", trainingResultController);
export { apiRouter }; export { apiRouter };

View File

@ -34,7 +34,7 @@ const createInventory = async (accountOwnerId: Types.ObjectId) => {
//const updateInventory = async (accountOwnerId: Types.ObjectId, inventoryChanges: any) => {}; //const updateInventory = async (accountOwnerId: Types.ObjectId, inventoryChanges: any) => {};
const getInventory = async (accountOwnerId: string) => { export const getInventory = async (accountOwnerId: string) => {
const inventory = await Inventory.findOne({ accountOwnerId: accountOwnerId }); const inventory = await Inventory.findOne({ accountOwnerId: accountOwnerId });
if (!inventory) { if (!inventory) {

View File

@ -1,3 +1,9 @@
export interface Oid { export interface Oid {
$oid: string; $oid: string;
} }
export interface BSONDate {
$date: {
$numberLong: string;
};
}

View File

@ -1,20 +1,21 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { Document, Types } from "mongoose"; import { Document, Types } from "mongoose";
import { Oid } from "../commonTypes"; import { Oid, BSONDate } from "../commonTypes";
import { AbilityOverride, Color, FocusSchool, Polarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { AbilityOverride, Color, FocusSchool, Polarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes";
import { OperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; import { OperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
export interface IInventoryDatabase extends IInventoryResponse { export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {}
export interface IInventoryDatabase extends Omit<IInventoryResponse, "TrainingDate"> {
accountOwnerId: Types.ObjectId; accountOwnerId: Types.ObjectId;
TrainingDate: Date;
} }
export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {} export interface IInventoryResponseDocument extends IInventoryResponse, Document {}
export interface IInventoryResponse { export interface IInventoryResponse {
SubscribedToEmails: number; SubscribedToEmails: number;
Created: Date; Created: BSONDate;
RewardSeed: number; RewardSeed: number;
RegularCredits: number; RegularCredits: number;
PremiumCredits: number; PremiumCredits: number;
@ -58,7 +59,7 @@ export interface IInventoryResponse {
Recipes: Consumable[]; Recipes: Consumable[];
WeaponSkins: WeaponSkin[]; WeaponSkins: WeaponSkin[];
PendingRecipes: PendingRecipe[]; PendingRecipes: PendingRecipe[];
TrainingDate: Date; TrainingDate: BSONDate;
PlayerLevel: number; PlayerLevel: number;
Upgrades: CrewShipSalvagedWeaponSkin[]; Upgrades: CrewShipSalvagedWeaponSkin[];
EquippedGear: string[]; EquippedGear: string[];
@ -135,7 +136,7 @@ export interface IInventoryResponse {
InvasionChainProgress: InvasionChainProgress[]; InvasionChainProgress: InvasionChainProgress[];
DataKnives: DataKnife[]; DataKnives: DataKnife[];
NemesisHistory: NemesisHistory[]; NemesisHistory: NemesisHistory[];
LastNemesisAllySpawnTime: Date; LastNemesisAllySpawnTime: BSONDate;
Settings: Settings; Settings: Settings;
PersonalTechProjects: PersonalTechProject[]; PersonalTechProjects: PersonalTechProject[];
CrewShips: CrewShip[]; CrewShips: CrewShip[];
@ -146,7 +147,7 @@ export interface IInventoryResponse {
CrewShipWeapons: CrewShipWeapon[]; CrewShipWeapons: CrewShipWeapon[];
CrewShipSalvagedWeapons: CrewShipWeapon[]; CrewShipSalvagedWeapons: CrewShipWeapon[];
CrewShipWeaponSkins: CrewShipSalvagedWeaponSkin[]; CrewShipWeaponSkins: CrewShipSalvagedWeaponSkin[];
TradeBannedUntil: Date; TradeBannedUntil: BSONDate;
PlayedParkourTutorial: boolean; PlayedParkourTutorial: boolean;
SubscribedToEmailsPersonalized: number; SubscribedToEmailsPersonalized: number;
MechBin: CrewMemberBinClass; MechBin: CrewMemberBinClass;
@ -154,7 +155,7 @@ export interface IInventoryResponse {
DailyAffiliationNecraloid: number; DailyAffiliationNecraloid: number;
MechSuits: MechSuit[]; MechSuits: MechSuit[];
InfestedFoundry: InfestedFoundry; InfestedFoundry: InfestedFoundry;
BlessingCooldown: Date; BlessingCooldown: BSONDate;
CrewMemberBin: CrewMemberBinClass; CrewMemberBin: CrewMemberBinClass;
CrewShipHarnesses: CrewShipHarness[]; CrewShipHarnesses: CrewShipHarness[];
CrewShipRawSalvage: Consumable[]; CrewShipRawSalvage: Consumable[];
@ -166,7 +167,7 @@ export interface IInventoryResponse {
NemesisAbandonedRewards: string[]; NemesisAbandonedRewards: string[];
DailyAffiliationKahl: number; DailyAffiliationKahl: number;
LastInventorySync: Oid; LastInventorySync: Oid;
NextRefill: Date; NextRefill: BSONDate;
ActiveLandscapeTraps: any[]; ActiveLandscapeTraps: any[];
EvolutionProgress: any[]; EvolutionProgress: any[];
RepVotes: any[]; RepVotes: any[];
@ -207,10 +208,6 @@ export interface Alignment {
Alignment: number; Alignment: number;
} }
export interface Date {
$date: { $numberLong: string };
}
export interface Booster { export interface Booster {
ExpiryDate: number; ExpiryDate: number;
ItemType: string; ItemType: string;
@ -271,7 +268,7 @@ export interface CrewMember {
ItemType: string; ItemType: string;
NemesisFingerprint: number; NemesisFingerprint: number;
Seed: number; Seed: number;
HireDate: Date; HireDate: BSONDate;
AssignedRole: number; AssignedRole: number;
SkillEfficiency: SkillEfficiency; SkillEfficiency: SkillEfficiency;
WeaponConfigIdx: number; WeaponConfigIdx: number;
@ -434,7 +431,7 @@ export interface Drone {
ItemType: string; ItemType: string;
CurrentHP: number; CurrentHP: number;
ItemId: Oid; ItemId: Oid;
RepairStart?: Date; RepairStart?: BSONDate;
} }
export interface EmailItem { export interface EmailItem {
@ -522,7 +519,7 @@ export interface InvasionChainProgress {
export interface KubrowPetEgg { export interface KubrowPetEgg {
ItemType: KubrowPetEggItemType; ItemType: KubrowPetEggItemType;
ExpirationDate: Date; ExpirationDate: BSONDate;
ItemId: Oid; ItemId: Oid;
} }
@ -575,7 +572,7 @@ export interface KubrowPet {
Polarized?: number; Polarized?: number;
Polarity?: Polarity[]; Polarity?: Polarity[];
Features?: number; Features?: number;
InfestationDate?: Date; InfestationDate?: BSONDate;
InfestationDays?: number; InfestationDays?: number;
InfestationType?: string; InfestationType?: string;
ItemId: Oid; ItemId: Oid;
@ -595,7 +592,7 @@ export interface Details {
HasCollar: boolean; HasCollar: boolean;
PrintsRemaining: number; PrintsRemaining: number;
Status: Status; Status: Status;
HatchDate: Date; HatchDate: BSONDate;
DominantTraits: Traits; DominantTraits: Traits;
RecessiveTraits: Traits; RecessiveTraits: Traits;
IsMale: boolean; IsMale: boolean;
@ -738,7 +735,7 @@ export interface Mission {
Completes: number; Completes: number;
Tier?: number; Tier?: number;
Tag: string; Tag: string;
RewardsCooldownTime?: Date; RewardsCooldownTime?: BSONDate;
} }
export interface MoaPet { export interface MoaPet {
@ -763,7 +760,7 @@ export interface NemesisHistory {
BirthNode: BirthNode; BirthNode: BirthNode;
Rank: number; Rank: number;
k: boolean; k: boolean;
d: Date; d: BSONDate;
GuessHistory?: number[]; GuessHistory?: number[];
currentGuess?: number; currentGuess?: number;
Traded?: boolean; Traded?: boolean;
@ -812,13 +809,13 @@ export interface OperatorLoadOut {
} }
export interface PendingCoupon { export interface PendingCoupon {
Expiry: Date; Expiry: BSONDate;
Discount: number; Discount: number;
} }
export interface PendingRecipe { export interface PendingRecipe {
ItemType: string; ItemType: string;
CompletionDate: Date; CompletionDate: BSONDate;
ItemId: Oid; ItemId: Oid;
} }
@ -877,7 +874,7 @@ export enum GivingSlotOrderInfo {
} }
export interface PeriodicMissionCompletion { export interface PeriodicMissionCompletion {
date: Date; date: BSONDate;
tag: string; tag: string;
count?: number; count?: number;
} }
@ -896,7 +893,7 @@ export interface PersonalTechProject {
ReqCredits: number; ReqCredits: number;
ItemType: string; ItemType: string;
ReqItems: Consumable[]; ReqItems: Consumable[];
CompletionDate?: Date; CompletionDate?: BSONDate;
ItemId: Oid; ItemId: Oid;
ProductCategory?: string; ProductCategory?: string;
CategoryItemId?: Oid; CategoryItemId?: Oid;
@ -917,7 +914,7 @@ export interface QuestKey {
unlock?: boolean; unlock?: boolean;
Completed?: boolean; Completed?: boolean;
ItemType: string; ItemType: string;
CompletionDate?: Date; CompletionDate?: BSONDate;
} }
export interface Progress { export interface Progress {
@ -1094,15 +1091,15 @@ export interface WebFlags {
activeBuyPlat: number; activeBuyPlat: number;
noShow2FA: boolean; noShow2FA: boolean;
Tennocon2018Digital: boolean; Tennocon2018Digital: boolean;
VisitPrimeAccess: Date; VisitPrimeAccess: BSONDate;
VisitTennocon2019: Date; VisitTennocon2019: BSONDate;
enteredSC2019: Date; enteredSC2019: BSONDate;
VisitPrimeVault: Date; VisitPrimeVault: BSONDate;
VisitBuyPlatinum: Date; VisitBuyPlatinum: BSONDate;
ClickedSku_640_Page__en_buyplatinum: Date; ClickedSku_640_Page__en_buyplatinum: BSONDate;
ClickedSku_640_Page__buyplatinum: Date; ClickedSku_640_Page__buyplatinum: BSONDate;
VisitStarterPack: Date; VisitStarterPack: BSONDate;
Tennocon2020Digital: boolean; Tennocon2020Digital: boolean;
Anniversary2021: boolean; Anniversary2021: boolean;
HitDownloadBtn: Date; HitDownloadBtn: BSONDate;
} }

View File

@ -96,6 +96,8 @@
"AdultOperatorLoadOuts": [], "AdultOperatorLoadOuts": [],
"KahlLoadOuts": [], "KahlLoadOuts": [],
"PendingRecipes": [], "PendingRecipes": [],
"TrainingDate": 0,
"PlayerLevel": 0,
"PersonalGoalProgress": [], "PersonalGoalProgress": [],
"PersonalTechProjects": [], "PersonalTechProjects": [],
"QualifyingInvasions": [], "QualifyingInvasions": [],