merge upstream

This commit is contained in:
BanLanGen 2025-08-28 09:31:27 -07:00
commit d47fd344e6
285 changed files with 2154 additions and 2096 deletions

View File

@ -3,3 +3,6 @@
Dockerfile* Dockerfile*
.* .*
docker-data/ docker-data/
node_modules/
static/data/
logs/

View File

@ -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
View File

@ -0,0 +1,3 @@
{
"typescript.preferences.preferTypeOnlyAutoImports": true
}

View File

@ -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"]

View File

@ -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

View File

@ -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

View File

@ -11,7 +11,6 @@
"administratorNames": [], "administratorNames": [],
"autoCreateAccount": true, "autoCreateAccount": true,
"skipTutorial": false, "skipTutorial": false,
"skipAllDialogue": false,
"unlockAllScans": false, "unlockAllScans": false,
"unlockAllShipFeatures": false, "unlockAllShipFeatures": false,
"unlockAllShipDecorations": false, "unlockAllShipDecorations": false,
@ -19,8 +18,6 @@
"unlockAllSkins": false, "unlockAllSkins": false,
"unlockAllCapturaScenes": false, "unlockAllCapturaScenes": false,
"fullyStockedVendors": false, "fullyStockedVendors": false,
"baroAlwaysAvailable": false,
"baroFullyStocked": false,
"unlockAllProfitTakerStages": false, "unlockAllProfitTakerStages": false,
"skipClanKeyCrafting": false, "skipClanKeyCrafting": false,
"noDojoRoomBuildStage": false, "noDojoRoomBuildStage": false,
@ -29,9 +26,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,
@ -45,6 +40,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,
@ -71,10 +70,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

View File

@ -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
View File

@ -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.82", "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.82", "version": "0.5.84",
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.82.tgz", "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.84.tgz",
"integrity": "sha512-hZa9KpMDA2wy0Hn03y9Nfyzbjxer1I6Rvb52b363uzrqS0cvDO56rhiDo71JbraeV34qF6yo+Vca1zwFmw2srA==" "integrity": "sha512-ZpI1Y5CgWDmCwM4/oQpv9u0GD6KFvsJ9f1vJVXYhm5VD9DdOJcFzXgXgg98HXJ5JHbO16ZGIj83117qdpd0RQA=="
}, },
"node_modules/warframe-riven-info": { "node_modules/warframe-riven-info": {
"version": "0.1.2", "version": "0.1.2",

View File

@ -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.82", "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"
} }
} }

View File

@ -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;
}); });

View File

@ -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");
}
}

View File

@ -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();

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => { export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {

View File

@ -5,10 +5,10 @@ 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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const abortDojoComponentController: RequestHandler = async (req, res) => { export const abortDojoComponentController: RequestHandler = async (req, res) => {

View File

@ -1,7 +1,12 @@
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,
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"; import type { RequestHandler } from "express";
export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => { export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {

View File

@ -1,13 +1,13 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportUpgrades } from "warframe-public-export-plus"; import { ExportUpgrades } from "warframe-public-export-plus";

View File

@ -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 { 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 type { IFriendInfo } from "@/src/types/friendTypes"; import type { IFriendInfo } from "../../types/friendTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const addFriendController: RequestHandler = async (req, res) => { export const addFriendController: RequestHandler = async (req, res) => {

View File

@ -1,7 +1,7 @@
import type { 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);

View File

@ -1,8 +1,8 @@
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 type { IFriendInfo } from "@/src/types/friendTypes"; import type { IFriendInfo } from "../../types/friendTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const addIgnoredUserController: RequestHandler = async (req, res) => { export const addIgnoredUserController: RequestHandler = async (req, res) => {

View File

@ -1,11 +1,11 @@
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 type { IFriendInfo } from "@/src/types/friendTypes"; import type { IFriendInfo } from "../../types/friendTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const addPendingFriendController: RequestHandler = async (req, res) => { export const addPendingFriendController: RequestHandler = async (req, res) => {

View File

@ -1,10 +1,10 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportFlavour } from "warframe-public-export-plus"; import { ExportFlavour } from "warframe-public-export-plus";

View File

@ -1,15 +1,15 @@
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 type { IOid } from "@/src/types/commonTypes"; import type { IOid } from "../../types/commonTypes.ts";
import type { IGuildMemberClient } from "@/src/types/guildTypes"; import type { IGuildMemberClient } from "../../types/guildTypes.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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportFlavour } from "warframe-public-export-plus"; import { ExportFlavour } from "warframe-public-export-plus";

View File

@ -1,6 +1,6 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const adoptPetController: RequestHandler = async (req, res) => { export const adoptPetController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const apartmentController: RequestHandler = async (req, res) => { export const apartmentController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
import type { 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 type { 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);

View File

@ -1,8 +1,8 @@
import type { 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 type { 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);

View File

@ -1,9 +1,9 @@
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 type { IUpgradeFromClient } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IUpgradeFromClient } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import type { TRarity } from "warframe-public-export-plus"; import type { TRarity } from "warframe-public-export-plus";
import { ExportBoosterPacks, ExportUpgrades } from "warframe-public-export-plus"; import { ExportBoosterPacks, ExportUpgrades } from "warframe-public-export-plus";

View File

@ -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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import type { 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);

View File

@ -1,8 +1,8 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => { export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => {

View File

@ -1,11 +1,16 @@
import type { 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 type { IDojoComponentDatabase } from "@/src/types/guildTypes"; getGuildForRequestEx,
import { GuildPermission } from "@/src/types/guildTypes"; 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);

View File

@ -1,7 +1,7 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const changeGuildRankController: RequestHandler = async (req, res) => { export const changeGuildRankController: RequestHandler = async (req, res) => {

View File

@ -1,4 +1,4 @@
import { getAccountForRequest } from "@/src/services/loginService"; import { getAccountForRequest } from "../../services/loginService.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const checkDailyMissionBonusController: RequestHandler = async (req, res) => { export const checkDailyMissionBonusController: RequestHandler = async (req, res) => {

View File

@ -2,11 +2,12 @@
//it will claim a recipe for the user //it will claim a recipe for the user
import type { 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 type { 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,244 +18,258 @@ import {
addKubrowPetPrint, addKubrowPetPrint,
addPowerSuit, addPowerSuit,
addEquipment addEquipment
} from "@/src/services/inventoryService"; } from "../../services/inventoryService.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IPendingRecipeDatabase } from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
import { toOid2 } from "@/src/helpers/inventoryHelpers"; import { fromOid, toOid2 } from "../../helpers/inventoryHelpers.ts";
import type { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
import type { IRecipe } from "warframe-public-export-plus"; import type { IRecipe } from "warframe-public-export-plus";
import type { IEquipmentClient } from "@/src/types/equipmentTypes"; import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
import { EquipmentFeatures, Status } from "@/src/types/equipmentTypes"; 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 ( }
inventory.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 });
} }
}; };

View File

@ -1,7 +1,7 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportChallenges } from "warframe-public-export-plus"; import { ExportChallenges } from "warframe-public-export-plus";

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => { export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const clearDialogueHistoryController: RequestHandler = async (req, res) => { export const clearDialogueHistoryController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
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 type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { 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

View File

@ -1,10 +1,10 @@
import type { 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 type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { 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 type { 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);

View File

@ -1,6 +1,6 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const confirmAllianceInvitationController: RequestHandler = async (req, res) => { export const confirmAllianceInvitationController: RequestHandler = async (req, res) => {

View File

@ -1,17 +1,17 @@
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 type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { Types } from "mongoose"; import { Types } from "mongoose";

View File

@ -1,9 +1,9 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { Types } from "mongoose"; import { Types } from "mongoose";

View File

@ -1,6 +1,6 @@
import type { TGuildDatabaseDocument } from "@/src/models/guildModel"; import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
import { GuildMember } from "@/src/models/guildModel"; import { GuildMember } from "../../models/guildModel.ts";
import type { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
import { import {
addGuildMemberMiscItemContribution, addGuildMemberMiscItemContribution,
getDojoClient, getDojoClient,
@ -9,12 +9,12 @@ 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 type { IDojoContributable, IGuildMemberDatabase } from "@/src/types/guildTypes"; import type { IDojoContributable, IGuildMemberDatabase } from "../../types/guildTypes.ts";
import type { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import type { IDojoBuild } from "warframe-public-export-plus"; import type { IDojoBuild } from "warframe-public-export-plus";
import { ExportDojoRecipes } from "warframe-public-export-plus"; import { ExportDojoRecipes } from "warframe-public-export-plus";

View File

@ -1,5 +1,5 @@
import type { TGuildDatabaseDocument, TGuildMemberDatabaseDocument } from "@/src/models/guildModel"; import type { TGuildDatabaseDocument, TGuildMemberDatabaseDocument } from "../../models/guildModel.ts";
import { Alliance, Guild, GuildMember } from "@/src/models/guildModel"; import { Alliance, Guild, GuildMember } from "../../models/guildModel.ts";
import { import {
addGuildMemberMiscItemContribution, addGuildMemberMiscItemContribution,
addGuildMemberShipDecoContribution, addGuildMemberShipDecoContribution,
@ -7,17 +7,17 @@ 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 type { ITypeCount } from "@/src/types/commonTypes"; import type { ITypeCount } from "../../types/commonTypes.ts";
import type { IFusionTreasure, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IFusionTreasure, IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const contributeToVaultController: RequestHandler = async (req, res) => { export const contributeToVaultController: RequestHandler = async (req, res) => {

View File

@ -1,9 +1,9 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const createAllianceController: RequestHandler = async (req, res) => { export const createAllianceController: RequestHandler = async (req, res) => {

View File

@ -1,10 +1,10 @@
import type { 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 type { 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);

View File

@ -1,6 +1,6 @@
import type { 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 = (

View File

@ -1,8 +1,8 @@
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "../../helpers/stringHelpers.ts";
import type { 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 type { ICrewMemberClient } from "@/src/types/inventoryTypes/inventoryTypes"; import type { ICrewMemberClient } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { Types } from "mongoose"; import { Types } from "mongoose";

View File

@ -1,10 +1,10 @@
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 type { IOid } from "@/src/types/commonTypes"; import type { IOid } from "../../types/commonTypes.ts";
import type { ICrewShipComponentFingerprint } from "@/src/types/inventoryTypes/inventoryTypes"; import type { ICrewShipComponentFingerprint } from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus"; import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
@ -81,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;

View File

@ -3,19 +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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import type { import type {
ICrewShipComponentFingerprint, ICrewShipComponentFingerprint,
IInnateDamageFingerprint IInnateDamageFingerprint
} from "@/src/types/inventoryTypes/inventoryTypes"; } 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 type { 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 type { IFingerprintStat } from "@/src/helpers/rivenHelper"; import type { IFingerprintStat } from "../../helpers/rivenHelper.ts";
import type { 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);

View File

@ -1,10 +1,10 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => { export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => {

View File

@ -1,7 +1,7 @@
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 type { IGuildRank } from "@/src/types/guildTypes"; import type { IGuildRank } from "../../types/guildTypes.ts";
import { GuildPermission } from "@/src/types/guildTypes"; import { GuildPermission } from "../../types/guildTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const customizeGuildRanksController: RequestHandler = async (req, res) => { export const customizeGuildRanksController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const declineAllianceInviteController: RequestHandler = async (req, res) => { export const declineAllianceInviteController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const declineGuildInviteController: RequestHandler = async (req, res) => { export const declineGuildInviteController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
import type { 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);

View File

@ -5,11 +5,11 @@ 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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const destroyDojoDecoController: RequestHandler = async (req, res) => { export const destroyDojoDecoController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const divvyAllianceVaultController: RequestHandler = async (req, res) => { export const divvyAllianceVaultController: RequestHandler = async (req, res) => {

View File

@ -1,9 +1,14 @@
import type { TGuildDatabaseDocument } from "@/src/models/guildModel"; import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
import { GuildMember } from "@/src/models/guildModel"; import { GuildMember } from "../../models/guildModel.ts";
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService"; import {
import { getInventory, updateCurrency } from "@/src/services/inventoryService"; getDojoClient,
import { getAccountIdForRequest } from "@/src/services/loginService"; getGuildForRequestEx,
import type { IDojoContributable } from "@/src/types/guildTypes"; hasAccessToDojo,
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 { RequestHandler } from "express";
import type { IDojoBuild } from "warframe-public-export-plus"; import type { IDojoBuild } from "warframe-public-export-plus";
import { ExportDojoRecipes } from "warframe-public-export-plus"; import { ExportDojoRecipes } from "warframe-public-export-plus";

View File

@ -1,11 +1,11 @@
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
import { addMiscItems, getInventory } from "@/src/services/inventoryService"; import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
import { fromStoreItem } from "@/src/services/itemDataService"; import { fromStoreItem } from "../../services/itemDataService.ts";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "../../services/loginService.ts";
import { getRandomInt, getRandomWeightedRewardUc } from "@/src/services/rngService"; import { getRandomInt, getRandomWeightedRewardUc } from "../../services/rngService.ts";
import type { IMongoDate, IOid } from "@/src/types/commonTypes"; import type { IMongoDate, IOid } from "../../types/commonTypes.ts";
import type { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IDroneClient } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus"; import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";

View File

@ -1,14 +1,18 @@
import type { 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 type { IEndlessXpReward, IInventoryClient, TEndlessXpCategory } from "@/src/types/inventoryTypes/inventoryTypes"; import type {
import { logger } from "@/src/utils/logger"; IEndlessXpReward,
IInventoryClient,
TEndlessXpCategory
} from "../../types/inventoryTypes/inventoryTypes.ts";
import { logger } from "../../utils/logger.ts";
import type { ICountedStoreItem } from "warframe-public-export-plus"; import type { ICountedStoreItem } from "warframe-public-export-plus";
import { ExportRewards } from "warframe-public-export-plus"; import { ExportRewards } from "warframe-public-export-plus";
import { getRandomElement } from "@/src/services/rngService"; import { getRandomElement } from "../../services/rngService.ts";
import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; 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);

View File

@ -1,7 +1,7 @@
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, updateEntratiVault } from "@/src/services/inventoryService"; import { getInventory, updateEntratiVault } from "../../services/inventoryService.ts";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "../../services/loginService.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const entratiLabConquestModeController: RequestHandler = async (req, res) => { export const entratiLabConquestModeController: RequestHandler = async (req, res) => {

View File

@ -1,10 +1,10 @@
import type { 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 type { WeaponTypeInternal } from "@/src/services/itemDataService"; import type { WeaponTypeInternal } from "../../services/itemDataService.ts";
import { getRecipe } from "@/src/services/itemDataService"; import { getRecipe } from "../../services/itemDataService.ts";
import { EquipmentFeatures } from "@/src/types/equipmentTypes"; 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);

View File

@ -1,7 +1,7 @@
import type { 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 type { 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;

View File

@ -1,7 +1,7 @@
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 type { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportResources } from "warframe-public-export-plus"; import { ExportResources } from "warframe-public-export-plus";

View File

@ -1,11 +1,11 @@
import type { 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 type { IMiscItem, TFocusPolarity, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IMiscItem, TFocusPolarity, TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
import { logger } from "@/src/utils/logger"; 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);

View File

@ -1,9 +1,9 @@
import type { 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 type { 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;

View File

@ -1,13 +1,13 @@
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 type { IMongoDate } from "@/src/types/commonTypes"; import type { IMongoDate } from "../../types/commonTypes.ts";
import type { IMissionReward } from "@/src/types/missionTypes"; import type { IMissionReward } from "../../types/missionTypes.ts";
import type { IGardeningClient, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes"; import type { IGardeningClient, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { 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";

View File

@ -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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "../../helpers/stringHelpers.ts";
import type { 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.

View File

@ -1,7 +1,7 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getAllianceController: RequestHandler = async (req, res) => { export const getAllianceController: RequestHandler = async (req, res) => {

View File

@ -1,4 +1,4 @@
import { DailyDeal } from "@/src/models/worldStateModel"; import { DailyDeal } from "../../models/worldStateModel.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => { export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
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 type { IFriendInfo } from "@/src/types/friendTypes"; import type { IFriendInfo } from "../../types/friendTypes.ts";
import type { 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

View File

@ -1,7 +1,7 @@
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 type { IGuildMemberClient } from "@/src/types/guildTypes"; import type { IGuildMemberClient } from "../../types/guildTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getGuildContributionsController: RequestHandler = async (req, res) => { export const getGuildContributionsController: RequestHandler = async (req, res) => {

View File

@ -1,9 +1,9 @@
import type { 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);

View File

@ -1,8 +1,8 @@
import type { 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;

View File

@ -1,7 +1,7 @@
import type { 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);

View File

@ -1,8 +1,8 @@
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 type { IMongoDate } from "@/src/types/commonTypes"; import type { IMongoDate } from "../../types/commonTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getGuildLogController: RequestHandler = async (req, res) => { export const getGuildLogController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
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 type { 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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getIgnoredUsersController: RequestHandler = async (req, res) => { export const getIgnoredUsersController: RequestHandler = async (req, res) => {

View File

@ -1,6 +1,6 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getNewRewardSeedController: RequestHandler = async (req, res) => { export const getNewRewardSeedController: RequestHandler = async (req, res) => {

View File

@ -1,9 +1,9 @@
import type { 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 type { 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) => {

View File

@ -1,11 +1,11 @@
import type { 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 type { 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);

View File

@ -1,8 +1,8 @@
import type { 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);

View File

@ -1,8 +1,8 @@
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 type { IVoidTearParticipantInfo } from "@/src/types/requestTypes"; import type { IVoidTearParticipantInfo } from "../../types/requestTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => { export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => {

View File

@ -1,18 +1,18 @@
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 type { IOid } from "@/src/types/commonTypes"; import type { IOid } from "../../types/commonTypes.ts";
import type { IPurchaseParams, IPurchaseResponse } from "@/src/types/purchaseTypes"; import type { IPurchaseParams, IPurchaseResponse } from "../../types/purchaseTypes.ts";
import { PurchaseSource } from "@/src/types/purchaseTypes"; import { PurchaseSource } from "../../types/purchaseTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus"; import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";

View File

@ -1,14 +1,14 @@
import type { 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 type { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes"; import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { 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 type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import type { IEquipmentClient } from "@/src/types/equipmentTypes"; import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
import { EquipmentFeatures } from "@/src/types/equipmentTypes"; import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
interface IGildWeaponRequest { interface IGildWeaponRequest {
ItemName: string; ItemName: string;

View File

@ -1,9 +1,9 @@
import type { 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 type { 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);

View File

@ -1,7 +1,7 @@
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 type { IKeyChainRequest } from "@/src/types/requestTypes"; import type { IKeyChainRequest } from "../../types/requestTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => { export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {

View File

@ -1,7 +1,7 @@
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 type { IOid } from "@/src/types/commonTypes"; import type { IOid } from "../../types/commonTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const giveQuestKeyRewardController: RequestHandler = async (req, res) => { export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {

View File

@ -1,8 +1,8 @@
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 type { ITypeCount } from "@/src/types/commonTypes"; import type { ITypeCount } from "../../types/commonTypes.ts";
import type { ILoreFragmentScan } from "@/src/types/inventoryTypes/inventoryTypes"; import type { ILoreFragmentScan } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const giveShipDecoAndLoreFragmentController: RequestHandler = async (req, res) => { export const giveShipDecoAndLoreFragmentController: RequestHandler = async (req, res) => {

View File

@ -1,7 +1,7 @@
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 type { TPartialStartingGear } from "@/src/types/inventoryTypes/inventoryTypes"; import type { TPartialStartingGear } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
export const giveStartingGearController: RequestHandler = async (req, res) => { export const giveStartingGearController: RequestHandler = async (req, res) => {

View File

@ -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,17 +24,17 @@ import {
getInventory, getInventory,
occupySlot, occupySlot,
updateCurrency updateCurrency
} from "@/src/services/inventoryService"; } from "../../services/inventoryService.ts";
import type { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IInventoryChanges } from "@/src/types/purchaseTypes"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
import { config } from "@/src/services/configService"; import { config } from "../../services/configService.ts";
import type { ITechProjectClient } from "@/src/types/guildTypes"; import type { ITechProjectClient } from "../../types/guildTypes.ts";
import { GuildPermission } from "@/src/types/guildTypes"; import { GuildPermission } from "../../types/guildTypes.ts";
import { GuildMember } from "@/src/models/guildModel"; import { GuildMember } from "../../models/guildModel.ts";
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
import { logger } from "@/src/utils/logger"; import { logger } from "../../utils/logger.ts";
import type { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; 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);

View File

@ -1,10 +1,10 @@
import type { 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 type { 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);

View File

@ -1,7 +1,7 @@
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 type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { ExportBoosters } from "warframe-public-export-plus"; import { ExportBoosters } from "warframe-public-export-plus";

View File

@ -1,5 +1,5 @@
import type { 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 type { 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;

View File

@ -1,25 +1,25 @@
import type { 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 type { IOid } from "@/src/types/commonTypes"; import type { IOid } from "../../types/commonTypes.ts";
import type { import type {
IConsumedSuit, IConsumedSuit,
IHelminthFoodRecord, IHelminthFoodRecord,
IInventoryClient, IInventoryClient,
IMiscItem IMiscItem
} from "@/src/types/inventoryTypes/inventoryTypes"; } from "../../types/inventoryTypes/inventoryTypes.ts";
import { InventorySlot } 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);

View File

@ -1,17 +1,17 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { getAccountForRequest } from "@/src/services/loginService"; import { getAccountForRequest } from "../../services/loginService.ts";
import type { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
import { Inventory } from "@/src/models/inventoryModels/inventoryModel"; import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
import { config } from "@/src/services/configService"; import { config } from "../../services/configService.ts";
import allDialogue from "@/static/fixed_responses/allDialogue.json"; import allDialogue from "../../../static/fixed_responses/allDialogue.json" with { type: "json" };
import type { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import type { ILoadoutDatabase } from "../../types/saveLoadoutTypes.ts";
import type { IInventoryClient, IShipInventory } from "@/src/types/inventoryTypes/inventoryTypes"; import type { IInventoryClient, IShipInventory } from "../../types/inventoryTypes/inventoryTypes.ts";
import { equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes"; import { equipmentKeys } from "../../types/inventoryTypes/inventoryTypes.ts";
import type { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import type { IPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
import { ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { ArtifactPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
import type { ICountedItem } from "warframe-public-export-plus"; import type { ICountedItem } from "warframe-public-export-plus";
import { eFaction, ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus"; import { eFaction, ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus";
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService"; import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "../../services/infestedFoundryService.ts";
import { import {
addEmailItem, addEmailItem,
addItem, addItem,
@ -21,22 +21,22 @@ import {
cleanupInventory, cleanupInventory,
createLibraryDailyTask, createLibraryDailyTask,
getCalendarProgress getCalendarProgress
} from "@/src/services/inventoryService"; } from "../../services/inventoryService.ts";
import { logger } from "@/src/utils/logger"; import { logger } from "../../utils/logger.ts";
import { addString, catBreadHash } from "@/src/helpers/stringHelpers"; import { addString, catBreadHash } from "../../helpers/stringHelpers.ts";
import { Types } from "mongoose"; import { Types } from "mongoose";
import { getNemesisManifest } from "@/src/helpers/nemesisHelpers"; import { getNemesisManifest } from "../../helpers/nemesisHelpers.ts";
import { getPersonalRooms } from "@/src/services/personalRoomsService"; import { getPersonalRooms } from "../../services/personalRoomsService.ts";
import type { IPersonalRoomsClient } from "@/src/types/personalRoomsTypes"; import type { IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
import { Ship } from "@/src/models/shipModel"; import { Ship } from "../../models/shipModel.ts";
import { toLegacyOid, toOid, version_compare } from "@/src/helpers/inventoryHelpers"; import { toLegacyOid, toOid, version_compare } from "../../helpers/inventoryHelpers.ts";
import { Inbox } from "@/src/models/inboxModel"; import { Inbox } from "../../models/inboxModel.ts";
import { unixTimesInMs } from "@/src/constants/timeConstants"; import { unixTimesInMs } from "../../constants/timeConstants.ts";
import { DailyDeal } from "@/src/models/worldStateModel"; import { DailyDeal } from "../../models/worldStateModel.ts";
import { EquipmentFeatures } from "@/src/types/equipmentTypes"; import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
import { generateRewardSeed } from "@/src/services/rngService"; import { generateRewardSeed } from "../../services/rngService.ts";
import { getInvasionByOid, getWorldState } from "@/src/services/worldStateService"; import { getInvasionByOid, getWorldState } from "../../services/worldStateService.ts";
import { createMessage } from "@/src/services/inboxService"; import { createMessage } from "../../services/inboxService.ts";
export const inventoryController: RequestHandler = async (request, response) => { export const inventoryController: RequestHandler = async (request, response) => {
const account = await getAccountForRequest(request); const account = await getAccountForRequest(request);
@ -306,7 +306,7 @@ export const getInventoryResponse = async (
inventoryResponse.PrimeTokens = 999999999; inventoryResponse.PrimeTokens = 999999999;
} }
if (config.skipAllDialogue) { if (inventory.skipAllDialogue) {
inventoryResponse.TauntHistory = [ inventoryResponse.TauntHistory = [
{ {
node: "TreasureTutorial", node: "TreasureTutorial",

View File

@ -1,8 +1,8 @@
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "../../services/loginService.ts";
import { getInventory, updateCurrency, updateSlots } from "@/src/services/inventoryService"; import { getInventory, updateCurrency, updateSlots } from "../../services/inventoryService.ts";
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes"; import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
import { exhaustive } from "@/src/utils/ts-utils"; import { exhaustive } from "../../utils/ts-utils.ts";
/* /*
loadout slots are additionally purchased slots only loadout slots are additionally purchased slots only

View File

@ -1,6 +1,6 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { getSessionByID } from "@/src/managers/sessionManager"; import { getSessionByID } from "../../managers/sessionManager.ts";
import { logger } from "@/src/utils/logger"; import { logger } from "../../utils/logger.ts";
export const joinSessionController: RequestHandler = (req, res) => { export const joinSessionController: RequestHandler = (req, res) => {
const reqBody = JSON.parse(String(req.body)) as IJoinSessionRequest; const reqBody = JSON.parse(String(req.body)) as IJoinSessionRequest;

View File

@ -1,14 +1,14 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { config } from "@/src/services/configService"; import { config } from "../../services/configService.ts";
import { buildConfig } from "@/src/services/buildConfigService"; import { buildConfig } from "../../services/buildConfigService.ts";
import { Account } from "@/src/models/loginModel"; import { Account } from "../../models/loginModel.ts";
import { createAccount, createNonce, getUsernameFromEmail, isCorrectPassword } from "@/src/services/loginService"; import { createAccount, createNonce, getUsernameFromEmail, isCorrectPassword } from "../../services/loginService.ts";
import type { IDatabaseAccountJson, ILoginRequest, ILoginResponse } from "@/src/types/loginTypes"; import type { IDatabaseAccountJson, ILoginRequest, ILoginResponse } from "../../types/loginTypes.ts";
import { logger } from "@/src/utils/logger"; import { logger } from "../../utils/logger.ts";
import { version_compare } from "@/src/helpers/inventoryHelpers"; import { version_compare } from "../../helpers/inventoryHelpers.ts";
import { sendWsBroadcastTo } from "@/src/services/wsService"; import { sendWsBroadcastTo } from "../../services/wsService.ts";
export const loginController: RequestHandler = async (request, response) => { export const loginController: RequestHandler = async (request, response) => {
const loginRequest = JSON.parse(String(request.body)) as ILoginRequest; // parse octet stream of json data to json object const loginRequest = JSON.parse(String(request.body)) as ILoginRequest; // parse octet stream of json data to json object
@ -140,7 +140,11 @@ const createLoginResponse = (
resp.MatchmakingBuildId = buildConfig.matchmakingBuildId; resp.MatchmakingBuildId = buildConfig.matchmakingBuildId;
} }
if (version_compare(buildLabel, "2023.04.25.23.40") >= 0) { if (version_compare(buildLabel, "2023.04.25.23.40") >= 0) {
resp.platformCDNs = [`${myUrlBase}/`]; if (version_compare(buildLabel, "2025.08.26.09.49") >= 0) {
resp.platformCDNs = [`${myUrlBase}/dynamic/`];
} else {
resp.platformCDNs = [`${myUrlBase}/`];
}
} }
return resp; return resp;
}; };

View File

@ -1,15 +1,14 @@
import type { RequestHandler } from "express"; import type { RequestHandler } from "express";
import { getAccountForRequest } from "@/src/services/loginService"; import { getAccountForRequest } from "../../services/loginService.ts";
import type { ILoginRewardsReponse } from "@/src/services/loginRewardService"; import type { ILoginRewardsReponse } from "../../services/loginRewardService.ts";
import { import {
claimLoginReward, claimLoginReward,
getRandomLoginRewards, getRandomLoginRewards,
isLoginRewardAChoice, isLoginRewardAChoice,
setAccountGotLoginRewardToday setAccountGotLoginRewardToday
} from "@/src/services/loginRewardService"; } from "../../services/loginRewardService.ts";
import { getInventory } from "@/src/services/inventoryService"; import { getInventory } from "../../services/inventoryService.ts";
import { config } from "@/src/services/configService"; import { sendWsBroadcastTo } from "../../services/wsService.ts";
import { sendWsBroadcastTo } from "@/src/services/wsService";
export const loginRewardsController: RequestHandler = async (req, res) => { export const loginRewardsController: RequestHandler = async (req, res) => {
const account = await getAccountForRequest(req); const account = await getAccountForRequest(req);
@ -17,41 +16,42 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
const isMilestoneDay = account.LoginDays == 5 || account.LoginDays % 50 == 0; const isMilestoneDay = account.LoginDays == 5 || account.LoginDays % 50 == 0;
const nextMilestoneDay = account.LoginDays < 5 ? 5 : (Math.trunc(account.LoginDays / 50) + 1) * 50; const nextMilestoneDay = account.LoginDays < 5 ? 5 : (Math.trunc(account.LoginDays / 50) + 1) * 50;
if (today == account.LastLoginRewardDate || config.disableDailyTribute) { if (today != account.LastLoginRewardDate) {
res.json({ const inventory = await getInventory(account._id.toString());
DailyTributeInfo: { if (!inventory.disableDailyTribute) {
IsMilestoneDay: isMilestoneDay, const randomRewards = getRandomLoginRewards(account, inventory);
IsChooseRewardSet: isLoginRewardAChoice(account), const response: ILoginRewardsReponse = {
LoginDays: account.LoginDays, DailyTributeInfo: {
NextMilestoneReward: "", Rewards: randomRewards,
NextMilestoneDay: nextMilestoneDay IsMilestoneDay: isMilestoneDay,
} IsChooseRewardSet: randomRewards.length != 1,
} satisfies ILoginRewardsReponse); LoginDays: account.LoginDays,
return; NextMilestoneReward: "",
} NextMilestoneDay: nextMilestoneDay,
HasChosenReward: false
},
LastLoginRewardDate: today
};
if (!isMilestoneDay && randomRewards.length == 1) {
response.DailyTributeInfo.HasChosenReward = true;
response.DailyTributeInfo.ChosenReward = randomRewards[0];
response.DailyTributeInfo.NewInventory = await claimLoginReward(inventory, randomRewards[0]);
setAccountGotLoginRewardToday(account);
await Promise.all([inventory.save(), account.save()]);
const inventory = await getInventory(account._id.toString()); sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
const randomRewards = getRandomLoginRewards(account, inventory); }
const response: ILoginRewardsReponse = { res.json(response);
return;
}
}
res.json({
DailyTributeInfo: { DailyTributeInfo: {
Rewards: randomRewards,
IsMilestoneDay: isMilestoneDay, IsMilestoneDay: isMilestoneDay,
IsChooseRewardSet: randomRewards.length != 1, IsChooseRewardSet: isLoginRewardAChoice(account),
LoginDays: account.LoginDays, LoginDays: account.LoginDays,
NextMilestoneReward: "", NextMilestoneReward: "",
NextMilestoneDay: nextMilestoneDay, NextMilestoneDay: nextMilestoneDay
HasChosenReward: false }
}, } satisfies ILoginRewardsReponse);
LastLoginRewardDate: today
};
if (!isMilestoneDay && randomRewards.length == 1) {
response.DailyTributeInfo.HasChosenReward = true;
response.DailyTributeInfo.ChosenReward = randomRewards[0];
response.DailyTributeInfo.NewInventory = await claimLoginReward(inventory, randomRewards[0]);
setAccountGotLoginRewardToday(account);
await Promise.all([inventory.save(), account.save()]);
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
}
res.json(response);
}; };

Some files were not shown because too many files have changed in this diff Show More