merge upstream
This commit is contained in:
		
						commit
						458eb09db6
					
				@ -3,3 +3,6 @@
 | 
				
			|||||||
Dockerfile*
 | 
					Dockerfile*
 | 
				
			||||||
.*
 | 
					.*
 | 
				
			||||||
docker-data/
 | 
					docker-data/
 | 
				
			||||||
 | 
					node_modules/
 | 
				
			||||||
 | 
					static/data/
 | 
				
			||||||
 | 
					logs/
 | 
				
			||||||
 | 
				
			|||||||
@ -13,6 +13,7 @@
 | 
				
			|||||||
        "node": true
 | 
					        "node": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "rules": {
 | 
					    "rules": {
 | 
				
			||||||
 | 
					        "@typescript-eslint/consistent-type-imports": "error",
 | 
				
			||||||
        "@typescript-eslint/explicit-function-return-type": "error",
 | 
					        "@typescript-eslint/explicit-function-return-type": "error",
 | 
				
			||||||
        "@typescript-eslint/restrict-template-expressions": "error",
 | 
					        "@typescript-eslint/restrict-template-expressions": "error",
 | 
				
			||||||
        "@typescript-eslint/restrict-plus-operands": "error",
 | 
					        "@typescript-eslint/restrict-plus-operands": "error",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@ -12,14 +12,13 @@ jobs:
 | 
				
			|||||||
            - name: Setup Node.js environment
 | 
					            - name: Setup Node.js environment
 | 
				
			||||||
              uses: actions/setup-node@v4.0.2
 | 
					              uses: actions/setup-node@v4.0.2
 | 
				
			||||||
              with:
 | 
					              with:
 | 
				
			||||||
                  node-version: ">=20.6.0"
 | 
					                  node-version: ">=20.18.1"
 | 
				
			||||||
            - run: npm ci
 | 
					            - run: npm ci
 | 
				
			||||||
            - run: cp config-vanilla.json config.json
 | 
					            - run: cp config-vanilla.json config.json
 | 
				
			||||||
            - run: npm run verify
 | 
					            - run: npm run verify
 | 
				
			||||||
            - run: npm run lint:ci
 | 
					            - run: npm run lint:ci
 | 
				
			||||||
            - run: npm run prettier
 | 
					            - run: npm run prettier
 | 
				
			||||||
            - run: npm run update-translations
 | 
					            - run: npm run update-translations
 | 
				
			||||||
            - run: npm run fix-imports
 | 
					 | 
				
			||||||
            - name: Fail if there are uncommitted changes
 | 
					            - name: Fail if there are uncommitted changes
 | 
				
			||||||
              run: |
 | 
					              run: |
 | 
				
			||||||
                  if [[ -n "$(git status --porcelain)" ]]; then
 | 
					                  if [[ -n "$(git status --porcelain)" ]]; then
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "typescript.preferences.preferTypeOnlyAutoImports": true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -5,8 +5,7 @@ RUN apk add --no-cache bash jq
 | 
				
			|||||||
COPY . /app
 | 
					COPY . /app
 | 
				
			||||||
WORKDIR /app
 | 
					WORKDIR /app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN npm i --omit=dev
 | 
					RUN npm i --omit=dev --omit=optional
 | 
				
			||||||
RUN npm run build
 | 
					 | 
				
			||||||
RUN date '+%d %B %Y' > BUILD_DATE
 | 
					RUN date '+%d %B %Y' > BUILD_DATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRYPOINT ["/app/docker-entrypoint.sh"]
 | 
					ENTRYPOINT ["/app/docker-entrypoint.sh"]
 | 
				
			||||||
 | 
				
			|||||||
@ -2,24 +2,27 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo Updating SpaceNinjaServer...
 | 
					echo Updating SpaceNinjaServer...
 | 
				
			||||||
git fetch --prune
 | 
					git fetch --prune
 | 
				
			||||||
git stash
 | 
					 | 
				
			||||||
git checkout -f origin/main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if exist static\data\0\ (
 | 
					 | 
				
			||||||
	echo Updating stripped assets...
 | 
					 | 
				
			||||||
	cd static\data\0\
 | 
					 | 
				
			||||||
	git pull
 | 
					 | 
				
			||||||
	cd ..\..\..\
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo Updating dependencies...
 | 
					 | 
				
			||||||
call npm i --omit=dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
call npm run build
 | 
					 | 
				
			||||||
if %errorlevel% == 0 (
 | 
					if %errorlevel% == 0 (
 | 
				
			||||||
	call npm run start
 | 
						git stash
 | 
				
			||||||
	echo SpaceNinjaServer seems to have crashed.
 | 
						git checkout -f origin/main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if exist static\data\0\ (
 | 
				
			||||||
 | 
							echo Updating stripped assets...
 | 
				
			||||||
 | 
							cd static\data\0\
 | 
				
			||||||
 | 
							git pull
 | 
				
			||||||
 | 
							cd ..\..\..\
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						echo Updating dependencies...
 | 
				
			||||||
 | 
						call npm i --omit=dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call npm run build
 | 
				
			||||||
 | 
						if %errorlevel% == 0 (
 | 
				
			||||||
 | 
							call npm run start
 | 
				
			||||||
 | 
							echo SpaceNinjaServer seems to have crashed.
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:a
 | 
					:a
 | 
				
			||||||
pause > nul
 | 
					pause > nul
 | 
				
			||||||
goto a
 | 
					goto a
 | 
				
			||||||
 | 
				
			|||||||
@ -2,22 +2,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
echo "Updating SpaceNinjaServer..."
 | 
					echo "Updating SpaceNinjaServer..."
 | 
				
			||||||
git fetch --prune
 | 
					git fetch --prune
 | 
				
			||||||
git stash
 | 
					 | 
				
			||||||
git checkout -f origin/main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ -d "static/data/0/" ]; then
 | 
					 | 
				
			||||||
    echo "Updating stripped assets..."
 | 
					 | 
				
			||||||
    cd static/data/0/
 | 
					 | 
				
			||||||
    git pull
 | 
					 | 
				
			||||||
    cd ../../../
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "Updating dependencies..."
 | 
					 | 
				
			||||||
npm i --omit=dev
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
npm run build
 | 
					 | 
				
			||||||
if [ $? -eq 0 ]; then
 | 
					if [ $? -eq 0 ]; then
 | 
				
			||||||
    npm run start
 | 
					    git stash
 | 
				
			||||||
    echo "SpaceNinjaServer seems to have crashed."
 | 
					    git checkout -f origin/main
 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [ -d "static/data/0/" ]; then
 | 
				
			||||||
 | 
					        echo "Updating stripped assets..."
 | 
				
			||||||
 | 
					        cd static/data/0/
 | 
				
			||||||
 | 
					        git pull
 | 
				
			||||||
 | 
					        cd ../../../
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    echo "Updating dependencies..."
 | 
				
			||||||
 | 
					    npm i --omit=dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    npm run build
 | 
				
			||||||
 | 
					    if [ $? -eq 0 ]; then
 | 
				
			||||||
 | 
					        npm run start
 | 
				
			||||||
 | 
					        echo "SpaceNinjaServer seems to have crashed."
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
				
			|||||||
@ -11,39 +11,13 @@
 | 
				
			|||||||
  "administratorNames": [],
 | 
					  "administratorNames": [],
 | 
				
			||||||
  "autoCreateAccount": true,
 | 
					  "autoCreateAccount": true,
 | 
				
			||||||
  "skipTutorial": false,
 | 
					  "skipTutorial": false,
 | 
				
			||||||
  "skipAllDialogue": false,
 | 
					 | 
				
			||||||
  "unlockAllScans": false,
 | 
					  "unlockAllScans": false,
 | 
				
			||||||
  "claimingBlueprintRefundsIngredients": false,
 | 
					 | 
				
			||||||
  "dontSubtractPurchaseCreditCost": false,
 | 
					 | 
				
			||||||
  "dontSubtractPurchasePlatinumCost": false,
 | 
					 | 
				
			||||||
  "dontSubtractPurchaseItemCost": false,
 | 
					 | 
				
			||||||
  "dontSubtractPurchaseStandingCost": false,
 | 
					 | 
				
			||||||
  "dontSubtractVoidTraces": false,
 | 
					 | 
				
			||||||
  "dontSubtractConsumables": false,
 | 
					 | 
				
			||||||
  "unlockAllShipFeatures": false,
 | 
					  "unlockAllShipFeatures": false,
 | 
				
			||||||
  "unlockAllShipDecorations": false,
 | 
					  "unlockAllShipDecorations": false,
 | 
				
			||||||
  "unlockAllFlavourItems": false,
 | 
					  "unlockAllFlavourItems": false,
 | 
				
			||||||
  "unlockAllSkins": false,
 | 
					  "unlockAllSkins": false,
 | 
				
			||||||
  "unlockAllCapturaScenes": false,
 | 
					  "unlockAllCapturaScenes": false,
 | 
				
			||||||
  "universalPolarityEverywhere": false,
 | 
					 | 
				
			||||||
  "unlockDoubleCapacityPotatoesEverywhere": false,
 | 
					 | 
				
			||||||
  "unlockExilusEverywhere": false,
 | 
					 | 
				
			||||||
  "unlockArcanesEverywhere": false,
 | 
					 | 
				
			||||||
  "noDailyStandingLimits": false,
 | 
					 | 
				
			||||||
  "noDailyFocusLimit": false,
 | 
					 | 
				
			||||||
  "noArgonCrystalDecay": false,
 | 
					 | 
				
			||||||
  "noMasteryRankUpCooldown": false,
 | 
					 | 
				
			||||||
  "noVendorPurchaseLimits": false,
 | 
					 | 
				
			||||||
  "noDeathMarks": false,
 | 
					 | 
				
			||||||
  "noKimCooldowns": false,
 | 
					 | 
				
			||||||
  "fullyStockedVendors": false,
 | 
					  "fullyStockedVendors": false,
 | 
				
			||||||
  "baroAlwaysAvailable": false,
 | 
					 | 
				
			||||||
  "baroFullyStocked": false,
 | 
					 | 
				
			||||||
  "syndicateMissionsRepeatable": false,
 | 
					 | 
				
			||||||
  "unlockAllProfitTakerStages": false,
 | 
					 | 
				
			||||||
  "instantFinishRivenChallenge": false,
 | 
					 | 
				
			||||||
  "instantResourceExtractorDrones": false,
 | 
					 | 
				
			||||||
  "noResourceExtractorDronesDamage": false,
 | 
					 | 
				
			||||||
  "skipClanKeyCrafting": false,
 | 
					  "skipClanKeyCrafting": false,
 | 
				
			||||||
  "noDojoRoomBuildStage": false,
 | 
					  "noDojoRoomBuildStage": false,
 | 
				
			||||||
  "noDecoBuildStage": false,
 | 
					  "noDecoBuildStage": false,
 | 
				
			||||||
@ -51,9 +25,7 @@
 | 
				
			|||||||
  "noDojoResearchCosts": false,
 | 
					  "noDojoResearchCosts": false,
 | 
				
			||||||
  "noDojoResearchTime": false,
 | 
					  "noDojoResearchTime": false,
 | 
				
			||||||
  "fastClanAscension": false,
 | 
					  "fastClanAscension": false,
 | 
				
			||||||
  "missionsCanGiveAllRelics": false,
 | 
					 | 
				
			||||||
  "unlockAllSimarisResearchEntries": false,
 | 
					  "unlockAllSimarisResearchEntries": false,
 | 
				
			||||||
  "disableDailyTribute": false,
 | 
					 | 
				
			||||||
  "spoofMasteryRank": -1,
 | 
					  "spoofMasteryRank": -1,
 | 
				
			||||||
  "relicRewardItemCountMultiplier": 1,
 | 
					  "relicRewardItemCountMultiplier": 1,
 | 
				
			||||||
  "nightwaveStandingMultiplier": 1,
 | 
					  "nightwaveStandingMultiplier": 1,
 | 
				
			||||||
@ -67,6 +39,10 @@
 | 
				
			|||||||
    "affinityBoost": false,
 | 
					    "affinityBoost": false,
 | 
				
			||||||
    "resourceBoost": false,
 | 
					    "resourceBoost": false,
 | 
				
			||||||
    "tennoLiveRelay": false,
 | 
					    "tennoLiveRelay": false,
 | 
				
			||||||
 | 
					    "baroTennoConRelay": false,
 | 
				
			||||||
 | 
					    "baroAlwaysAvailable": false,
 | 
				
			||||||
 | 
					    "baroFullyStocked": false,
 | 
				
			||||||
 | 
					    "varziaFullyStocked": false,
 | 
				
			||||||
    "wolfHunt": false,
 | 
					    "wolfHunt": false,
 | 
				
			||||||
    "orphixVenom": false,
 | 
					    "orphixVenom": false,
 | 
				
			||||||
    "longShadow": false,
 | 
					    "longShadow": false,
 | 
				
			||||||
@ -93,10 +69,9 @@
 | 
				
			|||||||
    "duviriOverride": "",
 | 
					    "duviriOverride": "",
 | 
				
			||||||
    "nightwaveOverride": "",
 | 
					    "nightwaveOverride": "",
 | 
				
			||||||
    "allTheFissures": "",
 | 
					    "allTheFissures": "",
 | 
				
			||||||
    "circuitGameModes": null,
 | 
					 | 
				
			||||||
    "darvoStockMultiplier": 1,
 | 
					 | 
				
			||||||
    "varziaOverride": "",
 | 
					    "varziaOverride": "",
 | 
				
			||||||
    "varziaFullyStocked": false
 | 
					    "circuitGameModes": null,
 | 
				
			||||||
 | 
					    "darvoStockMultiplier": 1
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dev": {
 | 
					  "dev": {
 | 
				
			||||||
    "keepVendorsExpired": false
 | 
					    "keepVendorsExpired": false
 | 
				
			||||||
 | 
				
			|||||||
@ -5,4 +5,4 @@ if [ ! -f conf/config.json ]; then
 | 
				
			|||||||
	jq --arg value "mongodb://openwfagent:spaceninjaserver@mongodb:27017/" '.mongodbUrl = $value' /app/config-vanilla.json > /app/conf/config.json
 | 
						jq --arg value "mongodb://openwfagent:spaceninjaserver@mongodb:27017/" '.mongodbUrl = $value' /app/config-vanilla.json > /app/conf/config.json
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exec npm run start -- --configPath conf/config.json
 | 
					exec npm run raw -- --configPath conf/config.json
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										294
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										294
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -9,11 +9,6 @@
 | 
				
			|||||||
      "version": "0.1.0",
 | 
					      "version": "0.1.0",
 | 
				
			||||||
      "license": "GNU",
 | 
					      "license": "GNU",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/express": "^5",
 | 
					 | 
				
			||||||
        "@types/morgan": "^1.9.9",
 | 
					 | 
				
			||||||
        "@types/websocket": "^1.0.10",
 | 
					 | 
				
			||||||
        "@types/ws": "^8.18.1",
 | 
					 | 
				
			||||||
        "@typescript/native-preview": "^7.0.0-dev.20250625.1",
 | 
					 | 
				
			||||||
        "chokidar": "^4.0.3",
 | 
					        "chokidar": "^4.0.3",
 | 
				
			||||||
        "crc-32": "^1.2.2",
 | 
					        "crc-32": "^1.2.2",
 | 
				
			||||||
        "express": "^5",
 | 
					        "express": "^5",
 | 
				
			||||||
@ -21,9 +16,8 @@
 | 
				
			|||||||
        "mongoose": "^8.11.0",
 | 
					        "mongoose": "^8.11.0",
 | 
				
			||||||
        "morgan": "^1.10.0",
 | 
					        "morgan": "^1.10.0",
 | 
				
			||||||
        "ncp": "^2.0.0",
 | 
					        "ncp": "^2.0.0",
 | 
				
			||||||
        "typescript": "^5.5",
 | 
					 | 
				
			||||||
        "undici": "^7.10.0",
 | 
					        "undici": "^7.10.0",
 | 
				
			||||||
        "warframe-public-export-plus": "^0.5.81",
 | 
					        "warframe-public-export-plus": "^0.5.83",
 | 
				
			||||||
        "warframe-riven-info": "^0.1.2",
 | 
					        "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
        "winston": "^3.17.0",
 | 
					        "winston": "^3.17.0",
 | 
				
			||||||
        "winston-daily-rotate-file": "^5.0.0",
 | 
					        "winston-daily-rotate-file": "^5.0.0",
 | 
				
			||||||
@ -38,6 +32,14 @@
 | 
				
			|||||||
        "eslint-plugin-prettier": "^5.2.5",
 | 
					        "eslint-plugin-prettier": "^5.2.5",
 | 
				
			||||||
        "prettier": "^3.5.3",
 | 
					        "prettier": "^3.5.3",
 | 
				
			||||||
        "tree-kill": "^1.2.2"
 | 
					        "tree-kill": "^1.2.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "optionalDependencies": {
 | 
				
			||||||
 | 
					        "@types/express": "^5",
 | 
				
			||||||
 | 
					        "@types/morgan": "^1.9.9",
 | 
				
			||||||
 | 
					        "@types/websocket": "^1.0.10",
 | 
				
			||||||
 | 
					        "@types/ws": "^8.18.1",
 | 
				
			||||||
 | 
					        "@typescript/native-preview": "^7.0.0-dev.20250625.1",
 | 
				
			||||||
 | 
					        "typescript": "^5.7"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@colors/colors": {
 | 
					    "node_modules/@colors/colors": {
 | 
				
			||||||
@ -349,6 +351,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
 | 
					      "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/connect": "*",
 | 
					        "@types/connect": "*",
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
@ -359,6 +362,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
 | 
				
			||||||
      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
 | 
					      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -368,6 +372,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==",
 | 
					      "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/body-parser": "*",
 | 
					        "@types/body-parser": "*",
 | 
				
			||||||
        "@types/express-serve-static-core": "^5.0.0",
 | 
					        "@types/express-serve-static-core": "^5.0.0",
 | 
				
			||||||
@ -379,6 +384,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==",
 | 
					      "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*",
 | 
					        "@types/node": "*",
 | 
				
			||||||
        "@types/qs": "*",
 | 
					        "@types/qs": "*",
 | 
				
			||||||
@ -390,7 +396,8 @@
 | 
				
			|||||||
      "version": "2.0.5",
 | 
					      "version": "2.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
 | 
					      "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/json5": {
 | 
					    "node_modules/@types/json5": {
 | 
				
			||||||
      "version": "0.0.29",
 | 
					      "version": "0.0.29",
 | 
				
			||||||
@ -403,43 +410,49 @@
 | 
				
			|||||||
      "version": "1.3.5",
 | 
					      "version": "1.3.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
 | 
					      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/morgan": {
 | 
					    "node_modules/@types/morgan": {
 | 
				
			||||||
      "version": "1.9.10",
 | 
					      "version": "1.9.10",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.10.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.10.tgz",
 | 
				
			||||||
      "integrity": "sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA==",
 | 
					      "integrity": "sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/node": {
 | 
					    "node_modules/@types/node": {
 | 
				
			||||||
      "version": "24.0.15",
 | 
					      "version": "24.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==",
 | 
					      "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "undici-types": "~7.8.0"
 | 
					        "undici-types": "~7.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/qs": {
 | 
					    "node_modules/@types/qs": {
 | 
				
			||||||
      "version": "6.14.0",
 | 
					      "version": "6.14.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
 | 
					      "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/range-parser": {
 | 
					    "node_modules/@types/range-parser": {
 | 
				
			||||||
      "version": "1.2.7",
 | 
					      "version": "1.2.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
 | 
					      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/send": {
 | 
					    "node_modules/@types/send": {
 | 
				
			||||||
      "version": "0.17.5",
 | 
					      "version": "0.17.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
 | 
					      "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/mime": "^1",
 | 
					        "@types/mime": "^1",
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
@ -450,6 +463,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
 | 
				
			||||||
      "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
 | 
					      "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/http-errors": "*",
 | 
					        "@types/http-errors": "*",
 | 
				
			||||||
        "@types/node": "*",
 | 
					        "@types/node": "*",
 | 
				
			||||||
@ -473,6 +487,7 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.10.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.10.tgz",
 | 
				
			||||||
      "integrity": "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==",
 | 
					      "integrity": "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -491,22 +506,23 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
 | 
					      "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/eslint-plugin": {
 | 
					    "node_modules/@typescript-eslint/eslint-plugin": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==",
 | 
					      "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@eslint-community/regexpp": "^4.10.0",
 | 
					        "@eslint-community/regexpp": "^4.10.0",
 | 
				
			||||||
        "@typescript-eslint/scope-manager": "8.37.0",
 | 
					        "@typescript-eslint/scope-manager": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/type-utils": "8.37.0",
 | 
					        "@typescript-eslint/type-utils": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/utils": "8.37.0",
 | 
					        "@typescript-eslint/utils": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/visitor-keys": "8.37.0",
 | 
					        "@typescript-eslint/visitor-keys": "8.41.0",
 | 
				
			||||||
        "graphemer": "^1.4.0",
 | 
					        "graphemer": "^1.4.0",
 | 
				
			||||||
        "ignore": "^7.0.0",
 | 
					        "ignore": "^7.0.0",
 | 
				
			||||||
        "natural-compare": "^1.4.0",
 | 
					        "natural-compare": "^1.4.0",
 | 
				
			||||||
@ -520,22 +536,22 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/typescript-eslint"
 | 
					        "url": "https://opencollective.com/typescript-eslint"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "@typescript-eslint/parser": "^8.37.0",
 | 
					        "@typescript-eslint/parser": "^8.41.0",
 | 
				
			||||||
        "eslint": "^8.57.0 || ^9.0.0",
 | 
					        "eslint": "^8.57.0 || ^9.0.0",
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/parser": {
 | 
					    "node_modules/@typescript-eslint/parser": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==",
 | 
					      "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/scope-manager": "8.37.0",
 | 
					        "@typescript-eslint/scope-manager": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/typescript-estree": "8.37.0",
 | 
					        "@typescript-eslint/typescript-estree": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/visitor-keys": "8.37.0",
 | 
					        "@typescript-eslint/visitor-keys": "8.41.0",
 | 
				
			||||||
        "debug": "^4.3.4"
 | 
					        "debug": "^4.3.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@ -547,18 +563,18 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "eslint": "^8.57.0 || ^9.0.0",
 | 
					        "eslint": "^8.57.0 || ^9.0.0",
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/project-service": {
 | 
					    "node_modules/@typescript-eslint/project-service": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==",
 | 
					      "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/tsconfig-utils": "^8.37.0",
 | 
					        "@typescript-eslint/tsconfig-utils": "^8.41.0",
 | 
				
			||||||
        "@typescript-eslint/types": "^8.37.0",
 | 
					        "@typescript-eslint/types": "^8.41.0",
 | 
				
			||||||
        "debug": "^4.3.4"
 | 
					        "debug": "^4.3.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@ -569,18 +585,18 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/typescript-eslint"
 | 
					        "url": "https://opencollective.com/typescript-eslint"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/scope-manager": {
 | 
					    "node_modules/@typescript-eslint/scope-manager": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==",
 | 
					      "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/visitor-keys": "8.37.0"
 | 
					        "@typescript-eslint/visitor-keys": "8.41.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 | 
					        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 | 
				
			||||||
@ -591,9 +607,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/tsconfig-utils": {
 | 
					    "node_modules/@typescript-eslint/tsconfig-utils": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==",
 | 
					      "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@ -604,19 +620,19 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/typescript-eslint"
 | 
					        "url": "https://opencollective.com/typescript-eslint"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/type-utils": {
 | 
					    "node_modules/@typescript-eslint/type-utils": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==",
 | 
					      "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/typescript-estree": "8.37.0",
 | 
					        "@typescript-eslint/typescript-estree": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/utils": "8.37.0",
 | 
					        "@typescript-eslint/utils": "8.41.0",
 | 
				
			||||||
        "debug": "^4.3.4",
 | 
					        "debug": "^4.3.4",
 | 
				
			||||||
        "ts-api-utils": "^2.1.0"
 | 
					        "ts-api-utils": "^2.1.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@ -629,13 +645,13 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "eslint": "^8.57.0 || ^9.0.0",
 | 
					        "eslint": "^8.57.0 || ^9.0.0",
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/types": {
 | 
					    "node_modules/@typescript-eslint/types": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==",
 | 
					      "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@ -647,16 +663,16 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/typescript-estree": {
 | 
					    "node_modules/@typescript-eslint/typescript-estree": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==",
 | 
					      "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/project-service": "8.37.0",
 | 
					        "@typescript-eslint/project-service": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/tsconfig-utils": "8.37.0",
 | 
					        "@typescript-eslint/tsconfig-utils": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/visitor-keys": "8.37.0",
 | 
					        "@typescript-eslint/visitor-keys": "8.41.0",
 | 
				
			||||||
        "debug": "^4.3.4",
 | 
					        "debug": "^4.3.4",
 | 
				
			||||||
        "fast-glob": "^3.3.2",
 | 
					        "fast-glob": "^3.3.2",
 | 
				
			||||||
        "is-glob": "^4.0.3",
 | 
					        "is-glob": "^4.0.3",
 | 
				
			||||||
@ -672,20 +688,20 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/typescript-eslint"
 | 
					        "url": "https://opencollective.com/typescript-eslint"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/utils": {
 | 
					    "node_modules/@typescript-eslint/utils": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==",
 | 
					      "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@eslint-community/eslint-utils": "^4.7.0",
 | 
					        "@eslint-community/eslint-utils": "^4.7.0",
 | 
				
			||||||
        "@typescript-eslint/scope-manager": "8.37.0",
 | 
					        "@typescript-eslint/scope-manager": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "@typescript-eslint/typescript-estree": "8.37.0"
 | 
					        "@typescript-eslint/typescript-estree": "8.41.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 | 
					        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 | 
				
			||||||
@ -696,17 +712,17 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "eslint": "^8.57.0 || ^9.0.0",
 | 
					        "eslint": "^8.57.0 || ^9.0.0",
 | 
				
			||||||
        "typescript": ">=4.8.4 <5.9.0"
 | 
					        "typescript": ">=4.8.4 <6.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript-eslint/visitor-keys": {
 | 
					    "node_modules/@typescript-eslint/visitor-keys": {
 | 
				
			||||||
      "version": "8.37.0",
 | 
					      "version": "8.41.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==",
 | 
					      "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@typescript-eslint/types": "8.37.0",
 | 
					        "@typescript-eslint/types": "8.41.0",
 | 
				
			||||||
        "eslint-visitor-keys": "^4.2.1"
 | 
					        "eslint-visitor-keys": "^4.2.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@ -731,10 +747,11 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview": {
 | 
					    "node_modules/@typescript/native-preview": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-23wUnyj+BfVMSty9nsgTcVSlmI1ToS8P8qKS2g7ss0DUrnXN2tiJtbffDpmafMLEKEtfY42mVjmHPrZXHPdaOg==",
 | 
					      "integrity": "sha512-+NuzOfk/lu6pLYSCio+R7uzJ9pfOasc1fshxVmLp6wgcB8yuUYYvBaT7CoHapUnNBYZXkJ9u0UOECnq3dbzgSQ==",
 | 
				
			||||||
      "license": "Apache-2.0",
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
        "tsgo": "bin/tsgo.js"
 | 
					        "tsgo": "bin/tsgo.js"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@ -742,19 +759,19 @@
 | 
				
			|||||||
        "node": ">=20.6.0"
 | 
					        "node": ">=20.6.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "optionalDependencies": {
 | 
					      "optionalDependencies": {
 | 
				
			||||||
        "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-darwin-x64": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-darwin-x64": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-linux-arm": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-linux-arm": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-linux-arm64": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-linux-arm64": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-linux-x64": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-linux-x64": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-win32-arm64": "7.0.0-dev.20250719.1",
 | 
					        "@typescript/native-preview-win32-arm64": "7.0.0-dev.20250826.1",
 | 
				
			||||||
        "@typescript/native-preview-win32-x64": "7.0.0-dev.20250719.1"
 | 
					        "@typescript/native-preview-win32-x64": "7.0.0-dev.20250826.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-darwin-arm64": {
 | 
					    "node_modules/@typescript/native-preview-darwin-arm64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-8BOaK/9MJx6qN8DSj7ooDQ56j1HTdGCgs5gzT+rOfv1dJZuhy96rFe1DDd3RwX3ufrNpuLE969GM1tmhaHGLag==",
 | 
					      "integrity": "sha512-UTkmzj0+NpraW4GcgG5PECJZ25SASkiK7TP90lUx9/RZRidrClhHqyf/A3NPpI+1pqoKqGXxIt3+jV+BY15KyQ==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "arm64"
 | 
					        "arm64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -768,9 +785,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-darwin-x64": {
 | 
					    "node_modules/@typescript/native-preview-darwin-x64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-cs+/yOFQlkbT5Z5SY8gr5TOk+mporqYAHgRBMXeWWOOStIA1gH3iLKO3aLw85GclgmFBEoFaOTm61RI/ugwD3w==",
 | 
					      "integrity": "sha512-9UyLnKkJMW2T118FmS8Jj1djWDXgXGz2d9gUA/d+AdTAOaTBc1TmWhiUVcyKgIzG3+OAFIY+pVLeBWxNpFQu4Q==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "x64"
 | 
					        "x64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -784,9 +801,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-linux-arm": {
 | 
					    "node_modules/@typescript/native-preview-linux-arm": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-KDRPvXXgks6JLf1zO4KCI4Zw1ZjAS3jM+YxF5EdTnw2v6+Hff+ritUo4FQHbgQOo2OLnmqity3Qsxxb5i4DaRg==",
 | 
					      "integrity": "sha512-CRH103rrFme+V917lftxtcttiT69fDNZPcnNzHeuj1z6/G3eIY6Hmon4xQb/Q4CjgblcO/BIEz6zDVphlas3dA==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "arm"
 | 
					        "arm"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -800,9 +817,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-linux-arm64": {
 | 
					    "node_modules/@typescript/native-preview-linux-arm64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-Yv8xeongAOJRy8UQaPH6TVbje+IXpu24KgIffjNW90ygMAJSrCNZXjnkRSXAelydD8RPCEas4O+qJR0Z2vElUQ==",
 | 
					      "integrity": "sha512-GFcWo//t482UhZW+K1Nqlp/eOO2NS1uAIR77UyPn1FK/NOQBaxg8w4AZk0OG5ZHzvut4iZwQa2Gp+8zbNnfAIA==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "arm64"
 | 
					        "arm64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -816,9 +833,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-linux-x64": {
 | 
					    "node_modules/@typescript/native-preview-linux-x64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-GsGCL8KubbCOXfD9CyhHkMgZQVBLVXfeCnRID5UIgessmDBnd3Q158wbKIEZSLHVK2PffP9wKdfWMBGnU1X5BQ==",
 | 
					      "integrity": "sha512-ePQiUwa9YpUUc5g8lu77kCOgZyAseJn14B+5Uwz7n7CFPJn48L0mcKvjr3jVP8sER0r6rFmndEr2uyHnc+Qj2w==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "x64"
 | 
					        "x64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -832,9 +849,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-win32-arm64": {
 | 
					    "node_modules/@typescript/native-preview-win32-arm64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-TP7ulNmZdAd2jgVLrIsmUoxwvQnpzsdWlRnTr0R6wEj+4Ob4Moyl75/1DrIkXO7yC6zaklhzLqgbHPz+H37ffg==",
 | 
					      "integrity": "sha512-kL3qH6CeOPdtAgZw1cuFgwpyup3VSkAM+ayZGk08SM42Zd90VMTDf736kXm/xxAcpvmCQ0YrH1FDIG0dPiRCAw==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "arm64"
 | 
					        "arm64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -848,9 +865,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@typescript/native-preview-win32-x64": {
 | 
					    "node_modules/@typescript/native-preview-win32-x64": {
 | 
				
			||||||
      "version": "7.0.0-dev.20250719.1",
 | 
					      "version": "7.0.0-dev.20250826.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20250719.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20250826.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-QIQAbcojUatTTxPriscWi7PBem5GsSKHS4lc1tosLXeC1o3jYITu0MHjFRtXyyO91I0xhJKE899Oh3Y/lqmn4A==",
 | 
					      "integrity": "sha512-WPiCnQDz64ZtwUEZ/ezXLHjhZTOetdfZI16ZbjZGkeZ5O3DNMaHrwzvvqqIq7gPxICEOK+6pM9eQ92I6wDq0qQ==",
 | 
				
			||||||
      "cpu": [
 | 
					      "cpu": [
 | 
				
			||||||
        "x64"
 | 
					        "x64"
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
@ -2287,9 +2304,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/eslint-plugin-prettier": {
 | 
					    "node_modules/eslint-plugin-prettier": {
 | 
				
			||||||
      "version": "5.5.3",
 | 
					      "version": "5.5.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==",
 | 
					      "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@ -3833,9 +3850,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/mongodb": {
 | 
					    "node_modules/mongodb": {
 | 
				
			||||||
      "version": "6.17.0",
 | 
					      "version": "6.18.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==",
 | 
					      "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==",
 | 
				
			||||||
      "license": "Apache-2.0",
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@mongodb-js/saslprep": "^1.1.9",
 | 
					        "@mongodb-js/saslprep": "^1.1.9",
 | 
				
			||||||
@ -3889,14 +3906,14 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/mongoose": {
 | 
					    "node_modules/mongoose": {
 | 
				
			||||||
      "version": "8.16.4",
 | 
					      "version": "8.18.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.16.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-jslgdQ8pY2vcNSKPv3Dbi5ogo/NT8zcvf6kPDyD8Sdsjsa1at3AFAF0F5PT+jySPGSPbvlNaQ49nT9h+Kx2UDA==",
 | 
					      "integrity": "sha512-3TixPihQKBdyaYDeJqRjzgb86KbilEH07JmzV8SoSjgoskNTpa6oTBmDxeoF9p8YnWQoz7shnCyPkSV/48y3yw==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "bson": "^6.10.4",
 | 
					        "bson": "^6.10.4",
 | 
				
			||||||
        "kareem": "2.6.3",
 | 
					        "kareem": "2.6.3",
 | 
				
			||||||
        "mongodb": "~6.17.0",
 | 
					        "mongodb": "~6.18.0",
 | 
				
			||||||
        "mpath": "0.9.0",
 | 
					        "mpath": "0.9.0",
 | 
				
			||||||
        "mquery": "5.0.0",
 | 
					        "mquery": "5.0.0",
 | 
				
			||||||
        "ms": "2.1.3",
 | 
					        "ms": "2.1.3",
 | 
				
			||||||
@ -3981,9 +3998,9 @@
 | 
				
			|||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/napi-postinstall": {
 | 
					    "node_modules/napi-postinstall": {
 | 
				
			||||||
      "version": "0.3.2",
 | 
					      "version": "0.3.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==",
 | 
					      "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
@ -5158,11 +5175,14 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tinyglobby/node_modules/fdir": {
 | 
					    "node_modules/tinyglobby/node_modules/fdir": {
 | 
				
			||||||
      "version": "6.4.6",
 | 
					      "version": "6.5.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
 | 
					      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "picomatch": "^3 || ^4"
 | 
					        "picomatch": "^3 || ^4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@ -5391,9 +5411,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/typescript": {
 | 
					    "node_modules/typescript": {
 | 
				
			||||||
      "version": "5.8.3",
 | 
					      "version": "5.9.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
 | 
					      "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
 | 
				
			||||||
 | 
					      "devOptional": true,
 | 
				
			||||||
      "license": "Apache-2.0",
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
        "tsc": "bin/tsc",
 | 
					        "tsc": "bin/tsc",
 | 
				
			||||||
@ -5423,19 +5444,20 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/undici": {
 | 
					    "node_modules/undici": {
 | 
				
			||||||
      "version": "7.12.0",
 | 
					      "version": "7.15.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==",
 | 
					      "integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==",
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=20.18.1"
 | 
					        "node": ">=20.18.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/undici-types": {
 | 
					    "node_modules/undici-types": {
 | 
				
			||||||
      "version": "7.8.0",
 | 
					      "version": "7.10.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
 | 
					      "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/unpipe": {
 | 
					    "node_modules/unpipe": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
@ -5507,9 +5529,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-public-export-plus": {
 | 
					    "node_modules/warframe-public-export-plus": {
 | 
				
			||||||
      "version": "0.5.81",
 | 
					      "version": "0.5.84",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.81.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.84.tgz",
 | 
				
			||||||
      "integrity": "sha512-kh3e21XThVDSwdC3TJsMsXZnlZ4B/21HdeJkKcjuTygpCd842EPEKS3lRZl3mpXFOmdha744vAW1XEyHfiLofg=="
 | 
					      "integrity": "sha512-ZpI1Y5CgWDmCwM4/oQpv9u0GD6KFvsJ9f1vJVXYhm5VD9DdOJcFzXgXgg98HXJ5JHbO16ZGIj83117qdpd0RQA=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-riven-info": {
 | 
					    "node_modules/warframe-riven-info": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										34
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								package.json
									
									
									
									
									
								
							@ -4,33 +4,29 @@
 | 
				
			|||||||
  "description": "WF Emulator",
 | 
					  "description": "WF Emulator",
 | 
				
			||||||
  "main": "index.ts",
 | 
					  "main": "index.ts",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "start": "node --enable-source-maps --import ./build/src/pathman.js build/src/index.js",
 | 
					    "start": "node --enable-source-maps build/src/index.js",
 | 
				
			||||||
    "build": "tsgo --sourceMap && ncp static/webui build/static/webui",
 | 
					    "build": "tsgo --sourceMap && ncp static/webui build/static/webui",
 | 
				
			||||||
    "build:tsc": "tsc --incremental --sourceMap && ncp static/webui build/static/webui",
 | 
					    "build:tsc": "tsc --incremental --sourceMap && ncp static/webui build/static/webui",
 | 
				
			||||||
    "build:dev": "tsgo --sourceMap",
 | 
					    "build:dev": "tsgo --sourceMap",
 | 
				
			||||||
    "build:dev:tsc": "tsc --incremental --sourceMap",
 | 
					    "build:dev:tsc": "tsc --incremental --sourceMap",
 | 
				
			||||||
    "build-and-start": "npm run build && npm run start",
 | 
					    "build-and-start": "npm run build && npm run start",
 | 
				
			||||||
    "build-and-start:bun": "npm run verify && npm run bun-run",
 | 
					    "build-and-start:bun": "npm run verify && npm run bun-run",
 | 
				
			||||||
    "dev": "node scripts/dev.js",
 | 
					    "dev": "node scripts/dev.cjs",
 | 
				
			||||||
    "dev:bun": "bun scripts/dev.js",
 | 
					    "dev:bun": "bun scripts/dev.cjs",
 | 
				
			||||||
    "verify": "tsgo --noEmit",
 | 
					    "verify": "tsgo --noEmit",
 | 
				
			||||||
    "verify:tsc": "tsc --noEmit",
 | 
					    "verify:tsc": "tsc --noEmit",
 | 
				
			||||||
    "bun-run": "bun src/index.ts",
 | 
					    "raw": "node --experimental-transform-types src/index.ts",
 | 
				
			||||||
 | 
					    "raw:bun": "bun src/index.ts",
 | 
				
			||||||
    "lint": "eslint --ext .ts .",
 | 
					    "lint": "eslint --ext .ts .",
 | 
				
			||||||
    "lint:ci": "eslint --ext .ts --rule \"prettier/prettier: off\" .",
 | 
					    "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.cjs",
 | 
				
			||||||
    "fix-imports": "cd scripts && node fix-imports.js",
 | 
					    "fix": "npm run update-translations && npm run lint:fix"
 | 
				
			||||||
    "fix": "npm run update-translations && npm run fix-imports && npm run prettier"
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "license": "GNU",
 | 
					  "license": "GNU",
 | 
				
			||||||
 | 
					  "type": "module",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@types/express": "^5",
 | 
					 | 
				
			||||||
    "@types/morgan": "^1.9.9",
 | 
					 | 
				
			||||||
    "@types/websocket": "^1.0.10",
 | 
					 | 
				
			||||||
    "@types/ws": "^8.18.1",
 | 
					 | 
				
			||||||
    "@typescript/native-preview": "^7.0.0-dev.20250625.1",
 | 
					 | 
				
			||||||
    "chokidar": "^4.0.3",
 | 
					    "chokidar": "^4.0.3",
 | 
				
			||||||
    "crc-32": "^1.2.2",
 | 
					    "crc-32": "^1.2.2",
 | 
				
			||||||
    "express": "^5",
 | 
					    "express": "^5",
 | 
				
			||||||
@ -38,14 +34,21 @@
 | 
				
			|||||||
    "mongoose": "^8.11.0",
 | 
					    "mongoose": "^8.11.0",
 | 
				
			||||||
    "morgan": "^1.10.0",
 | 
					    "morgan": "^1.10.0",
 | 
				
			||||||
    "ncp": "^2.0.0",
 | 
					    "ncp": "^2.0.0",
 | 
				
			||||||
    "typescript": "^5.5",
 | 
					 | 
				
			||||||
    "undici": "^7.10.0",
 | 
					    "undici": "^7.10.0",
 | 
				
			||||||
    "warframe-public-export-plus": "^0.5.81",
 | 
					    "warframe-public-export-plus": "^0.5.83",
 | 
				
			||||||
    "warframe-riven-info": "^0.1.2",
 | 
					    "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
    "winston": "^3.17.0",
 | 
					    "winston": "^3.17.0",
 | 
				
			||||||
    "winston-daily-rotate-file": "^5.0.0",
 | 
					    "winston-daily-rotate-file": "^5.0.0",
 | 
				
			||||||
    "ws": "^8.18.2"
 | 
					    "ws": "^8.18.2"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  "optionalDependencies": {
 | 
				
			||||||
 | 
					    "@types/express": "^5",
 | 
				
			||||||
 | 
					    "@types/morgan": "^1.9.9",
 | 
				
			||||||
 | 
					    "@types/websocket": "^1.0.10",
 | 
				
			||||||
 | 
					    "@types/ws": "^8.18.1",
 | 
				
			||||||
 | 
					    "@typescript/native-preview": "^7.0.0-dev.20250625.1",
 | 
				
			||||||
 | 
					    "typescript": "^5.7"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^8.28.0",
 | 
					    "@typescript-eslint/eslint-plugin": "^8.28.0",
 | 
				
			||||||
    "@typescript-eslint/parser": "^8.28.0",
 | 
					    "@typescript-eslint/parser": "^8.28.0",
 | 
				
			||||||
@ -55,5 +58,8 @@
 | 
				
			|||||||
    "eslint-plugin-prettier": "^5.2.5",
 | 
					    "eslint-plugin-prettier": "^5.2.5",
 | 
				
			||||||
    "prettier": "^3.5.3",
 | 
					    "prettier": "^3.5.3",
 | 
				
			||||||
    "tree-kill": "^1.2.2"
 | 
					    "tree-kill": "^1.2.2"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "engines": {
 | 
				
			||||||
 | 
					    "node": ">=20.18.1"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ function run(changedFile) {
 | 
				
			|||||||
        buildproc = undefined;
 | 
					        buildproc = undefined;
 | 
				
			||||||
        if (code === 0) {
 | 
					        if (code === 0) {
 | 
				
			||||||
            console.log(`${process.versions.bun ? "Verified" : "Built"} in ${Date.now() - thisbuildstart} ms`);
 | 
					            console.log(`${process.versions.bun ? "Verified" : "Built"} in ${Date.now() - thisbuildstart} ms`);
 | 
				
			||||||
            runproc = spawn("npm", ["run", process.versions.bun ? "bun-run" : "start", "--", ...args], spawnopts);
 | 
					            runproc = spawn("npm", ["run", process.versions.bun ? "raw:bun" : "start", "--", ...args], spawnopts);
 | 
				
			||||||
            runproc.on("exit", () => {
 | 
					            runproc.on("exit", () => {
 | 
				
			||||||
                runproc = undefined;
 | 
					                runproc = undefined;
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
@ -1,46 +0,0 @@
 | 
				
			|||||||
/* eslint-disable */
 | 
					 | 
				
			||||||
const fs = require("fs");
 | 
					 | 
				
			||||||
const path = require("path");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const root = path.join(process.cwd(), "..");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function listFiles(dir) {
 | 
					 | 
				
			||||||
    const entries = fs.readdirSync(dir, { withFileTypes: true });
 | 
					 | 
				
			||||||
    let results = [];
 | 
					 | 
				
			||||||
    for (const entry of entries) {
 | 
					 | 
				
			||||||
        const fullPath = path.join(dir, entry.name);
 | 
					 | 
				
			||||||
        if (entry.isDirectory()) {
 | 
					 | 
				
			||||||
            results = results.concat(listFiles(fullPath));
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            results.push(fullPath);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return results;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const files = listFiles(path.join(root, "src"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
for (const file of files) {
 | 
					 | 
				
			||||||
    let content;
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
        content = fs.readFileSync(file, "utf8");
 | 
					 | 
				
			||||||
    } catch (e) {
 | 
					 | 
				
			||||||
        continue;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    const dir = path.dirname(file);
 | 
					 | 
				
			||||||
    const fixedContent = content.replaceAll(/} from "([^"]+)";/g, (sub, importPath) => {
 | 
					 | 
				
			||||||
        if (!importPath.startsWith("@/")) {
 | 
					 | 
				
			||||||
            const fullImportPath = path.resolve(dir, importPath);
 | 
					 | 
				
			||||||
            if (fs.existsSync(fullImportPath + ".ts")) {
 | 
					 | 
				
			||||||
                const relative = path.relative(root, fullImportPath).replace(/\\/g, "/");
 | 
					 | 
				
			||||||
                const fixedPath = "@/" + relative;
 | 
					 | 
				
			||||||
                console.log(`${importPath} -> ${fixedPath}`);
 | 
					 | 
				
			||||||
                return sub.split(importPath).join(fixedPath);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return sub;
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    if (content != fixedContent) {
 | 
					 | 
				
			||||||
        fs.writeFileSync(file, fixedContent, "utf8");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -31,7 +31,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => {
 | 
				
			|||||||
            const strings = extractStrings(line);
 | 
					            const strings = extractStrings(line);
 | 
				
			||||||
            if (Object.keys(strings).length > 0) {
 | 
					            if (Object.keys(strings).length > 0) {
 | 
				
			||||||
                Object.entries(strings).forEach(([key, value]) => {
 | 
					                Object.entries(strings).forEach(([key, value]) => {
 | 
				
			||||||
                    if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED] ")) {
 | 
					                    if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED]")) {
 | 
				
			||||||
                        fs.writeSync(fileHandle, `    ${key}: \`${targetStrings[key]}\`,\n`);
 | 
					                        fs.writeSync(fileHandle, `    ${key}: \`${targetStrings[key]}\`,\n`);
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        fs.writeSync(fileHandle, `    ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
 | 
					                        fs.writeSync(fileHandle, `    ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
 | 
				
			||||||
							
								
								
									
										20
									
								
								src/app.ts
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/app.ts
									
									
									
									
									
								
							@ -1,17 +1,17 @@
 | 
				
			|||||||
import express from "express";
 | 
					import express from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import bodyParser from "body-parser";
 | 
					import bodyParser from "body-parser";
 | 
				
			||||||
import { unknownEndpointHandler } from "@/src/middleware/middleware";
 | 
					import { unknownEndpointHandler } from "./middleware/middleware.ts";
 | 
				
			||||||
import { requestLogger } from "@/src/middleware/morgenMiddleware";
 | 
					import { requestLogger } from "./middleware/morgenMiddleware.ts";
 | 
				
			||||||
import { errorHandler } from "@/src/middleware/errorHandler";
 | 
					import { errorHandler } from "./middleware/errorHandler.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { apiRouter } from "@/src/routes/api";
 | 
					import { apiRouter } from "./routes/api.ts";
 | 
				
			||||||
import { cacheRouter } from "@/src/routes/cache";
 | 
					import { cacheRouter } from "./routes/cache.ts";
 | 
				
			||||||
import { customRouter } from "@/src/routes/custom";
 | 
					import { customRouter } from "./routes/custom.ts";
 | 
				
			||||||
import { dynamicController } from "@/src/routes/dynamic";
 | 
					import { dynamicController } from "./routes/dynamic.ts";
 | 
				
			||||||
import { payRouter } from "@/src/routes/pay";
 | 
					import { payRouter } from "./routes/pay.ts";
 | 
				
			||||||
import { statsRouter } from "@/src/routes/stats";
 | 
					import { statsRouter } from "./routes/stats.ts";
 | 
				
			||||||
import { webuiRouter } from "@/src/routes/webui";
 | 
					import { webuiRouter } from "./routes/webui.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const app = express();
 | 
					const app = express();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
 | 
					export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -5,11 +5,11 @@ import {
 | 
				
			|||||||
    hasGuildPermission,
 | 
					    hasGuildPermission,
 | 
				
			||||||
    removeDojoDeco,
 | 
					    removeDojoDeco,
 | 
				
			||||||
    removeDojoRoom
 | 
					    removeDojoRoom
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const abortDojoComponentController: RequestHandler = async (req, res) => {
 | 
					export const abortDojoComponentController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,13 @@
 | 
				
			|||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
 | 
					import {
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					    getDojoClient,
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					    getGuildForRequestEx,
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					    hasAccessToDojo,
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					    hasGuildPermission
 | 
				
			||||||
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {
 | 
					export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,19 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    createVeiledRivenFingerprint,
 | 
					    createVeiledRivenFingerprint,
 | 
				
			||||||
    createUnveiledRivenFingerprint,
 | 
					    createUnveiledRivenFingerprint,
 | 
				
			||||||
    rivenRawToRealWeighted
 | 
					    rivenRawToRealWeighted
 | 
				
			||||||
} from "@/src/helpers/rivenHelper";
 | 
					} from "../../helpers/rivenHelper.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMods, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getRandomElement } from "@/src/services/rngService";
 | 
					import { getRandomElement } from "../../services/rngService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const activateRandomModController: RequestHandler = async (req, res) => {
 | 
					export const activateRandomModController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
    const inventory = await getInventory(accountId);
 | 
					    const inventory = await getInventory(accountId, "RawUpgrades Upgrades instantFinishRivenChallenge");
 | 
				
			||||||
    const request = getJSONfromString<IActiveRandomModRequest>(String(req.body));
 | 
					    const request = getJSONfromString<IActiveRandomModRequest>(String(req.body));
 | 
				
			||||||
    addMods(inventory, [
 | 
					    addMods(inventory, [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -23,7 +22,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
    const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
 | 
					    const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
 | 
				
			||||||
    const fingerprint = config.instantFinishRivenChallenge
 | 
					    const fingerprint = inventory.instantFinishRivenChallenge
 | 
				
			||||||
        ? createUnveiledRivenFingerprint(ExportUpgrades[rivenType])
 | 
					        ? createUnveiledRivenFingerprint(ExportUpgrades[rivenType])
 | 
				
			||||||
        : createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
 | 
					        : createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
 | 
				
			||||||
    const upgradeIndex =
 | 
					    const upgradeIndex =
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Friendship } from "@/src/models/friendModel";
 | 
					import { Friendship } from "../../models/friendModel.ts";
 | 
				
			||||||
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "@/src/services/friendService";
 | 
					import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "../../services/friendService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IFriendInfo } from "@/src/types/friendTypes";
 | 
					import type { IFriendInfo } from "../../types/friendTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addFriendController: RequestHandler = async (req, res) => {
 | 
					export const addFriendController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addFriendImageController: RequestHandler = async (req, res) => {
 | 
					export const addFriendImageController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Account, Ignore } from "@/src/models/loginModel";
 | 
					import { Account, Ignore } from "../../models/loginModel.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IFriendInfo } from "@/src/types/friendTypes";
 | 
					import type { IFriendInfo } from "../../types/friendTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addIgnoredUserController: RequestHandler = async (req, res) => {
 | 
					export const addIgnoredUserController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Friendship } from "@/src/models/friendModel";
 | 
					import { Friendship } from "../../models/friendModel.ts";
 | 
				
			||||||
import { Account } from "@/src/models/loginModel";
 | 
					import { Account } from "../../models/loginModel.ts";
 | 
				
			||||||
import { addInventoryDataToFriendInfo, areFriendsOfFriends } from "@/src/services/friendService";
 | 
					import { addInventoryDataToFriendInfo, areFriendsOfFriends } from "../../services/friendService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IFriendInfo } from "@/src/types/friendTypes";
 | 
					import type { IFriendInfo } from "../../types/friendTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addPendingFriendController: RequestHandler = async (req, res) => {
 | 
					export const addPendingFriendController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const payload = getJSONfromString<IAddPendingFriendRequest>(String(req.body));
 | 
					    const payload = getJSONfromString<IAddPendingFriendRequest>(String(req.body));
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
import { getJSONfromString, regexEscape } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString, regexEscape } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { createMessage } from "@/src/services/inboxService";
 | 
					import { createMessage } from "../../services/inboxService.ts";
 | 
				
			||||||
import { getEffectiveAvatarImageType, getInventory } from "@/src/services/inventoryService";
 | 
					import { getEffectiveAvatarImageType, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getSuffixedName } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportFlavour } from "warframe-public-export-plus";
 | 
					import { ExportFlavour } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addToAllianceController: RequestHandler = async (req, res) => {
 | 
					export const addToAllianceController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,16 @@
 | 
				
			|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { Account } from "@/src/models/loginModel";
 | 
					import { Account } from "../../models/loginModel.ts";
 | 
				
			||||||
import { addInventoryDataToFriendInfo, areFriends } from "@/src/services/friendService";
 | 
					import { addInventoryDataToFriendInfo, areFriends } from "../../services/friendService.ts";
 | 
				
			||||||
import { hasGuildPermission } from "@/src/services/guildService";
 | 
					import { hasGuildPermission } from "../../services/guildService.ts";
 | 
				
			||||||
import { createMessage } from "@/src/services/inboxService";
 | 
					import { createMessage } from "../../services/inboxService.ts";
 | 
				
			||||||
import { getEffectiveAvatarImageType, getInventory } from "@/src/services/inventoryService";
 | 
					import { getEffectiveAvatarImageType, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "../../services/loginService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { GuildPermission, IGuildMemberClient } from "@/src/types/guildTypes";
 | 
					import type { IGuildMemberClient } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportFlavour } from "warframe-public-export-plus";
 | 
					import { ExportFlavour } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addToGuildController: RequestHandler = async (req, res) => {
 | 
					export const addToGuildController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const adoptPetController: RequestHandler = async (req, res) => {
 | 
					export const adoptPetController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getPersonalRooms } from "@/src/services/personalRoomsService";
 | 
					import { getPersonalRooms } from "../../services/personalRoomsService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const apartmentController: RequestHandler = async (req, res) => {
 | 
					export const apartmentController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory, addMods } from "@/src/services/inventoryService";
 | 
					import { getInventory, addMods } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const arcaneCommonController: RequestHandler = async (req, res) => {
 | 
					export const arcaneCommonController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { colorToShard, combineColors, shardToColor } from "@/src/helpers/shardHelper";
 | 
					import { colorToShard, combineColors, shardToColor } from "../../helpers/shardHelper.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const archonFusionController: RequestHandler = async (req, res) => {
 | 
					export const archonFusionController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,12 @@
 | 
				
			|||||||
import { fromOid, toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { fromOid, toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { createVeiledRivenFingerprint, rivenRawToRealWeighted } from "@/src/helpers/rivenHelper";
 | 
					import { createVeiledRivenFingerprint, rivenRawToRealWeighted } from "../../helpers/rivenHelper.ts";
 | 
				
			||||||
import { addMiscItems, addMods, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, addMods, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getRandomElement, getRandomWeightedReward, getRandomWeightedRewardUc } from "@/src/services/rngService";
 | 
					import { getRandomElement, getRandomWeightedReward, getRandomWeightedRewardUc } from "../../services/rngService.ts";
 | 
				
			||||||
import { IUpgradeFromClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IUpgradeFromClient } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportBoosterPacks, ExportUpgrades, TRarity } from "warframe-public-export-plus";
 | 
					import type { TRarity } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { ExportBoosterPacks, ExportUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const artifactTransmutationController: RequestHandler = async (req, res) => {
 | 
					export const artifactTransmutationController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { IInventoryClient, IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IInventoryClient, IUpgradeClient } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMods, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const artifactsController: RequestHandler = async (req, res) => {
 | 
					export const artifactsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { GuildAd } from "@/src/models/guildModel";
 | 
					import { GuildAd } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getGuildForRequestEx, hasGuildPermission } from "@/src/services/guildService";
 | 
					import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => {
 | 
					export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,16 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
 | 
					import {
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					    getDojoClient,
 | 
				
			||||||
import { GuildPermission, IDojoComponentDatabase } from "@/src/types/guildTypes";
 | 
					    getGuildForRequestEx,
 | 
				
			||||||
 | 
					    hasAccessToDojo,
 | 
				
			||||||
 | 
					    hasGuildPermission
 | 
				
			||||||
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
 | 
					import type { IDojoComponentDatabase } from "../../types/guildTypes.ts";
 | 
				
			||||||
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					import { Types } from "mongoose";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const changeDojoRootController: RequestHandler = async (req, res) => {
 | 
					export const changeDojoRootController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { GuildMember } from "@/src/models/guildModel";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getGuildForRequest, hasGuildPermissionEx } from "@/src/services/guildService";
 | 
					import { getGuildForRequest, hasGuildPermissionEx } from "../../services/guildService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const changeGuildRankController: RequestHandler = async (req, res) => {
 | 
					export const changeGuildRankController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const checkDailyMissionBonusController: RequestHandler = async (req, res) => {
 | 
					export const checkDailyMissionBonusController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,13 @@
 | 
				
			|||||||
//this is a controller for the claimCompletedRecipe route
 | 
					//this is a controller for the claimCompletedRecipe route
 | 
				
			||||||
//it will claim a recipe for the user
 | 
					//it will claim a recipe for the user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { getRecipe } from "@/src/services/itemDataService";
 | 
					import { getRecipe } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { IOid, IOidWithLegacySupport } from "@/src/types/commonTypes";
 | 
					import type { IOidWithLegacySupport } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import type { TAccountDocument } from "../../services/loginService.ts";
 | 
				
			||||||
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    updateCurrency,
 | 
					    updateCurrency,
 | 
				
			||||||
@ -17,243 +18,258 @@ import {
 | 
				
			|||||||
    addKubrowPetPrint,
 | 
					    addKubrowPetPrint,
 | 
				
			||||||
    addPowerSuit,
 | 
					    addPowerSuit,
 | 
				
			||||||
    addEquipment
 | 
					    addEquipment
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { InventorySlot, IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IPendingRecipeDatabase } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { toOid2 } from "@/src/helpers/inventoryHelpers";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { fromOid, toOid2 } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { IRecipe } from "warframe-public-export-plus";
 | 
					import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					import type { IRecipe } from "warframe-public-export-plus";
 | 
				
			||||||
import { EquipmentFeatures, IEquipmentClient, Status } from "@/src/types/equipmentTypes";
 | 
					import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					import { EquipmentFeatures, Status } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IClaimCompletedRecipeRequest {
 | 
					interface IClaimCompletedRecipeRequest {
 | 
				
			||||||
    RecipeIds: IOid[];
 | 
					    RecipeIds: IOidWithLegacySupport[];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IClaimCompletedRecipeResponse {
 | 
				
			||||||
 | 
					    InventoryChanges: IInventoryChanges;
 | 
				
			||||||
 | 
					    BrandedSuits?: IOidWithLegacySupport[];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const claimCompletedRecipeController: RequestHandler = async (req, res) => {
 | 
					export const claimCompletedRecipeController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const claimCompletedRecipeRequest = getJSONfromString<IClaimCompletedRecipeRequest>(String(req.body));
 | 
					    const claimCompletedRecipeRequest = getJSONfromString<IClaimCompletedRecipeRequest>(String(req.body));
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
    const inventory = await getInventory(account._id.toString());
 | 
					    const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
    const pendingRecipe = inventory.PendingRecipes.id(claimCompletedRecipeRequest.RecipeIds[0].$oid);
 | 
					    const resp: IClaimCompletedRecipeResponse = {
 | 
				
			||||||
    if (!pendingRecipe) {
 | 
					        InventoryChanges: {}
 | 
				
			||||||
        throw new Error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`);
 | 
					    };
 | 
				
			||||||
    }
 | 
					    for (const recipeId of claimCompletedRecipeRequest.RecipeIds) {
 | 
				
			||||||
 | 
					        const pendingRecipe = inventory.PendingRecipes.id(fromOid(recipeId));
 | 
				
			||||||
    //check recipe is indeed ready to be completed
 | 
					        if (!pendingRecipe) {
 | 
				
			||||||
    // if (pendingRecipe.CompletionDate > new Date()) {
 | 
					            throw new Error(`no pending recipe found with id ${fromOid(recipeId)}`);
 | 
				
			||||||
    //     throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`);
 | 
					 | 
				
			||||||
    // }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    inventory.PendingRecipes.pull(pendingRecipe._id);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const recipe = getRecipe(pendingRecipe.ItemType);
 | 
					 | 
				
			||||||
    if (!recipe) {
 | 
					 | 
				
			||||||
        throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (req.query.cancel) {
 | 
					 | 
				
			||||||
        const inventoryChanges: IInventoryChanges = {};
 | 
					 | 
				
			||||||
        await refundRecipeIngredients(inventory, inventoryChanges, recipe, pendingRecipe);
 | 
					 | 
				
			||||||
        await inventory.save();
 | 
					 | 
				
			||||||
        res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        logger.debug("Claiming Recipe", { recipe, pendingRecipe });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let BrandedSuits: undefined | IOidWithLegacySupport[];
 | 
					 | 
				
			||||||
        if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
 | 
					 | 
				
			||||||
            inventory.PendingSpectreLoadouts ??= [];
 | 
					 | 
				
			||||||
            inventory.SpectreLoadouts ??= [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            const pendingLoadoutIndex = inventory.PendingSpectreLoadouts.findIndex(
 | 
					 | 
				
			||||||
                x => x.ItemType == recipe.resultType
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            if (pendingLoadoutIndex != -1) {
 | 
					 | 
				
			||||||
                const loadoutIndex = inventory.SpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
 | 
					 | 
				
			||||||
                if (loadoutIndex != -1) {
 | 
					 | 
				
			||||||
                    inventory.SpectreLoadouts.splice(loadoutIndex, 1);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                logger.debug(
 | 
					 | 
				
			||||||
                    "moving spectre loadout from pending to active",
 | 
					 | 
				
			||||||
                    inventory.toJSON().PendingSpectreLoadouts![pendingLoadoutIndex]
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
                inventory.SpectreLoadouts.push(inventory.PendingSpectreLoadouts[pendingLoadoutIndex]);
 | 
					 | 
				
			||||||
                inventory.PendingSpectreLoadouts.splice(pendingLoadoutIndex, 1);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else if (recipe.secretIngredientAction == "SIA_UNBRAND") {
 | 
					 | 
				
			||||||
            inventory.BrandedSuits!.splice(
 | 
					 | 
				
			||||||
                inventory.BrandedSuits!.findIndex(x => x.equals(pendingRecipe.SuitToUnbrand)),
 | 
					 | 
				
			||||||
                1
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            BrandedSuits = [toOid2(pendingRecipe.SuitToUnbrand!, account.BuildLabel)];
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let InventoryChanges: IInventoryChanges = {};
 | 
					        //check recipe is indeed ready to be completed
 | 
				
			||||||
        if (recipe.consumeOnUse) {
 | 
					        // if (pendingRecipe.CompletionDate > new Date()) {
 | 
				
			||||||
            addRecipes(inventory, [
 | 
					        //     throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`);
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        inventory.PendingRecipes.pull(pendingRecipe._id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const recipe = getRecipe(pendingRecipe.ItemType);
 | 
				
			||||||
 | 
					        if (!recipe) {
 | 
				
			||||||
 | 
					            throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (req.query.cancel) {
 | 
				
			||||||
 | 
					            const inventoryChanges: IInventoryChanges = {};
 | 
				
			||||||
 | 
					            await refundRecipeIngredients(inventory, inventoryChanges, recipe, pendingRecipe);
 | 
				
			||||||
 | 
					            await inventory.save();
 | 
				
			||||||
 | 
					            res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await claimCompletedRecipe(account, inventory, recipe, pendingRecipe, resp, req.query.rush);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					    res.json(resp);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const claimCompletedRecipe = async (
 | 
				
			||||||
 | 
					    account: TAccountDocument,
 | 
				
			||||||
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
 | 
					    recipe: IRecipe,
 | 
				
			||||||
 | 
					    pendingRecipe: IPendingRecipeDatabase,
 | 
				
			||||||
 | 
					    resp: IClaimCompletedRecipeResponse,
 | 
				
			||||||
 | 
					    rush: any
 | 
				
			||||||
 | 
					): Promise<void> => {
 | 
				
			||||||
 | 
					    logger.debug("Claiming Recipe", { recipe, pendingRecipe });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
 | 
				
			||||||
 | 
					        inventory.PendingSpectreLoadouts ??= [];
 | 
				
			||||||
 | 
					        inventory.SpectreLoadouts ??= [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const pendingLoadoutIndex = inventory.PendingSpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
 | 
				
			||||||
 | 
					        if (pendingLoadoutIndex != -1) {
 | 
				
			||||||
 | 
					            const loadoutIndex = inventory.SpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
 | 
				
			||||||
 | 
					            if (loadoutIndex != -1) {
 | 
				
			||||||
 | 
					                inventory.SpectreLoadouts.splice(loadoutIndex, 1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            logger.debug(
 | 
				
			||||||
 | 
					                "moving spectre loadout from pending to active",
 | 
				
			||||||
 | 
					                inventory.toJSON().PendingSpectreLoadouts![pendingLoadoutIndex]
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            inventory.SpectreLoadouts.push(inventory.PendingSpectreLoadouts[pendingLoadoutIndex]);
 | 
				
			||||||
 | 
					            inventory.PendingSpectreLoadouts.splice(pendingLoadoutIndex, 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (recipe.secretIngredientAction == "SIA_UNBRAND") {
 | 
				
			||||||
 | 
					        inventory.BrandedSuits!.splice(
 | 
				
			||||||
 | 
					            inventory.BrandedSuits!.findIndex(x => x.equals(pendingRecipe.SuitToUnbrand)),
 | 
				
			||||||
 | 
					            1
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        resp.BrandedSuits = [toOid2(pendingRecipe.SuitToUnbrand!, account.BuildLabel)];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (recipe.consumeOnUse) {
 | 
				
			||||||
 | 
					        addRecipes(inventory, [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ItemType: pendingRecipe.ItemType,
 | 
				
			||||||
 | 
					                ItemCount: -1
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (rush) {
 | 
				
			||||||
 | 
					        const end = Math.trunc(pendingRecipe.CompletionDate.getTime() / 1000);
 | 
				
			||||||
 | 
					        const start = end - recipe.buildTime;
 | 
				
			||||||
 | 
					        const secondsElapsed = Math.trunc(Date.now() / 1000) - start;
 | 
				
			||||||
 | 
					        const progress = secondsElapsed / recipe.buildTime;
 | 
				
			||||||
 | 
					        logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`);
 | 
				
			||||||
 | 
					        const cost =
 | 
				
			||||||
 | 
					            progress > 0.5 ? Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5))) : recipe.skipBuildTimePrice;
 | 
				
			||||||
 | 
					        combineInventoryChanges(resp.InventoryChanges, updateCurrency(inventory, cost, true));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
 | 
				
			||||||
 | 
					        const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
 | 
				
			||||||
 | 
					        if (pet.Details!.HatchDate!.getTime() > Date.now()) {
 | 
				
			||||||
 | 
					            pet.Details!.HatchDate = new Date();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let canSetActive = true;
 | 
				
			||||||
 | 
					        for (const pet of inventory.KubrowPets) {
 | 
				
			||||||
 | 
					            if (pet.Details!.Status == Status.StatusAvailable) {
 | 
				
			||||||
 | 
					                canSetActive = false;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
 | 
				
			||||||
 | 
					    } else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
 | 
				
			||||||
 | 
					        const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
 | 
				
			||||||
 | 
					        addKubrowPetPrint(inventory, pet, resp.InventoryChanges);
 | 
				
			||||||
 | 
					    } else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
 | 
				
			||||||
 | 
					        if (recipe.resultType == "/Lotus/Powersuits/Excalibur/ExcaliburUmbra") {
 | 
				
			||||||
 | 
					            // Quite the special case here...
 | 
				
			||||||
 | 
					            // We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed.
 | 
				
			||||||
 | 
					            // Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const umbraModA = (
 | 
				
			||||||
 | 
					                await addItem(
 | 
				
			||||||
 | 
					                    inventory,
 | 
				
			||||||
 | 
					                    "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA",
 | 
				
			||||||
 | 
					                    1,
 | 
				
			||||||
 | 
					                    false,
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    `{"lvl":5}`
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ).Upgrades![0];
 | 
				
			||||||
 | 
					            const umbraModB = (
 | 
				
			||||||
 | 
					                await addItem(
 | 
				
			||||||
 | 
					                    inventory,
 | 
				
			||||||
 | 
					                    "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB",
 | 
				
			||||||
 | 
					                    1,
 | 
				
			||||||
 | 
					                    false,
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    `{"lvl":5}`
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ).Upgrades![0];
 | 
				
			||||||
 | 
					            const umbraModC = (
 | 
				
			||||||
 | 
					                await addItem(
 | 
				
			||||||
 | 
					                    inventory,
 | 
				
			||||||
 | 
					                    "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC",
 | 
				
			||||||
 | 
					                    1,
 | 
				
			||||||
 | 
					                    false,
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    `{"lvl":5}`
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ).Upgrades![0];
 | 
				
			||||||
 | 
					            const sacrificeModA = (
 | 
				
			||||||
 | 
					                await addItem(
 | 
				
			||||||
 | 
					                    inventory,
 | 
				
			||||||
 | 
					                    "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA",
 | 
				
			||||||
 | 
					                    1,
 | 
				
			||||||
 | 
					                    false,
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    `{"lvl":5}`
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ).Upgrades![0];
 | 
				
			||||||
 | 
					            const sacrificeModB = (
 | 
				
			||||||
 | 
					                await addItem(
 | 
				
			||||||
 | 
					                    inventory,
 | 
				
			||||||
 | 
					                    "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB",
 | 
				
			||||||
 | 
					                    1,
 | 
				
			||||||
 | 
					                    false,
 | 
				
			||||||
 | 
					                    undefined,
 | 
				
			||||||
 | 
					                    `{"lvl":5}`
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            ).Upgrades![0];
 | 
				
			||||||
 | 
					            resp.InventoryChanges.Upgrades ??= [];
 | 
				
			||||||
 | 
					            resp.InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await addPowerSuit(
 | 
				
			||||||
 | 
					                inventory,
 | 
				
			||||||
 | 
					                "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    ItemType: pendingRecipe.ItemType,
 | 
					                    Configs: [
 | 
				
			||||||
                    ItemCount: -1
 | 
					                        {
 | 
				
			||||||
                }
 | 
					                            Upgrades: [
 | 
				
			||||||
            ]);
 | 
					                                "",
 | 
				
			||||||
        }
 | 
					                                "",
 | 
				
			||||||
        if (req.query.rush) {
 | 
					                                "",
 | 
				
			||||||
            const end = Math.trunc(pendingRecipe.CompletionDate.getTime() / 1000);
 | 
					                                "",
 | 
				
			||||||
            const start = end - recipe.buildTime;
 | 
					                                "",
 | 
				
			||||||
            const secondsElapsed = Math.trunc(Date.now() / 1000) - start;
 | 
					                                umbraModA.ItemId.$oid,
 | 
				
			||||||
            const progress = secondsElapsed / recipe.buildTime;
 | 
					                                umbraModB.ItemId.$oid,
 | 
				
			||||||
            logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`);
 | 
					                                umbraModC.ItemId.$oid
 | 
				
			||||||
            const cost =
 | 
					                            ]
 | 
				
			||||||
                progress > 0.5
 | 
					                        }
 | 
				
			||||||
                    ? Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5)))
 | 
					                    ],
 | 
				
			||||||
                    : recipe.skipBuildTimePrice;
 | 
					                    XP: 900_000,
 | 
				
			||||||
            InventoryChanges = {
 | 
					                    Features: EquipmentFeatures.DOUBLE_CAPACITY
 | 
				
			||||||
                ...InventoryChanges,
 | 
					                },
 | 
				
			||||||
                ...updateCurrency(inventory, cost, true)
 | 
					                resp.InventoryChanges
 | 
				
			||||||
            };
 | 
					            );
 | 
				
			||||||
        }
 | 
					            inventory.XPInfo.push({
 | 
				
			||||||
 | 
					                ItemType: "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
 | 
				
			||||||
 | 
					                XP: 900_000
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
 | 
					            addEquipment(
 | 
				
			||||||
            const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
 | 
					                inventory,
 | 
				
			||||||
            if (pet.Details!.HatchDate!.getTime() > Date.now()) {
 | 
					                "Melee",
 | 
				
			||||||
                pet.Details!.HatchDate = new Date();
 | 
					                "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
 | 
				
			||||||
            }
 | 
					                {
 | 
				
			||||||
            let canSetActive = true;
 | 
					                    Configs: [
 | 
				
			||||||
            for (const pet of inventory.KubrowPets) {
 | 
					                        { Upgrades: ["", "", "", "", "", "", sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }
 | 
				
			||||||
                if (pet.Details!.Status == Status.StatusAvailable) {
 | 
					                    ],
 | 
				
			||||||
                    canSetActive = false;
 | 
					                    XP: 450_000,
 | 
				
			||||||
                    break;
 | 
					                    Features: EquipmentFeatures.DOUBLE_CAPACITY
 | 
				
			||||||
                }
 | 
					                },
 | 
				
			||||||
            }
 | 
					                resp.InventoryChanges
 | 
				
			||||||
            pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
 | 
					            );
 | 
				
			||||||
        } else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
 | 
					            inventory.XPInfo.push({
 | 
				
			||||||
            const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
 | 
					                ItemType: "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
 | 
				
			||||||
            addKubrowPetPrint(inventory, pet, InventoryChanges);
 | 
					                XP: 450_000
 | 
				
			||||||
        } else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
 | 
					            });
 | 
				
			||||||
            if (recipe.resultType == "/Lotus/Powersuits/Excalibur/ExcaliburUmbra") {
 | 
					        } else {
 | 
				
			||||||
                // Quite the special case here...
 | 
					            combineInventoryChanges(
 | 
				
			||||||
                // We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed.
 | 
					                resp.InventoryChanges,
 | 
				
			||||||
                // Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati
 | 
					                await addItem(
 | 
				
			||||||
 | 
					 | 
				
			||||||
                const umbraModA = (
 | 
					 | 
				
			||||||
                    await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA",
 | 
					 | 
				
			||||||
                        1,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        `{"lvl":5}`
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                ).Upgrades![0];
 | 
					 | 
				
			||||||
                const umbraModB = (
 | 
					 | 
				
			||||||
                    await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB",
 | 
					 | 
				
			||||||
                        1,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        `{"lvl":5}`
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                ).Upgrades![0];
 | 
					 | 
				
			||||||
                const umbraModC = (
 | 
					 | 
				
			||||||
                    await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC",
 | 
					 | 
				
			||||||
                        1,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        `{"lvl":5}`
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                ).Upgrades![0];
 | 
					 | 
				
			||||||
                const sacrificeModA = (
 | 
					 | 
				
			||||||
                    await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA",
 | 
					 | 
				
			||||||
                        1,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        `{"lvl":5}`
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                ).Upgrades![0];
 | 
					 | 
				
			||||||
                const sacrificeModB = (
 | 
					 | 
				
			||||||
                    await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB",
 | 
					 | 
				
			||||||
                        1,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        `{"lvl":5}`
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                ).Upgrades![0];
 | 
					 | 
				
			||||||
                InventoryChanges.Upgrades ??= [];
 | 
					 | 
				
			||||||
                InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                await addPowerSuit(
 | 
					 | 
				
			||||||
                    inventory,
 | 
					                    inventory,
 | 
				
			||||||
                    "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
 | 
					                    recipe.resultType,
 | 
				
			||||||
                    {
 | 
					                    recipe.num,
 | 
				
			||||||
                        Configs: [
 | 
					                    false,
 | 
				
			||||||
                            {
 | 
					                    undefined,
 | 
				
			||||||
                                Upgrades: [
 | 
					                    pendingRecipe.TargetFingerprint
 | 
				
			||||||
                                    "",
 | 
					                )
 | 
				
			||||||
                                    "",
 | 
					            );
 | 
				
			||||||
                                    "",
 | 
					 | 
				
			||||||
                                    "",
 | 
					 | 
				
			||||||
                                    "",
 | 
					 | 
				
			||||||
                                    umbraModA.ItemId.$oid,
 | 
					 | 
				
			||||||
                                    umbraModB.ItemId.$oid,
 | 
					 | 
				
			||||||
                                    umbraModC.ItemId.$oid
 | 
					 | 
				
			||||||
                                ]
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        ],
 | 
					 | 
				
			||||||
                        XP: 900_000,
 | 
					 | 
				
			||||||
                        Features: EquipmentFeatures.DOUBLE_CAPACITY
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    InventoryChanges
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
                inventory.XPInfo.push({
 | 
					 | 
				
			||||||
                    ItemType: "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
 | 
					 | 
				
			||||||
                    XP: 900_000
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                addEquipment(
 | 
					 | 
				
			||||||
                    inventory,
 | 
					 | 
				
			||||||
                    "Melee",
 | 
					 | 
				
			||||||
                    "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        Configs: [
 | 
					 | 
				
			||||||
                            { Upgrades: ["", "", "", "", "", "", sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }
 | 
					 | 
				
			||||||
                        ],
 | 
					 | 
				
			||||||
                        XP: 450_000,
 | 
					 | 
				
			||||||
                        Features: EquipmentFeatures.DOUBLE_CAPACITY
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    InventoryChanges
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
                inventory.XPInfo.push({
 | 
					 | 
				
			||||||
                    ItemType: "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
 | 
					 | 
				
			||||||
                    XP: 450_000
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                InventoryChanges = {
 | 
					 | 
				
			||||||
                    ...InventoryChanges,
 | 
					 | 
				
			||||||
                    ...(await addItem(
 | 
					 | 
				
			||||||
                        inventory,
 | 
					 | 
				
			||||||
                        recipe.resultType,
 | 
					 | 
				
			||||||
                        recipe.num,
 | 
					 | 
				
			||||||
                        false,
 | 
					 | 
				
			||||||
                        undefined,
 | 
					 | 
				
			||||||
                        pendingRecipe.TargetFingerprint
 | 
					 | 
				
			||||||
                    ))
 | 
					 | 
				
			||||||
                };
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (
 | 
					    }
 | 
				
			||||||
            config.claimingBlueprintRefundsIngredients &&
 | 
					    if (
 | 
				
			||||||
            recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg
 | 
					        inventory.claimingBlueprintRefundsIngredients &&
 | 
				
			||||||
        ) {
 | 
					        recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg
 | 
				
			||||||
            await refundRecipeIngredients(inventory, InventoryChanges, recipe, pendingRecipe);
 | 
					    ) {
 | 
				
			||||||
        }
 | 
					        await refundRecipeIngredients(inventory, resp.InventoryChanges, recipe, pendingRecipe);
 | 
				
			||||||
        await inventory.save();
 | 
					 | 
				
			||||||
        res.json({ InventoryChanges, BrandedSuits });
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
 | 
					import { combineInventoryChanges, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportChallenges } from "warframe-public-export-plus";
 | 
					import { ExportChallenges } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const claimJunctionChallengeRewardController: RequestHandler = async (req, res) => {
 | 
					export const claimJunctionChallengeRewardController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { addFusionPoints, getInventory } from "@/src/services/inventoryService";
 | 
					import { addFusionPoints, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
 | 
					export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const clearDialogueHistoryController: RequestHandler = async (req, res) => {
 | 
					export const clearDialogueHistoryController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// example req.body: {"NewEpisodeReward":true,"crossPlaySetting":"ENABLED"}
 | 
					// example req.body: {"NewEpisodeReward":true,"crossPlaySetting":"ENABLED"}
 | 
				
			||||||
export const clearNewEpisodeRewardController: RequestHandler = (_req, res) => {
 | 
					export const clearNewEpisodeRewardController: RequestHandler = (_req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { checkCalendarAutoAdvance, getCalendarProgress, getInventory } from "@/src/services/inventoryService";
 | 
					import { checkCalendarAutoAdvance, getCalendarProgress, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
 | 
				
			||||||
import { getWorldState } from "@/src/services/worldStateService";
 | 
					import { getWorldState } from "../../services/worldStateService.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GET request; query parameters: CompletedEventIdx=0&Iteration=4&Version=19&Season=CST_SUMMER
 | 
					// GET request; query parameters: CompletedEventIdx=0&Iteration=4&Version=19&Season=CST_SUMMER
 | 
				
			||||||
export const completeCalendarEventController: RequestHandler = async (req, res) => {
 | 
					export const completeCalendarEventController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory, updateCurrency } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { IVeiledRivenFingerprint } from "@/src/helpers/rivenHelper";
 | 
					import type { IVeiledRivenFingerprint } from "../../helpers/rivenHelper.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
 | 
					export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAllianceClient } from "@/src/services/guildService";
 | 
					import { getAllianceClient } from "../../services/guildService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const confirmAllianceInvitationController: RequestHandler = async (req, res) => {
 | 
					export const confirmAllianceInvitationController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    // Check requester is a warlord in their guild
 | 
					    // Check requester is a warlord in their guild
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,18 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { Account } from "@/src/models/loginModel";
 | 
					import { Account } from "../../models/loginModel.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    deleteGuild,
 | 
					    deleteGuild,
 | 
				
			||||||
    getGuildClient,
 | 
					    getGuildClient,
 | 
				
			||||||
    giveClanKey,
 | 
					    giveClanKey,
 | 
				
			||||||
    hasGuildPermission,
 | 
					    hasGuildPermission,
 | 
				
			||||||
    removeDojoKeyItems
 | 
					    removeDojoKeyItems
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					import { Types } from "mongoose";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GET request: A player accepting an invite they got in their inbox.
 | 
					// GET request: A player accepting an invite they got in their inbox.
 | 
				
			||||||
@ -95,7 +95,10 @@ export const confirmGuildInvitationPostController: RequestHandler = async (req,
 | 
				
			|||||||
        await GuildMember.deleteMany({ accountId: guildMember.accountId, status: 1 });
 | 
					        await GuildMember.deleteMany({ accountId: guildMember.accountId, status: 1 });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Update inventory of new member
 | 
					        // Update inventory of new member
 | 
				
			||||||
        const inventory = await getInventory(guildMember.accountId.toString(), "GuildId LevelKeys Recipes");
 | 
					        const inventory = await getInventory(
 | 
				
			||||||
 | 
					            guildMember.accountId.toString(),
 | 
				
			||||||
 | 
					            "GuildId LevelKeys Recipes skipClanKeyCrafting"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        inventory.GuildId = new Types.ObjectId(req.query.clanId as string);
 | 
					        inventory.GuildId = new Types.ObjectId(req.query.clanId as string);
 | 
				
			||||||
        giveClanKey(inventory);
 | 
					        giveClanKey(inventory);
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { checkClanAscensionHasRequiredContributors } from "@/src/services/guildService";
 | 
					import { checkClanAscensionHasRequiredContributors } from "../../services/guildService.ts";
 | 
				
			||||||
import { addFusionPoints, getInventory } from "@/src/services/inventoryService";
 | 
					import { addFusionPoints, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					import { Types } from "mongoose";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const contributeGuildClassController: RequestHandler = async (req, res) => {
 | 
					export const contributeGuildClassController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
					import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
 | 
				
			||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
 | 
					import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addGuildMemberMiscItemContribution,
 | 
					    addGuildMemberMiscItemContribution,
 | 
				
			||||||
    getDojoClient,
 | 
					    getDojoClient,
 | 
				
			||||||
@ -8,14 +9,15 @@ import {
 | 
				
			|||||||
    processDojoBuildMaterialsGathered,
 | 
					    processDojoBuildMaterialsGathered,
 | 
				
			||||||
    scaleRequiredCount,
 | 
					    scaleRequiredCount,
 | 
				
			||||||
    setDojoRoomLogFunded
 | 
					    setDojoRoomLogFunded
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory, updateCurrency } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IDojoContributable, IGuildMemberDatabase } from "@/src/types/guildTypes";
 | 
					import type { IDojoContributable, IGuildMemberDatabase } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus";
 | 
					import type { IDojoBuild } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { ExportDojoRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IContributeToDojoComponentRequest {
 | 
					interface IContributeToDojoComponentRequest {
 | 
				
			||||||
    ComponentId: string;
 | 
					    ComponentId: string;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,5 @@
 | 
				
			|||||||
import {
 | 
					import type { TGuildDatabaseDocument, TGuildMemberDatabaseDocument } from "../../models/guildModel.ts";
 | 
				
			||||||
    Alliance,
 | 
					import { Alliance, Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
    Guild,
 | 
					 | 
				
			||||||
    GuildMember,
 | 
					 | 
				
			||||||
    TGuildDatabaseDocument,
 | 
					 | 
				
			||||||
    TGuildMemberDatabaseDocument
 | 
					 | 
				
			||||||
} from "@/src/models/guildModel";
 | 
					 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addGuildMemberMiscItemContribution,
 | 
					    addGuildMemberMiscItemContribution,
 | 
				
			||||||
    addGuildMemberShipDecoContribution,
 | 
					    addGuildMemberShipDecoContribution,
 | 
				
			||||||
@ -12,18 +7,18 @@ import {
 | 
				
			|||||||
    addVaultMiscItems,
 | 
					    addVaultMiscItems,
 | 
				
			||||||
    addVaultShipDecos,
 | 
					    addVaultShipDecos,
 | 
				
			||||||
    getGuildForRequestEx
 | 
					    getGuildForRequestEx
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addFusionTreasures,
 | 
					    addFusionTreasures,
 | 
				
			||||||
    addMiscItems,
 | 
					    addMiscItems,
 | 
				
			||||||
    addShipDecorations,
 | 
					    addShipDecorations,
 | 
				
			||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    updateCurrency
 | 
					    updateCurrency
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { ITypeCount } from "@/src/types/commonTypes";
 | 
					import type { ITypeCount } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { IFusionTreasure, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IFusionTreasure, IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const contributeToVaultController: RequestHandler = async (req, res) => {
 | 
					export const contributeToVaultController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAllianceClient } from "@/src/services/guildService";
 | 
					import { getAllianceClient } from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const createAllianceController: RequestHandler = async (req, res) => {
 | 
					export const createAllianceController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { createUniqueClanName, getGuildClient, giveClanKey } from "@/src/services/guildService";
 | 
					import { createUniqueClanName, getGuildClient, giveClanKey } from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const createGuildController: RequestHandler = async (req, res) => {
 | 
					export const createGuildController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
@ -27,7 +27,7 @@ export const createGuildController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        rank: 0
 | 
					        rank: 0
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const inventory = await getInventory(account._id.toString(), "GuildId LevelKeys Recipes");
 | 
					    const inventory = await getInventory(account._id.toString(), "GuildId LevelKeys Recipes skipClanKeyCrafting");
 | 
				
			||||||
    inventory.GuildId = guild._id;
 | 
					    inventory.GuildId = guild._id;
 | 
				
			||||||
    const inventoryChanges: IInventoryChanges = {};
 | 
					    const inventoryChanges: IInventoryChanges = {};
 | 
				
			||||||
    giveClanKey(inventory, inventoryChanges);
 | 
					    giveClanKey(inventory, inventoryChanges);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const creditsController: RequestHandler = async (req, res) => {
 | 
					export const creditsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const inventory = (
 | 
					    const inventory = (
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { ICrewMemberClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { ICrewMemberClient } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					import { Types } from "mongoose";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const crewMembersController: RequestHandler = async (req, res) => {
 | 
					export const crewMembersController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,11 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addMiscItems, freeUpSlot, getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, freeUpSlot, getInventory, updateCurrency } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { ICrewShipComponentFingerprint, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { ICrewShipComponentFingerprint } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
 | 
					import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const crewShipFusionController: RequestHandler = async (req, res) => {
 | 
					export const crewShipFusionController: RequestHandler = async (req, res) => {
 | 
				
			||||||
@ -80,7 +81,7 @@ export const crewShipFusionController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            const newFval = (newPerc - rangeA[0]) / (rangeA[1] - rangeA[0]);
 | 
					            const newFval = (newPerc - rangeA[0]) / (rangeA[1] - rangeA[0]);
 | 
				
			||||||
            buffA.Value = Math.trunc(newFval * 0x3fffffff);
 | 
					            buffA.Value = Math.trunc(newFval * 0x3fffffff);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (inferiorFingerprint.SubroutineIndex) {
 | 
					        if (inferiorFingerprint.SubroutineIndex !== undefined) {
 | 
				
			||||||
            const useSuperiorSubroutine = tierA < tierB ? !payload.UseSubroutineA : payload.UseSubroutineA;
 | 
					            const useSuperiorSubroutine = tierA < tierB ? !payload.UseSubroutineA : payload.UseSubroutineA;
 | 
				
			||||||
            if (!useSuperiorSubroutine) {
 | 
					            if (!useSuperiorSubroutine) {
 | 
				
			||||||
                fingerprint.SubroutineIndex = inferiorFingerprint.SubroutineIndex;
 | 
					                fingerprint.SubroutineIndex = inferiorFingerprint.SubroutineIndex;
 | 
				
			||||||
 | 
				
			|||||||
@ -3,16 +3,19 @@ import {
 | 
				
			|||||||
    addCrewShipRawSalvage,
 | 
					    addCrewShipRawSalvage,
 | 
				
			||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    addEquipment
 | 
					    addEquipment
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ICrewShipComponentFingerprint, IInnateDamageFingerprint } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type {
 | 
				
			||||||
 | 
					    ICrewShipComponentFingerprint,
 | 
				
			||||||
 | 
					    IInnateDamageFingerprint
 | 
				
			||||||
 | 
					} from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { ExportCustoms, ExportRailjackWeapons, ExportUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportCustoms, ExportRailjackWeapons, ExportUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { getRandomInt } from "@/src/services/rngService";
 | 
					import { getRandomInt } from "../../services/rngService.ts";
 | 
				
			||||||
import { IFingerprintStat } from "@/src/helpers/rivenHelper";
 | 
					import type { IFingerprintStat } from "../../helpers/rivenHelper.ts";
 | 
				
			||||||
import { IEquipmentDatabase } from "@/src/types/equipmentTypes";
 | 
					import type { IEquipmentDatabase } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const crewShipIdentifySalvageController: RequestHandler = async (req, res) => {
 | 
					export const crewShipIdentifySalvageController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
 | 
					import { hasAccessToDojo, hasGuildPermission } from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountForRequest, getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => {
 | 
					export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const data = getJSONfromString<ICustomObstacleCourseLeaderboardRequest>(String(req.body));
 | 
					    const data = getJSONfromString<ICustomObstacleCourseLeaderboardRequest>(String(req.body));
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,8 @@
 | 
				
			|||||||
import { getGuildForRequest, hasGuildPermission } from "@/src/services/guildService";
 | 
					import { getGuildForRequest, hasGuildPermission } from "../../services/guildService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission, IGuildRank } from "@/src/types/guildTypes";
 | 
					import type { IGuildRank } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const customizeGuildRanksController: RequestHandler = async (req, res) => {
 | 
					export const customizeGuildRanksController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { AllianceMember, GuildMember } from "@/src/models/guildModel";
 | 
					import { AllianceMember, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const declineAllianceInviteController: RequestHandler = async (req, res) => {
 | 
					export const declineAllianceInviteController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    // Check requester is a warlord in their guild
 | 
					    // Check requester is a warlord in their guild
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { GuildMember } from "@/src/models/guildModel";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const declineGuildInviteController: RequestHandler = async (req, res) => {
 | 
					export const declineGuildInviteController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountForRequest(req);
 | 
					    const accountId = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { deleteSession } from "@/src/managers/sessionManager";
 | 
					import { deleteSession } from "../../managers/sessionManager.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const deleteSessionController: RequestHandler = (_req, res) => {
 | 
					const deleteSessionController: RequestHandler = (_req, res) => {
 | 
				
			||||||
    deleteSession(_req.query.sessionId as string);
 | 
					    deleteSession(_req.query.sessionId as string);
 | 
				
			||||||
 | 
				
			|||||||
@ -5,12 +5,12 @@ import {
 | 
				
			|||||||
    hasGuildPermission,
 | 
					    hasGuildPermission,
 | 
				
			||||||
    refundDojoDeco,
 | 
					    refundDojoDeco,
 | 
				
			||||||
    removeDojoDeco
 | 
					    removeDojoDeco
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const destroyDojoDecoController: RequestHandler = async (req, res) => {
 | 
					export const destroyDojoDecoController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
 | 
					import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { GuildPermission } from "@/src/types/guildTypes";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { parallelForeach } from "@/src/utils/async-utils";
 | 
					import { parallelForeach } from "../../utils/async-utils.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
 | 
					export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    // Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
 | 
					    // Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,17 @@
 | 
				
			|||||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
 | 
					import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
 | 
					import {
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					    getDojoClient,
 | 
				
			||||||
import { IDojoContributable } from "@/src/types/guildTypes";
 | 
					    getGuildForRequestEx,
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					    hasAccessToDojo,
 | 
				
			||||||
import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus";
 | 
					    scaleRequiredCount
 | 
				
			||||||
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
 | 
					import { getInventory, updateCurrency } from "../../services/inventoryService.ts";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
 | 
					import type { IDojoContributable } from "../../types/guildTypes.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import type { IDojoBuild } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { ExportDojoRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IDojoComponentRushRequest {
 | 
					interface IDojoComponentRushRequest {
 | 
				
			||||||
    DecoType?: string;
 | 
					    DecoType?: string;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Arbiter Dojo endpoints, not really used by us as we don't provide a ContentURL.
 | 
					// Arbiter Dojo endpoints, not really used by us as we don't provide a ContentURL.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,12 @@
 | 
				
			|||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { fromStoreItem } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { fromStoreItem } from "@/src/services/itemDataService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getRandomInt, getRandomWeightedRewardUc } from "../../services/rngService.ts";
 | 
				
			||||||
import { getRandomInt, getRandomWeightedRewardUc } from "@/src/services/rngService";
 | 
					import type { IMongoDate, IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { IMongoDate, IOid } from "@/src/types/commonTypes";
 | 
					import type { IDroneClient } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					 | 
				
			||||||
import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";
 | 
					import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const dronesController: RequestHandler = async (req, res) => {
 | 
					export const dronesController: RequestHandler = async (req, res) => {
 | 
				
			||||||
@ -39,10 +38,13 @@ export const dronesController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            ActiveDrones: activeDrones
 | 
					            ActiveDrones: activeDrones
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    } else if ("droneId" in req.query && "systemIndex" in req.query) {
 | 
					    } else if ("droneId" in req.query && "systemIndex" in req.query) {
 | 
				
			||||||
        const inventory = await getInventory(accountId, "Drones");
 | 
					        const inventory = await getInventory(
 | 
				
			||||||
 | 
					            accountId,
 | 
				
			||||||
 | 
					            "Drones instantResourceExtractorDrones noResourceExtractorDronesDamage"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        const drone = inventory.Drones.id(req.query.droneId as string)!;
 | 
					        const drone = inventory.Drones.id(req.query.droneId as string)!;
 | 
				
			||||||
        const droneMeta = ExportDrones[drone.ItemType];
 | 
					        const droneMeta = ExportDrones[drone.ItemType];
 | 
				
			||||||
        drone.DeployTime = config.instantResourceExtractorDrones ? new Date(0) : new Date();
 | 
					        drone.DeployTime = inventory.instantResourceExtractorDrones ? new Date(0) : new Date();
 | 
				
			||||||
        if (drone.RepairStart) {
 | 
					        if (drone.RepairStart) {
 | 
				
			||||||
            const repairMinutes = (Date.now() - drone.RepairStart.getTime()) / 60_000;
 | 
					            const repairMinutes = (Date.now() - drone.RepairStart.getTime()) / 60_000;
 | 
				
			||||||
            const hpPerMinute = droneMeta.repairRate / 60;
 | 
					            const hpPerMinute = droneMeta.repairRate / 60;
 | 
				
			||||||
@ -51,11 +53,11 @@ export const dronesController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        drone.System = parseInt(req.query.systemIndex as string);
 | 
					        drone.System = parseInt(req.query.systemIndex as string);
 | 
				
			||||||
        const system = ExportSystems[drone.System - 1];
 | 
					        const system = ExportSystems[drone.System - 1];
 | 
				
			||||||
        drone.DamageTime = config.instantResourceExtractorDrones
 | 
					        drone.DamageTime = inventory.instantResourceExtractorDrones
 | 
				
			||||||
            ? new Date()
 | 
					            ? new Date()
 | 
				
			||||||
            : new Date(Date.now() + getRandomInt(3 * 3600 * 1000, 4 * 3600 * 1000));
 | 
					            : new Date(Date.now() + getRandomInt(3 * 3600 * 1000, 4 * 3600 * 1000));
 | 
				
			||||||
        drone.PendingDamage =
 | 
					        drone.PendingDamage =
 | 
				
			||||||
            !config.noResourceExtractorDronesDamage && Math.random() < system.damageChance
 | 
					            !inventory.noResourceExtractorDronesDamage && Math.random() < system.damageChance
 | 
				
			||||||
                ? getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue)
 | 
					                ? getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue)
 | 
				
			||||||
                : 0;
 | 
					                : 0;
 | 
				
			||||||
        const resource = getRandomWeightedRewardUc(system.resources, droneMeta.probabilities)!;
 | 
					        const resource = getRandomWeightedRewardUc(system.resources, droneMeta.probabilities)!;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,18 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
 | 
					import { combineInventoryChanges, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { IEndlessXpReward, IInventoryClient, TEndlessXpCategory } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type {
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					    IEndlessXpReward,
 | 
				
			||||||
import { ExportRewards, ICountedStoreItem } from "warframe-public-export-plus";
 | 
					    IInventoryClient,
 | 
				
			||||||
import { getRandomElement } from "@/src/services/rngService";
 | 
					    TEndlessXpCategory
 | 
				
			||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					} from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
 | 
					import type { ICountedStoreItem } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { ExportRewards } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { getRandomElement } from "../../services/rngService.ts";
 | 
				
			||||||
 | 
					import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
 | 
				
			||||||
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const endlessXpController: RequestHandler = async (req, res) => {
 | 
					export const endlessXpController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory, updateEntratiVault } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const entratiLabConquestModeController: RequestHandler = async (req, res) => {
 | 
					export const entratiLabConquestModeController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
@ -11,26 +11,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
 | 
				
			|||||||
        "EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
 | 
					        "EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
 | 
					    const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
 | 
				
			||||||
    if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) {
 | 
					    updateEntratiVault(inventory);
 | 
				
			||||||
        const EPOCH = 1734307200 * 1000; // Mondays, amirite?
 | 
					 | 
				
			||||||
        const day = Math.trunc((Date.now() - EPOCH) / 86400000);
 | 
					 | 
				
			||||||
        const week = Math.trunc(day / 7);
 | 
					 | 
				
			||||||
        const weekStart = EPOCH + week * 604800000;
 | 
					 | 
				
			||||||
        const weekEnd = weekStart + 604800000;
 | 
					 | 
				
			||||||
        inventory.EntratiVaultCountLastPeriod = 0;
 | 
					 | 
				
			||||||
        inventory.EntratiVaultCountResetDate = new Date(weekEnd);
 | 
					 | 
				
			||||||
        if (inventory.EntratiLabConquestUnlocked) {
 | 
					 | 
				
			||||||
            inventory.EntratiLabConquestUnlocked = 0;
 | 
					 | 
				
			||||||
            inventory.EntratiLabConquestCacheScoreMission = 0;
 | 
					 | 
				
			||||||
            inventory.EntratiLabConquestActiveFrameVariants = [];
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (inventory.EchoesHexConquestUnlocked) {
 | 
					 | 
				
			||||||
            inventory.EchoesHexConquestUnlocked = 0;
 | 
					 | 
				
			||||||
            inventory.EchoesHexConquestCacheScoreMission = 0;
 | 
					 | 
				
			||||||
            inventory.EchoesHexConquestActiveFrameVariants = [];
 | 
					 | 
				
			||||||
            inventory.EchoesHexConquestActiveStickers = [];
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (body.BuyMode) {
 | 
					    if (body.BuyMode) {
 | 
				
			||||||
        inventory.EntratiVaultCountLastPeriod! += 2;
 | 
					        inventory.EntratiVaultCountLastPeriod! += 2;
 | 
				
			||||||
        if (body.IsEchoesDeepArchemedea) {
 | 
					        if (body.IsEchoesDeepArchemedea) {
 | 
				
			||||||
@ -51,7 +32,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    await inventory.save();
 | 
					    await inventory.save();
 | 
				
			||||||
    res.json({
 | 
					    res.json({
 | 
				
			||||||
        EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate),
 | 
					        EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate!),
 | 
				
			||||||
        EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
 | 
					        EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
 | 
				
			||||||
        EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
 | 
					        EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
 | 
				
			||||||
        EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
 | 
					        EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,10 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getRecipe, WeaponTypeInternal } from "@/src/services/itemDataService";
 | 
					import type { WeaponTypeInternal } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { EquipmentFeatures } from "@/src/types/equipmentTypes";
 | 
					import { getRecipe } from "../../services/itemDataService.ts";
 | 
				
			||||||
 | 
					import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const evolveWeaponController: RequestHandler = async (req, res) => {
 | 
					export const evolveWeaponController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getSession } from "@/src/managers/sessionManager";
 | 
					import { getSession } from "../../managers/sessionManager.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { IFindSessionRequest } from "@/src/types/session";
 | 
					import type { IFindSessionRequest } from "../../types/session.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const findSessionsController: RequestHandler = (_req, res) => {
 | 
					export const findSessionsController: RequestHandler = (_req, res) => {
 | 
				
			||||||
    const req = JSON.parse(String(_req.body)) as IFindSessionRequest;
 | 
					    const req = JSON.parse(String(_req.body)) as IFindSessionRequest;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addMiscItems, addStanding, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, addStanding, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportResources } from "warframe-public-export-plus";
 | 
					import { ExportResources } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const fishmongerController: RequestHandler = async (req, res) => {
 | 
					export const fishmongerController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,11 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory, addMiscItems, addEquipment, occupySlot } from "@/src/services/inventoryService";
 | 
					import { getInventory, addMiscItems, addEquipment, occupySlot } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IMiscItem, TFocusPolarity, TEquipmentKey, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem, TFocusPolarity, TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { ExportFocusUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportFocusUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const focusController: RequestHandler = async (req, res) => {
 | 
					export const focusController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportResources } from "warframe-public-export-plus";
 | 
					import { ExportResources } from "warframe-public-export-plus";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { addFusionTreasures, addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { addFusionTreasures, addMiscItems, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { parseFusionTreasure } from "@/src/helpers/inventoryHelpers";
 | 
					import { parseFusionTreasure } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IFusionTreasureRequest {
 | 
					interface IFusionTreasureRequest {
 | 
				
			||||||
    oldTreasureName: string;
 | 
					    oldTreasureName: string;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +1,14 @@
 | 
				
			|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addMiscItem, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItem, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { toStoreItem } from "@/src/services/itemDataService";
 | 
					import { toStoreItem } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
 | 
					import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
 | 
				
			||||||
import { IMongoDate } from "@/src/types/commonTypes";
 | 
					import type { IMongoDate } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { IMissionReward } from "@/src/types/missionTypes";
 | 
					import type { IMissionReward } from "../../types/missionTypes.ts";
 | 
				
			||||||
import { IGardeningClient, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
 | 
					import type { IGardeningClient, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { dict_en, ExportResources } from "warframe-public-export-plus";
 | 
					import { dict_en, ExportResources } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const gardeningController: RequestHandler = async (req, res) => {
 | 
					export const gardeningController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { updateGeneric } from "@/src/services/inventoryService";
 | 
					import { updateGeneric } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { IGenericUpdate } from "@/src/types/genericUpdate";
 | 
					import type { IGenericUpdate } from "../../types/genericUpdate.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This endpoint used to be /api/genericUpdate.php, but sometime around the Jade Shadows update, it was changed to /api/updateNodeIntros.php.
 | 
					// This endpoint used to be /api/genericUpdate.php, but sometime around the Jade Shadows update, it was changed to /api/updateNodeIntros.php.
 | 
				
			||||||
// SpaceNinjaServer supports both endpoints right now.
 | 
					// SpaceNinjaServer supports both endpoints right now.
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { Alliance, Guild } from "@/src/models/guildModel";
 | 
					import { Alliance, Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAllianceClient } from "@/src/services/guildService";
 | 
					import { getAllianceClient } from "../../services/guildService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getAllianceController: RequestHandler = async (req, res) => {
 | 
					export const getAllianceController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { DailyDeal } from "@/src/models/worldStateModel";
 | 
					import { DailyDeal } from "../../models/worldStateModel.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
 | 
					export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
 | 
					    const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { Friendship } from "@/src/models/friendModel";
 | 
					import { Friendship } from "../../models/friendModel.ts";
 | 
				
			||||||
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "@/src/services/friendService";
 | 
					import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "../../services/friendService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IFriendInfo } from "@/src/types/friendTypes";
 | 
					import type { IFriendInfo } from "../../types/friendTypes.ts";
 | 
				
			||||||
import { Request, RequestHandler, Response } from "express";
 | 
					import type { Request, RequestHandler, Response } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// POST with {} instead of GET as of 38.5.0
 | 
					// POST with {} instead of GET as of 38.5.0
 | 
				
			||||||
export const getFriendsController: RequestHandler = async (req: Request, res: Response) => {
 | 
					export const getFriendsController: RequestHandler = async (req: Request, res: Response) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { GuildMember } from "@/src/models/guildModel";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IGuildMemberClient } from "@/src/types/guildTypes";
 | 
					import type { IGuildMemberClient } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getGuildContributionsController: RequestHandler = async (req, res) => {
 | 
					export const getGuildContributionsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { createUniqueClanName, getGuildClient } from "@/src/services/guildService";
 | 
					import { createUniqueClanName, getGuildClient } from "../../services/guildService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getGuildController: RequestHandler = async (req, res) => {
 | 
					export const getGuildController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					import { Types } from "mongoose";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getDojoClient } from "@/src/services/guildService";
 | 
					import { getDojoClient } from "../../services/guildService.ts";
 | 
				
			||||||
import { Account } from "@/src/models/loginModel";
 | 
					import { Account } from "../../models/loginModel.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getGuildDojoController: RequestHandler = async (req, res) => {
 | 
					export const getGuildDojoController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const guildId = req.query.guildId as string;
 | 
					    const guildId = req.query.guildId as string;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getGuildEventScoreController: RequestHandler = async (req, res) => {
 | 
					export const getGuildEventScoreController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { Guild } from "@/src/models/guildModel";
 | 
					import { Guild } from "../../models/guildModel.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IMongoDate } from "@/src/types/commonTypes";
 | 
					import type { IMongoDate } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getGuildLogController: RequestHandler = async (req, res) => {
 | 
					export const getGuildLogController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { Account, Ignore } from "@/src/models/loginModel";
 | 
					import { Account, Ignore } from "../../models/loginModel.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IFriendInfo } from "@/src/types/friendTypes";
 | 
					import type { IFriendInfo } from "../../types/friendTypes.ts";
 | 
				
			||||||
import { parallelForeach } from "@/src/utils/async-utils";
 | 
					import { parallelForeach } from "../../utils/async-utils.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getIgnoredUsersController: RequestHandler = async (req, res) => {
 | 
					export const getIgnoredUsersController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { generateRewardSeed } from "@/src/services/rngService";
 | 
					import { generateRewardSeed } from "../../services/rngService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getNewRewardSeedController: RequestHandler = async (req, res) => {
 | 
					export const getNewRewardSeedController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { EPOCH, getSeasonChallengePools, getWorldState, pushWeeklyActs } from "@/src/services/worldStateService";
 | 
					import { EPOCH, getSeasonChallengePools, getWorldState, pushWeeklyActs } from "../../services/worldStateService.ts";
 | 
				
			||||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
 | 
					import { unixTimesInMs } from "../../constants/timeConstants.ts";
 | 
				
			||||||
import { ISeasonChallenge } from "@/src/types/worldStateTypes";
 | 
					import type { ISeasonChallenge } from "../../types/worldStateTypes.ts";
 | 
				
			||||||
import { ExportChallenges } from "warframe-public-export-plus";
 | 
					import { ExportChallenges } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
 | 
					export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,11 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					import { config } from "../../services/configService.ts";
 | 
				
			||||||
import allShipFeatures from "@/static/fixed_responses/allShipFeatures.json";
 | 
					import allShipFeatures from "../../../static/fixed_responses/allShipFeatures.json" with { type: "json" };
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
 | 
					import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
 | 
				
			||||||
import { IGetShipResponse, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
 | 
					import type { IGetShipResponse, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
 | 
				
			||||||
import { getLoadout } from "@/src/services/loadoutService";
 | 
					import { getLoadout } from "../../services/loadoutService.ts";
 | 
				
			||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getShipController: RequestHandler = async (req, res) => {
 | 
					export const getShipController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { applyStandingToVendorManifest, getVendorManifestByTypeName } from "@/src/services/serversideVendorsService";
 | 
					import { applyStandingToVendorManifest, getVendorManifestByTypeName } from "../../services/serversideVendorsService.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					import { config } from "../../services/configService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getVendorInfoController: RequestHandler = async (req, res) => {
 | 
					export const getVendorInfoController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    let manifest = getVendorManifestByTypeName(req.query.vendor as string);
 | 
					    let manifest = getVendorManifestByTypeName(req.query.vendor as string);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { crackRelic } from "@/src/helpers/relicHelper";
 | 
					import { crackRelic } from "../../helpers/relicHelper.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IVoidTearParticipantInfo } from "@/src/types/requestTypes";
 | 
					import type { IVoidTearParticipantInfo } from "../../types/requestTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => {
 | 
					export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,19 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { Account } from "@/src/models/loginModel";
 | 
					import { Account } from "../../models/loginModel.ts";
 | 
				
			||||||
import { areFriends } from "@/src/services/friendService";
 | 
					import { areFriends } from "../../services/friendService.ts";
 | 
				
			||||||
import { createMessage } from "@/src/services/inboxService";
 | 
					import { createMessage } from "../../services/inboxService.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    combineInventoryChanges,
 | 
					    combineInventoryChanges,
 | 
				
			||||||
    getEffectiveAvatarImageType,
 | 
					    getEffectiveAvatarImageType,
 | 
				
			||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    updateCurrency
 | 
					    updateCurrency
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getSuffixedName } from "../../services/loginService.ts";
 | 
				
			||||||
import { handleDailyDealPurchase, handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					import { handleDailyDealPurchase, handleStoreItemAcquisition } from "../../services/purchaseService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { IPurchaseParams, IPurchaseResponse, PurchaseSource } from "@/src/types/purchaseTypes";
 | 
					import type { IPurchaseParams, IPurchaseResponse } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import { PurchaseSource } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
 | 
					import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const checkPurchaseParams = (params: IPurchaseParams): boolean => {
 | 
					const checkPurchaseParams = (params: IPurchaseParams): boolean => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,14 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { sendWsBroadcastTo } from "@/src/services/wsService";
 | 
					import { sendWsBroadcastTo } from "../../services/wsService.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
 | 
					import type { ArtifactPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
 | 
				
			||||||
import { ExportRecipes } from "warframe-public-export-plus";
 | 
					import { ExportRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { EquipmentFeatures, IEquipmentClient } from "@/src/types/equipmentTypes";
 | 
					import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IGildWeaponRequest {
 | 
					interface IGildWeaponRequest {
 | 
				
			||||||
    ItemName: string;
 | 
					    ItemName: string;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { parseString } from "@/src/helpers/general";
 | 
					import { parseString } from "../../helpers/general.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { giveKeyChainItem } from "@/src/services/questService";
 | 
					import { giveKeyChainItem } from "../../services/questService.ts";
 | 
				
			||||||
import { IKeyChainRequest } from "@/src/types/requestTypes";
 | 
					import type { IKeyChainRequest } from "../../types/requestTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
 | 
					export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = parseString(req.query.accountId);
 | 
					    const accountId = parseString(req.query.accountId);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { giveKeyChainMessage } from "@/src/services/questService";
 | 
					import { giveKeyChainMessage } from "../../services/questService.ts";
 | 
				
			||||||
import { IKeyChainRequest } from "@/src/types/requestTypes";
 | 
					import type { IKeyChainRequest } from "../../types/requestTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
 | 
					export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addItem, getInventory } from "@/src/services/inventoryService";
 | 
					import { addItem, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {
 | 
					export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addLoreFragmentScans, addShipDecorations, getInventory } from "@/src/services/inventoryService";
 | 
					import { addLoreFragmentScans, addShipDecorations, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { ITypeCount } from "@/src/types/commonTypes";
 | 
					import type { ITypeCount } from "../../types/commonTypes.ts";
 | 
				
			||||||
import { ILoreFragmentScan } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { ILoreFragmentScan } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const giveShipDecoAndLoreFragmentController: RequestHandler = async (req, res) => {
 | 
					export const giveShipDecoAndLoreFragmentController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addStartingGear, getInventory } from "@/src/services/inventoryService";
 | 
					import { addStartingGear, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { TPartialStartingGear } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { TPartialStartingGear } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const giveStartingGearController: RequestHandler = async (req, res) => {
 | 
					export const giveStartingGearController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addGuildMemberMiscItemContribution,
 | 
					    addGuildMemberMiscItemContribution,
 | 
				
			||||||
    getGuildForRequestEx,
 | 
					    getGuildForRequestEx,
 | 
				
			||||||
@ -11,9 +11,9 @@ import {
 | 
				
			|||||||
    removePigmentsFromGuildMembers,
 | 
					    removePigmentsFromGuildMembers,
 | 
				
			||||||
    scaleRequiredCount,
 | 
					    scaleRequiredCount,
 | 
				
			||||||
    setGuildTechLogState
 | 
					    setGuildTechLogState
 | 
				
			||||||
} from "@/src/services/guildService";
 | 
					} from "../../services/guildService.ts";
 | 
				
			||||||
import { ExportDojoRecipes, ExportRailjackWeapons } from "warframe-public-export-plus";
 | 
					import { ExportDojoRecipes, ExportRailjackWeapons } from "warframe-public-export-plus";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addCrewShipWeaponSkin,
 | 
					    addCrewShipWeaponSkin,
 | 
				
			||||||
    addEquipment,
 | 
					    addEquipment,
 | 
				
			||||||
@ -24,15 +24,17 @@ import {
 | 
				
			|||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    occupySlot,
 | 
					    occupySlot,
 | 
				
			||||||
    updateCurrency
 | 
					    updateCurrency
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IMiscItem, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
import { GuildPermission, ITechProjectClient } from "@/src/types/guildTypes";
 | 
					import { config } from "../../services/configService.ts";
 | 
				
			||||||
import { GuildMember } from "@/src/models/guildModel";
 | 
					import type { ITechProjectClient } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { GuildPermission } from "../../types/guildTypes.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { GuildMember } from "../../models/guildModel.ts";
 | 
				
			||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
 | 
					import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const guildTechController: RequestHandler = async (req, res) => {
 | 
					export const guildTechController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { createNewSession } from "@/src/managers/sessionManager";
 | 
					import { createNewSession } from "../../managers/sessionManager.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { ISession } from "@/src/types/session";
 | 
					import type { ISession } from "../../types/session.ts";
 | 
				
			||||||
import { JSONParse } from "json-with-bigint";
 | 
					import { JSONParse } from "json-with-bigint";
 | 
				
			||||||
import { toOid2, version_compare } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid2, version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hostSessionController: RequestHandler = async (req, res) => {
 | 
					const hostSessionController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,8 @@
 | 
				
			|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { addBooster, getInventory } from "@/src/services/inventoryService";
 | 
					import { addBooster, getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getRandomInt } from "@/src/services/rngService";
 | 
					import { getRandomInt } from "../../services/rngService.ts";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { ExportBoosters } from "warframe-public-export-plus";
 | 
					import { ExportBoosters } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const hubBlessingController: RequestHandler = async (req, res) => {
 | 
					export const hubBlessingController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hubController: RequestHandler = (_req, res) => {
 | 
					const hubController: RequestHandler = (_req, res) => {
 | 
				
			||||||
    res.json("hub 127.0.0.1:6952");
 | 
					    res.json("hub 127.0.0.1:6952");
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hubInstancesController: RequestHandler = (_req, res) => {
 | 
					const hubInstancesController: RequestHandler = (_req, res) => {
 | 
				
			||||||
    res.json("list 50 1 0 0 scenarios 0 0 0 0 0 0");
 | 
					    res.json("list 50 1 0 0 scenarios 0 0 0 0 0 0");
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { Inbox } from "@/src/models/inboxModel";
 | 
					import { Inbox } from "../../models/inboxModel.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    createMessage,
 | 
					    createMessage,
 | 
				
			||||||
    createNewEventMessages,
 | 
					    createNewEventMessages,
 | 
				
			||||||
@ -7,20 +7,20 @@ import {
 | 
				
			|||||||
    deleteMessageRead,
 | 
					    deleteMessageRead,
 | 
				
			||||||
    getAllMessagesSorted,
 | 
					    getAllMessagesSorted,
 | 
				
			||||||
    getMessage
 | 
					    getMessage
 | 
				
			||||||
} from "@/src/services/inboxService";
 | 
					} from "../../services/inboxService.ts";
 | 
				
			||||||
import { getAccountForRequest, getAccountFromSuffixedName, getSuffixedName } from "@/src/services/loginService";
 | 
					import { getAccountForRequest, getAccountFromSuffixedName, getSuffixedName } from "../../services/loginService.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addItems,
 | 
					    addItems,
 | 
				
			||||||
    combineInventoryChanges,
 | 
					    combineInventoryChanges,
 | 
				
			||||||
    getEffectiveAvatarImageType,
 | 
					    getEffectiveAvatarImageType,
 | 
				
			||||||
    getInventory,
 | 
					    getInventory,
 | 
				
			||||||
    updateCurrency
 | 
					    updateCurrency
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "../../services/inventoryService.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { ExportFlavour } from "warframe-public-export-plus";
 | 
					import { ExportFlavour } from "warframe-public-export-plus";
 | 
				
			||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
					import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
 | 
				
			||||||
import { fromStoreItem, isStoreItem } from "@/src/services/itemDataService";
 | 
					import { fromStoreItem, isStoreItem } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const inboxController: RequestHandler = async (req, res) => {
 | 
					export const inboxController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const { deleteId, lastMessage: latestClientMessageId, messageId } = req.query;
 | 
					    const { deleteId, lastMessage: latestClientMessageId, messageId } = req.query;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,25 +1,25 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "../../helpers/stringHelpers.ts";
 | 
				
			||||||
import { getInventory, addMiscItems, updateCurrency, addRecipes, freeUpSlot } from "@/src/services/inventoryService";
 | 
					import { getInventory, addMiscItems, updateCurrency, addRecipes, freeUpSlot } from "../../services/inventoryService.ts";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import type { IOid } from "../../types/commonTypes.ts";
 | 
				
			||||||
import {
 | 
					import type {
 | 
				
			||||||
    IConsumedSuit,
 | 
					    IConsumedSuit,
 | 
				
			||||||
    IHelminthFoodRecord,
 | 
					    IHelminthFoodRecord,
 | 
				
			||||||
    IInventoryClient,
 | 
					    IInventoryClient,
 | 
				
			||||||
    IMiscItem,
 | 
					    IMiscItem
 | 
				
			||||||
    InventorySlot
 | 
					} from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { ExportMisc } from "warframe-public-export-plus";
 | 
					import { ExportMisc } from "warframe-public-export-plus";
 | 
				
			||||||
import { getRecipe } from "@/src/services/itemDataService";
 | 
					import { getRecipe } from "../../services/itemDataService.ts";
 | 
				
			||||||
import { toMongoDate, version_compare } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate, version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { colorToShard } from "@/src/helpers/shardHelper";
 | 
					import { colorToShard } from "../../helpers/shardHelper.ts";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addInfestedFoundryXP,
 | 
					    addInfestedFoundryXP,
 | 
				
			||||||
    applyCheatsToInfestedFoundry,
 | 
					    applyCheatsToInfestedFoundry,
 | 
				
			||||||
    handleSubsumeCompletion
 | 
					    handleSubsumeCompletion
 | 
				
			||||||
} from "@/src/services/infestedFoundryService";
 | 
					} from "../../services/infestedFoundryService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
					export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const account = await getAccountForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user