forked from OpenWF/SpaceNinjaServer
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			main
			...
			CompletedJ
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e361d7ee5c | |||
| 2187b1cae5 | |||
| 8e4f507780 | 
							
								
								
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @ -13,13 +13,4 @@ jobs: | |||||||
|             - run: npm ci |             - run: npm ci | ||||||
|             - run: cp config.json.example config.json |             - run: cp config.json.example config.json | ||||||
|             - run: npm run verify |             - run: npm run verify | ||||||
|             - run: npm run lint:ci |             - run: npm run lint | ||||||
|             - run: npm run prettier |  | ||||||
|             - name: Fail if there are uncommitted changes |  | ||||||
|               run: | |  | ||||||
|                   if [[ -n "$(git status --porcelain)" ]]; then |  | ||||||
|                     echo "Uncommitted changes detected:" |  | ||||||
|                     git status |  | ||||||
|                     git diff |  | ||||||
|                     exit 1 |  | ||||||
|                   fi |  | ||||||
|  | |||||||
| @ -9,7 +9,6 @@ | |||||||
|     "build": "tsc --incremental --sourceMap && ncp static/webui build/static/webui", |     "build": "tsc --incremental --sourceMap && ncp static/webui build/static/webui", | ||||||
|     "verify": "tsgo --noEmit", |     "verify": "tsgo --noEmit", | ||||||
|     "lint": "eslint --ext .ts .", |     "lint": "eslint --ext .ts .", | ||||||
|     "lint:ci": "eslint --ext .ts --rule \"prettier/prettier: off\" .", |  | ||||||
|     "lint:fix": "eslint --fix --ext .ts .", |     "lint:fix": "eslint --fix --ext .ts .", | ||||||
|     "prettier": "prettier --write .", |     "prettier": "prettier --write .", | ||||||
|     "update-translations": "cd scripts && node update-translations.js" |     "update-translations": "cd scripts && node update-translations.js" | ||||||
|  | |||||||
| @ -7,8 +7,6 @@ export const clearDialogueHistoryController: RequestHandler = async (req, res) = | |||||||
|     const inventory = await getInventory(accountId); |     const inventory = await getInventory(accountId); | ||||||
|     const request = JSON.parse(String(req.body)) as IClearDialogueRequest; |     const request = JSON.parse(String(req.body)) as IClearDialogueRequest; | ||||||
|     if (inventory.DialogueHistory && inventory.DialogueHistory.Dialogues) { |     if (inventory.DialogueHistory && inventory.DialogueHistory.Dialogues) { | ||||||
|         inventory.DialogueHistory.Resets ??= 0; |  | ||||||
|         inventory.DialogueHistory.Resets += 1; |  | ||||||
|         for (const dialogueName of request.Dialogues) { |         for (const dialogueName of request.Dialogues) { | ||||||
|             const index = inventory.DialogueHistory.Dialogues.findIndex(x => x.DialogueName == dialogueName); |             const index = inventory.DialogueHistory.Dialogues.findIndex(x => x.DialogueName == dialogueName); | ||||||
|             if (index != -1) { |             if (index != -1) { | ||||||
|  | |||||||
| @ -1,7 +1,6 @@ | |||||||
| import { addEmailItem, getInventory } from "@/src/services/inventoryService"; | import { getInventory } from "@/src/services/inventoryService"; | ||||||
| import { getAccountIdForRequest } from "@/src/services/loginService"; | import { getAccountIdForRequest } from "@/src/services/loginService"; | ||||||
| import { ICompletedDialogue } from "@/src/types/inventoryTypes/inventoryTypes"; | import { ICompletedDialogue } from "@/src/types/inventoryTypes/inventoryTypes"; | ||||||
| import { IInventoryChanges } from "@/src/types/purchaseTypes"; |  | ||||||
| import { logger } from "@/src/utils/logger"; | import { logger } from "@/src/utils/logger"; | ||||||
| import { RequestHandler } from "express"; | import { RequestHandler } from "express"; | ||||||
| 
 | 
 | ||||||
| @ -22,10 +21,9 @@ export const saveDialogueController: RequestHandler = async (req, res) => { | |||||||
|         if (!inventory.DialogueHistory) { |         if (!inventory.DialogueHistory) { | ||||||
|             throw new Error("bad inventory state"); |             throw new Error("bad inventory state"); | ||||||
|         } |         } | ||||||
|         if (request.OtherDialogueInfos.length != 0) { |         if (request.QueuedDialogues.length != 0 || request.OtherDialogueInfos.length != 0) { | ||||||
|             logger.error(`saveDialogue request not fully handled: ${String(req.body)}`); |             logger.error(`saveDialogue request not fully handled: ${String(req.body)}`); | ||||||
|         } |         } | ||||||
|         const inventoryChanges: IInventoryChanges = {}; |  | ||||||
|         inventory.DialogueHistory.Dialogues ??= []; |         inventory.DialogueHistory.Dialogues ??= []; | ||||||
|         let dialogue = inventory.DialogueHistory.Dialogues.find(x => x.DialogueName == request.DialogueName); |         let dialogue = inventory.DialogueHistory.Dialogues.find(x => x.DialogueName == request.DialogueName); | ||||||
|         if (!dialogue) { |         if (!dialogue) { | ||||||
| @ -38,7 +36,6 @@ export const saveDialogueController: RequestHandler = async (req, res) => { | |||||||
|                         AvailableGiftDate: new Date(0), |                         AvailableGiftDate: new Date(0), | ||||||
|                         RankUpExpiry: new Date(0), |                         RankUpExpiry: new Date(0), | ||||||
|                         BountyChemExpiry: new Date(0), |                         BountyChemExpiry: new Date(0), | ||||||
|                         QueuedDialogues: [], |  | ||||||
|                         Gifts: [], |                         Gifts: [], | ||||||
|                         Booleans: [], |                         Booleans: [], | ||||||
|                         Completed: [], |                         Completed: [], | ||||||
| @ -48,16 +45,9 @@ export const saveDialogueController: RequestHandler = async (req, res) => { | |||||||
|         } |         } | ||||||
|         dialogue.Rank = request.Rank; |         dialogue.Rank = request.Rank; | ||||||
|         dialogue.Chemistry = request.Chemistry; |         dialogue.Chemistry = request.Chemistry; | ||||||
|         dialogue.QueuedDialogues = request.QueuedDialogues; |         //dialogue.QueuedDialogues = request.QueuedDialogues;
 | ||||||
|         for (const bool of request.Booleans) { |         for (const bool of request.Booleans) { | ||||||
|             dialogue.Booleans.push(bool); |             dialogue.Booleans.push(bool); | ||||||
|             if (bool == "LizzieShawzin") { |  | ||||||
|                 await addEmailItem( |  | ||||||
|                     inventory, |  | ||||||
|                     "/Lotus/Types/Items/EmailItems/LizzieShawzinSkinEmailItem", |  | ||||||
|                     inventoryChanges |  | ||||||
|                 ); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         for (const bool of request.ResetBooleans) { |         for (const bool of request.ResetBooleans) { | ||||||
|             const index = dialogue.Booleans.findIndex(x => x == bool); |             const index = dialogue.Booleans.findIndex(x => x == bool); | ||||||
| @ -70,7 +60,7 @@ export const saveDialogueController: RequestHandler = async (req, res) => { | |||||||
|         dialogue.AvailableDate = new Date(tomorrowAt0Utc); |         dialogue.AvailableDate = new Date(tomorrowAt0Utc); | ||||||
|         await inventory.save(); |         await inventory.save(); | ||||||
|         res.json({ |         res.json({ | ||||||
|             InventoryChanges: inventoryChanges, |             InventoryChanges: [], | ||||||
|             AvailableDate: { $date: { $numberLong: tomorrowAt0Utc.toString() } } |             AvailableDate: { $date: { $numberLong: tomorrowAt0Utc.toString() } } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| @ -87,7 +77,7 @@ interface SaveCompletedDialogueRequest { | |||||||
|     Rank: number; |     Rank: number; | ||||||
|     Chemistry: number; |     Chemistry: number; | ||||||
|     CompletionType: number; |     CompletionType: number; | ||||||
|     QueuedDialogues: string[]; |     QueuedDialogues: string[]; // unsure
 | ||||||
|     Booleans: string[]; |     Booleans: string[]; | ||||||
|     ResetBooleans: string[]; |     ResetBooleans: string[]; | ||||||
|     Data: ICompletedDialogue; |     Data: ICompletedDialogue; | ||||||
|  | |||||||
| @ -773,7 +773,7 @@ const dialogueSchema = new Schema<IDialogueDatabase>( | |||||||
|         AvailableGiftDate: Date, |         AvailableGiftDate: Date, | ||||||
|         RankUpExpiry: Date, |         RankUpExpiry: Date, | ||||||
|         BountyChemExpiry: Date, |         BountyChemExpiry: Date, | ||||||
|         QueuedDialogues: { type: [String], default: [] }, |         //QueuedDialogues: ???
 | ||||||
|         Gifts: { type: [dialogueGiftSchema], default: [] }, |         Gifts: { type: [dialogueGiftSchema], default: [] }, | ||||||
|         Booleans: { type: [String], default: [] }, |         Booleans: { type: [String], default: [] }, | ||||||
|         Completed: { type: [completedDialogueSchema], default: [] }, |         Completed: { type: [completedDialogueSchema], default: [] }, | ||||||
| @ -797,7 +797,6 @@ dialogueSchema.set("toJSON", { | |||||||
| const dialogueHistorySchema = new Schema<IDialogueHistoryDatabase>( | const dialogueHistorySchema = new Schema<IDialogueHistoryDatabase>( | ||||||
|     { |     { | ||||||
|         YearIteration: { type: Number, required: true }, |         YearIteration: { type: Number, required: true }, | ||||||
|         Resets: Number, |  | ||||||
|         Dialogues: { type: [dialogueSchema], required: false } |         Dialogues: { type: [dialogueSchema], required: false } | ||||||
|     }, |     }, | ||||||
|     { _id: false } |     { _id: false } | ||||||
| @ -1415,7 +1414,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>( | |||||||
| 
 | 
 | ||||||
|         //https://warframe.fandom.com/wiki/Heist
 |         //https://warframe.fandom.com/wiki/Heist
 | ||||||
|         //ProfitTaker(1-4) Example:"LocationTag": "EudicoHeists", "Jobs":Mission name
 |         //ProfitTaker(1-4) Example:"LocationTag": "EudicoHeists", "Jobs":Mission name
 | ||||||
|         CompletedJobChains: [completedJobChainsSchema], |         CompletedJobChains: { type: [completedJobChainsSchema], default: undefined }, | ||||||
|         //Night Wave Challenge
 |         //Night Wave Challenge
 | ||||||
|         SeasonChallengeHistory: [seasonChallengeHistorySchema], |         SeasonChallengeHistory: [seasonChallengeHistorySchema], | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1014,14 +1014,12 @@ export const addCustomization = ( | |||||||
|     customizationName: string, |     customizationName: string, | ||||||
|     inventoryChanges: IInventoryChanges = {} |     inventoryChanges: IInventoryChanges = {} | ||||||
| ): IInventoryChanges => { | ): IInventoryChanges => { | ||||||
|     if (!inventory.FlavourItems.find(x => x.ItemType == customizationName)) { |  | ||||||
|     const flavourItemIndex = inventory.FlavourItems.push({ ItemType: customizationName }) - 1; |     const flavourItemIndex = inventory.FlavourItems.push({ ItemType: customizationName }) - 1; | ||||||
|     // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 |     // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | ||||||
|     inventoryChanges.FlavourItems ??= []; |     inventoryChanges.FlavourItems ??= []; | ||||||
|     (inventoryChanges.FlavourItems as IFlavourItem[]).push( |     (inventoryChanges.FlavourItems as IFlavourItem[]).push( | ||||||
|         inventory.FlavourItems[flavourItemIndex].toJSON<IFlavourItem>() |         inventory.FlavourItems[flavourItemIndex].toJSON<IFlavourItem>() | ||||||
|     ); |     ); | ||||||
|     } |  | ||||||
|     return inventoryChanges; |     return inventoryChanges; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -143,6 +143,28 @@ export const addMissionInventoryUpdates = async ( | |||||||
|         if (inventoryUpdates.RewardInfo.NemesisAbandonedRewards) { |         if (inventoryUpdates.RewardInfo.NemesisAbandonedRewards) { | ||||||
|             inventory.NemesisAbandonedRewards = inventoryUpdates.RewardInfo.NemesisAbandonedRewards; |             inventory.NemesisAbandonedRewards = inventoryUpdates.RewardInfo.NemesisAbandonedRewards; | ||||||
|         } |         } | ||||||
|  |         if (inventoryUpdates.MissionStatus == "GS_SUCCESS" && inventoryUpdates.RewardInfo.jobId) { | ||||||
|  |             // e.g. for Profit-Taker Phase 1:
 | ||||||
|  |             // JobTier: -6,
 | ||||||
|  |             // jobId: '/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne_-6_SolarisUnitedHub1_663a71c80000000000000025_EudicoHeists',
 | ||||||
|  |             // This is sent multiple times, with JobStage starting at 0 and incrementing each time, but only the final upload has GS_SUCCESS.
 | ||||||
|  | 
 | ||||||
|  |             // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||||
|  |             const [bounty, tier, hub, id, tag] = inventoryUpdates.RewardInfo.jobId.split("_"); | ||||||
|  |             if (tag == "EudicoHeists") { | ||||||
|  |                 inventory.CompletedJobChains ??= []; | ||||||
|  |                 let chain = inventory.CompletedJobChains.find(x => x.LocationTag == tag); | ||||||
|  |                 if (!chain) { | ||||||
|  |                     chain = | ||||||
|  |                         inventory.CompletedJobChains[ | ||||||
|  |                             inventory.CompletedJobChains.push({ LocationTag: tag, Jobs: [] }) - 1 | ||||||
|  |                         ]; | ||||||
|  |                 } | ||||||
|  |                 if (!chain.Jobs.includes(bounty)) { | ||||||
|  |                     chain.Jobs.push(bounty); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     for (const [key, value] of getEntriesUnsafe(inventoryUpdates)) { |     for (const [key, value] of getEntriesUnsafe(inventoryUpdates)) { | ||||||
|         if (value === undefined) { |         if (value === undefined) { | ||||||
|  | |||||||
| @ -292,7 +292,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu | |||||||
|     RecentVendorPurchases?: IRecentVendorPurchaseClient[]; |     RecentVendorPurchases?: IRecentVendorPurchaseClient[]; | ||||||
|     NodeIntrosCompleted: string[]; |     NodeIntrosCompleted: string[]; | ||||||
|     GuildId?: IOid; |     GuildId?: IOid; | ||||||
|     CompletedJobChains: ICompletedJobChain[]; |     CompletedJobChains?: ICompletedJobChain[]; | ||||||
|     SeasonChallengeHistory: ISeasonChallenge[]; |     SeasonChallengeHistory: ISeasonChallenge[]; | ||||||
|     EquippedInstrument?: string; |     EquippedInstrument?: string; | ||||||
|     InvasionChainProgress: IInvasionChainProgress[]; |     InvasionChainProgress: IInvasionChainProgress[]; | ||||||
| @ -1074,13 +1074,11 @@ export interface IEndlessXpProgress { | |||||||
| 
 | 
 | ||||||
| export interface IDialogueHistoryClient { | export interface IDialogueHistoryClient { | ||||||
|     YearIteration: number; |     YearIteration: number; | ||||||
|     Resets?: number; // added in 38.5.0
 |  | ||||||
|     Dialogues?: IDialogueClient[]; |     Dialogues?: IDialogueClient[]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export interface IDialogueHistoryDatabase { | export interface IDialogueHistoryDatabase { | ||||||
|     YearIteration: number; |     YearIteration: number; | ||||||
|     Resets?: number; |  | ||||||
|     Dialogues?: IDialogueDatabase[]; |     Dialogues?: IDialogueDatabase[]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1091,7 +1089,7 @@ export interface IDialogueClient { | |||||||
|     AvailableGiftDate: IMongoDate; |     AvailableGiftDate: IMongoDate; | ||||||
|     RankUpExpiry: IMongoDate; |     RankUpExpiry: IMongoDate; | ||||||
|     BountyChemExpiry: IMongoDate; |     BountyChemExpiry: IMongoDate; | ||||||
|     QueuedDialogues: string[]; |     //QueuedDialogues: any[];
 | ||||||
|     Gifts: IDialogueGift[]; |     Gifts: IDialogueGift[]; | ||||||
|     Booleans: string[]; |     Booleans: string[]; | ||||||
|     Completed: ICompletedDialogue[]; |     Completed: ICompletedDialogue[]; | ||||||
|  | |||||||
| @ -143,6 +143,13 @@ export interface IRewardInfo { | |||||||
|     PurgatoryRewardQualifications?: string; |     PurgatoryRewardQualifications?: string; | ||||||
|     rewardSeed?: number; |     rewardSeed?: number; | ||||||
|     periodicMissionTag?: string; |     periodicMissionTag?: string; | ||||||
|  | 
 | ||||||
|  |     // for bounties, only EOM_AFK and node are given from above, plus:
 | ||||||
|  |     JobTier?: string; | ||||||
|  |     jobId?: string; | ||||||
|  |     JobStage?: string; | ||||||
|  |     Q?: boolean; // always false?
 | ||||||
|  |     CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED"; | export type IMissionStatus = "GS_SUCCESS" | "GS_FAILURE" | "GS_DUMPED" | "GS_QUIT" | "GS_INTERRUPTED"; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user