feat(import): additional fields #1305

Merged
Sainan merged 3 commits from AMelonInsideLemon/SpaceNinjaServer:importer-new-fields into main 2025-03-23 13:33:27 -07:00
4 changed files with 160 additions and 71 deletions

View File

@ -76,7 +76,6 @@ import {
IIncentiveState, IIncentiveState,
ISongChallenge, ISongChallenge,
ILibraryPersonalProgress, ILibraryPersonalProgress,
ICrewShipWeaponDatabase,
IRecentVendorPurchaseDatabase, IRecentVendorPurchaseDatabase,
IVendorPurchaseHistoryEntryDatabase, IVendorPurchaseHistoryEntryDatabase,
IVendorPurchaseHistoryEntryClient, IVendorPurchaseHistoryEntryClient,
@ -1118,25 +1117,6 @@ const alignmentSchema = new Schema<IAlignment>(
{ _id: false } { _id: false }
); );
const crewShipWeaponSchema2 = new Schema<ICrewShipWeaponDatabase>(
{
ItemType: String
},
{ id: false }
);
crewShipWeaponSchema2.virtual("ItemId").get(function () {
return { $oid: this._id.toString() } satisfies IOid;
});
crewShipWeaponSchema2.set("toJSON", {
virtuals: true,
transform(_document, returnedObject) {
delete returnedObject._id;
delete returnedObject.__v;
}
});
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>( const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
{ {
accountOwnerId: Schema.Types.ObjectId, accountOwnerId: Schema.Types.ObjectId,
@ -1259,20 +1239,20 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
//Default RailJack //Default RailJack
CrewShipAmmo: [typeCountSchema], CrewShipAmmo: [typeCountSchema],
CrewShipWeapons: [crewShipWeaponSchema2], CrewShipWeapons: [EquipmentSchema],
CrewShipWeaponSkins: [upgradeSchema], CrewShipWeaponSkins: [upgradeSchema],
CrewShipSalvagedWeapons: [EquipmentSchema],
CrewShipSalvagedWeaponSkins: [upgradeSchema],
//NPC Crew and weapon //RailJack Crew
CrewMembers: [Schema.Types.Mixed], CrewMembers: [Schema.Types.Mixed],
CrewShipSalvagedWeaponSkins: [Schema.Types.Mixed],
CrewShipSalvagedWeapons: [Schema.Types.Mixed],
//Complete Mission\Quests //Complete Mission\Quests
Missions: [missionSchema], Missions: [missionSchema],
QuestKeys: [questKeysSchema], QuestKeys: [questKeysSchema],
ActiveQuest: { type: String, default: "" }, ActiveQuest: { type: String, default: "" },
//item like DojoKey or Boss missions key //item like DojoKey or Boss missions key
LevelKeys: [Schema.Types.Mixed], LevelKeys: [typeCountSchema],
//Active quests //Active quests
Quests: [Schema.Types.Mixed], Quests: [Schema.Types.Mixed],
@ -1333,7 +1313,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined }, SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
//New Quest Email //New Quest Email
EmailItems: [TypeXPItemSchema], EmailItems: [typeCountSchema],
//Profile->Wishlist //Profile->Wishlist
Wishlist: [String], Wishlist: [String],
@ -1524,8 +1504,8 @@ export type InventoryDocumentProps = {
WeaponSkins: Types.DocumentArray<IWeaponSkinDatabase>; WeaponSkins: Types.DocumentArray<IWeaponSkinDatabase>;
QuestKeys: Types.DocumentArray<IQuestKeyDatabase>; QuestKeys: Types.DocumentArray<IQuestKeyDatabase>;
Drones: Types.DocumentArray<IDroneDatabase>; Drones: Types.DocumentArray<IDroneDatabase>;
CrewShipWeapons: Types.DocumentArray<ICrewShipWeaponDatabase>;
CrewShipWeaponSkins: Types.DocumentArray<IUpgradeDatabase>; CrewShipWeaponSkins: Types.DocumentArray<IUpgradeDatabase>;
CrewShipSalvagedWeaponsSkins: Types.DocumentArray<IUpgradeDatabase>;
} & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> }; } & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> };
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types

View File

@ -23,6 +23,12 @@ import {
IKubrowPetDetailsDatabase, IKubrowPetDetailsDatabase,
ILoadoutConfigClient, ILoadoutConfigClient,
ILoadOutPresets, ILoadOutPresets,
INemesisClient,
INemesisDatabase,
IPendingRecipeClient,
IPendingRecipeDatabase,
IQuestKeyClient,
IQuestKeyDatabase,
ISlots, ISlots,
IUpgradeClient, IUpgradeClient,
IUpgradeDatabase, IUpgradeDatabase,
@ -144,6 +150,27 @@ const convertKubrowDetails = (client: IKubrowPetDetailsClient): IKubrowPetDetail
}; };
}; };
const convertQuestKey = (client: IQuestKeyClient): IQuestKeyDatabase => {
return {
...client,
CompletionDate: convertOptionalDate(client.CompletionDate)
};
};
const convertPendingRecipe = (client: IPendingRecipeClient): IPendingRecipeDatabase => {
return {
...client,
CompletionDate: convertDate(client.CompletionDate)
};
};
const convertNemesis = (client: INemesisClient): INemesisDatabase => {
return {
...client,
d: convertDate(client.d)
};
};
export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<IInventoryClient>): void => { export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<IInventoryClient>): void => {
for (const key of equipmentKeys) { for (const key of equipmentKeys) {
if (client[key] !== undefined) { if (client[key] !== undefined) {
@ -153,10 +180,22 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
if (client.WeaponSkins !== undefined) { if (client.WeaponSkins !== undefined) {
replaceArray<IWeaponSkinDatabase>(db.WeaponSkins, client.WeaponSkins.map(convertWeaponSkin)); replaceArray<IWeaponSkinDatabase>(db.WeaponSkins, client.WeaponSkins.map(convertWeaponSkin));
} }
if (client.Upgrades !== undefined) { for (const key of ["Upgrades", "CrewShipSalvagedWeaponSkins", "CrewShipWeaponSkins"] as const) {
replaceArray<IUpgradeDatabase>(db.Upgrades, client.Upgrades.map(convertUpgrade)); if (client[key] !== undefined) {
replaceArray<IUpgradeDatabase>(db[key], client[key].map(convertUpgrade));
}
} }
for (const key of ["RawUpgrades", "MiscItems", "Consumables"] as const) { for (const key of [
"RawUpgrades",
"MiscItems",
"Consumables",
"Recipes",
"LevelKeys",
"EmailItems",
"ShipDecorations",
"CrewShipAmmo",
"CrewShipRawSalvage"
] as const) {
if (client[key] !== undefined) { if (client[key] !== undefined) {
db[key].splice(0, db[key].length); db[key].splice(0, db[key].length);
client[key].forEach(x => { client[key].forEach(x => {
@ -190,8 +229,16 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
replaceSlots(db[key], client[key]); replaceSlots(db[key], client[key]);
} }
} }
if (client.UseAdultOperatorLoadout !== undefined) { for (const key of [
db.UseAdultOperatorLoadout = client.UseAdultOperatorLoadout; "UseAdultOperatorLoadout",
"HasOwnedVoidProjectionsPreviously",
"ReceivedStartingGear",
"ArchwingEnabled",
"PlayedParkourTutorial"
] as const) {
if (client[key] !== undefined) {
db[key] = client[key];
}
} }
for (const key of [ for (const key of [
"PlayerLevel", "PlayerLevel",
@ -199,18 +246,37 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
"PremiumCredits", "PremiumCredits",
"PremiumCreditsFree", "PremiumCreditsFree",
"FusionPoints", "FusionPoints",
"PrimeTokens" "PrimeTokens",
"TradesRemaining",
"GiftsRemaining",
"ChallengesFixVersion"
] as const) { ] as const) {
if (client[key] !== undefined) { if (client[key] !== undefined) {
db[key] = client[key]; db[key] = client[key];
} }
} }
for (const key of ["ThemeStyle", "ThemeBackground", "ThemeSounds", "EquippedInstrument", "FocusAbility"] as const) { for (const key of [
"ThemeStyle",
"ThemeBackground",
"ThemeSounds",
"EquippedInstrument",
"FocusAbility",
"ActiveQuest",
"SupportedSyndicate",
"ActiveAvatarImageType"
] as const) {
if (client[key] !== undefined) { if (client[key] !== undefined) {
db[key] = client[key]; db[key] = client[key];
} }
} }
for (const key of ["EquippedGear", "EquippedEmotes", "NodeIntrosCompleted"] as const) { for (const key of [
"EquippedGear",
"EquippedEmotes",
"NodeIntrosCompleted",
"DeathMarks",
"Wishlist",
"NemesisAbandonedRewards"
] as const) {
if (client[key] !== undefined) { if (client[key] !== undefined) {
db[key] = client[key]; db[key] = client[key];
} }
@ -242,6 +308,77 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
if (client.CustomMarkers !== undefined) { if (client.CustomMarkers !== undefined) {
db.CustomMarkers = client.CustomMarkers; db.CustomMarkers = client.CustomMarkers;
} }
if (client.ChallengeProgress !== undefined) {
db.ChallengeProgress = client.ChallengeProgress;
}
if (client.QuestKeys !== undefined) {
replaceArray<IQuestKeyDatabase>(db.QuestKeys, client.QuestKeys.map(convertQuestKey));
}
if (client.LastRegionPlayed !== undefined) {
db.LastRegionPlayed = client.LastRegionPlayed;
}
if (client.PendingRecipes !== undefined) {
replaceArray<IPendingRecipeDatabase>(db.PendingRecipes, client.PendingRecipes.map(convertPendingRecipe));
}
if (client.TauntHistory !== undefined) {
db.TauntHistory = client.TauntHistory;
}
if (client.LoreFragmentScans !== undefined) {
db.LoreFragmentScans = client.LoreFragmentScans;
}
for (const key of ["PendingSpectreLoadouts", "SpectreLoadouts"] as const) {
if (client[key] !== undefined) {
db[key] = client[key];
}
}
if (client.FocusXP !== undefined) {
db.FocusXP = client.FocusXP;
}
for (const key of ["Alignment", "AlignmentReplay"] as const) {
if (client[key] !== undefined) {
db[key] = client[key];
}
}
if (client.StepSequencers !== undefined) {
db.StepSequencers = client.StepSequencers;
}
if (client.CompletedJobChains !== undefined) {
db.CompletedJobChains = client.CompletedJobChains;
}
if (client.Nemesis !== undefined) {
db.Nemesis = convertNemesis(client.Nemesis);
}
if (client.PlayerSkills !== undefined) {
db.PlayerSkills = client.PlayerSkills;
}
if (client.LotusCustomization !== undefined) {
db.LotusCustomization = client.LotusCustomization;
}
if (client.CollectibleSeries !== undefined) {
db.CollectibleSeries = client.CollectibleSeries;
}
for (const key of ["LibraryAvailableDailyTaskInfo", "LibraryActiveDailyTaskInfo"] as const) {
if (client[key] !== undefined) {
db[key] = client[key];
}
}
if (client.EndlessXP !== undefined) {
db.EndlessXP = client.EndlessXP;
}
if (client.SongChallenges !== undefined) {
db.SongChallenges = client.SongChallenges;
}
if (client.Missions !== undefined) {
db.Missions = client.Missions;
}
if (client.FlavourItems !== undefined) {
db.FlavourItems.splice(0, db.FlavourItems.length);
client.FlavourItems.forEach(x => {
db.FlavourItems.push({
ItemType: x.ItemType
});
});
}
}; };
const convertLoadOutConfig = (client: ILoadoutConfigClient): ILoadoutConfigDatabase => { const convertLoadOutConfig = (client: ILoadoutConfigClient): ILoadoutConfigDatabase => {

View File

@ -25,8 +25,7 @@ import {
ILibraryDailyTaskInfo, ILibraryDailyTaskInfo,
ICalendarProgress, ICalendarProgress,
IDroneClient, IDroneClient,
IUpgradeClient, IUpgradeClient
ICrewShipWeaponClient
} from "@/src/types/inventoryTypes/inventoryTypes"; } from "@/src/types/inventoryTypes/inventoryTypes";
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate"; import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
import { IMissionInventoryUpdateRequest, IUpdateChallengeProgressRequest } from "../types/requestTypes"; import { IMissionInventoryUpdateRequest, IUpdateChallengeProgressRequest } from "../types/requestTypes";
@ -426,7 +425,7 @@ export const addItem = async (
} }
if (typeName in ExportRailjackWeapons) { if (typeName in ExportRailjackWeapons) {
return { return {
...addCrewShipWeapon(inventory, typeName), ...addEquipment(inventory, ExportRailjackWeapons[typeName].productCategory, typeName),
...occupySlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS, premiumPurchase) ...occupySlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS, premiumPurchase)
}; };
} }
@ -939,20 +938,6 @@ export const addSkin = (
return inventoryChanges; return inventoryChanges;
}; };
const addCrewShipWeapon = (
inventory: TInventoryDatabaseDocument,
typeName: string,
inventoryChanges: IInventoryChanges = {}
): IInventoryChanges => {
const index = inventory.CrewShipWeapons.push({ ItemType: typeName, _id: new Types.ObjectId() }) - 1;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
inventoryChanges.CrewShipWeapons ??= [];
(inventoryChanges.CrewShipWeapons as ICrewShipWeaponClient[]).push(
inventory.CrewShipWeapons[index].toJSON<ICrewShipWeaponClient>()
);
return inventoryChanges;
};
const addCrewShipWeaponSkin = ( const addCrewShipWeaponSkin = (
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
typeName: string, typeName: string,

View File

@ -30,9 +30,8 @@ export interface IInventoryDatabase
| "Ships" | "Ships"
| "WeaponSkins" | "WeaponSkins"
| "Upgrades" | "Upgrades"
| "CrewShipSalvagedWeaponSkins"
| "CrewShipWeapons"
| "CrewShipWeaponSkins" | "CrewShipWeaponSkins"
| "CrewShipSalvagedWeaponSkins"
| "AdultOperatorLoadOuts" | "AdultOperatorLoadOuts"
| "OperatorLoadOuts" | "OperatorLoadOuts"
| "KahlLoadOuts" | "KahlLoadOuts"
@ -59,9 +58,8 @@ export interface IInventoryDatabase
Ships: Types.ObjectId[]; Ships: Types.ObjectId[];
WeaponSkins: IWeaponSkinDatabase[]; WeaponSkins: IWeaponSkinDatabase[];
Upgrades: IUpgradeDatabase[]; Upgrades: IUpgradeDatabase[];
CrewShipSalvagedWeaponSkins: IUpgradeDatabase[];
CrewShipWeapons: ICrewShipWeaponDatabase[];
CrewShipWeaponSkins: IUpgradeDatabase[]; CrewShipWeaponSkins: IUpgradeDatabase[];
CrewShipSalvagedWeaponSkins: IUpgradeDatabase[];
AdultOperatorLoadOuts: IOperatorConfigDatabase[]; AdultOperatorLoadOuts: IOperatorConfigDatabase[];
OperatorLoadOuts: IOperatorConfigDatabase[]; OperatorLoadOuts: IOperatorConfigDatabase[];
KahlLoadOuts: IOperatorConfigDatabase[]; KahlLoadOuts: IOperatorConfigDatabase[];
@ -112,7 +110,9 @@ export const equipmentKeys = [
"DataKnives", "DataKnives",
"MechSuits", "MechSuits",
"CrewShipHarnesses", "CrewShipHarnesses",
"KubrowPets" "KubrowPets",
"CrewShipWeapons",
"CrewShipSalvagedWeapons"
] as const; ] as const;
export type TEquipmentKey = (typeof equipmentKeys)[number]; export type TEquipmentKey = (typeof equipmentKeys)[number];
@ -297,10 +297,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
PersonalTechProjects: IPersonalTechProject[]; PersonalTechProjects: IPersonalTechProject[];
PlayerSkills: IPlayerSkills; PlayerSkills: IPlayerSkills;
CrewShipAmmo: ITypeCount[]; CrewShipAmmo: ITypeCount[];
CrewShipSalvagedWeaponSkins: IUpgradeClient[];
CrewShipWeapons: ICrewShipWeaponClient[];
CrewShipSalvagedWeapons: IEquipmentClient[];
CrewShipWeaponSkins: IUpgradeClient[]; CrewShipWeaponSkins: IUpgradeClient[];
CrewShipSalvagedWeaponSkins: IUpgradeClient[];
TradeBannedUntil?: IMongoDate; TradeBannedUntil?: IMongoDate;
PlayedParkourTutorial: boolean; PlayedParkourTutorial: boolean;
SubscribedToEmailsPersonalized: number; SubscribedToEmailsPersonalized: number;
@ -536,17 +534,6 @@ export interface ICrewShipWeapon {
PORT_GUNS: ICrewShipPortGuns; PORT_GUNS: ICrewShipPortGuns;
} }
// inventory.CrewShipWeapons
export interface ICrewShipWeaponClient {
ItemType: string;
ItemId: IOid;
}
export interface ICrewShipWeaponDatabase {
ItemType: string;
_id: Types.ObjectId;
}
export interface ICrewShipPilotWeapon { export interface ICrewShipPilotWeapon {
PRIMARY_A: IEquipmentSelection; PRIMARY_A: IEquipmentSelection;
SECONDARY_A: IEquipmentSelection; SECONDARY_A: IEquipmentSelection;