Compare commits
221 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8bce83d14c | |||
| cc5682760d | |||
| 00acaed62a | |||
| d794bd94ce | |||
| cecc65197b | |||
| b1c1b56de3 | |||
| 167da9c573 | |||
| 5e6955ae32 | |||
| f2145ed91b | |||
| 20d9a699b4 | |||
| 2b054d1728 | |||
| 5ac73528a0 | |||
| 678ad0c4a1 | |||
| 4bdb759463 | |||
| 71be8a2868 | |||
| f3072e84c9 | |||
| b2749765a3 | |||
| 654652b889 | |||
| e3048ea188 | |||
| bb1d6a98c5 | |||
| c3bf0ae7c7 | |||
| 3a72617a0f | |||
| 3ae535ccbc | |||
| 23abe5de02 | |||
| 0d21c73ab7 | |||
| 482101ccd0 | |||
| 60e87543aa | |||
| c4c17f24d7 | |||
| 43fa1978c0 | |||
| 18fafc38b5 | |||
| 98a46e51de | |||
| 2a7767ef4a | |||
| e867123f89 | |||
| 2322a994c6 | |||
| be8e2feae6 | |||
| 4f8b07322e | |||
| 4b3b1969da | |||
| a0ce110e7e | |||
| 7fe00da2a4 | |||
| bac23a8465 | |||
| db112ee5ed | |||
| 86998b6760 | |||
| be3dd7ab66 | |||
| e6fb675e21 | |||
| fb4c42490e | |||
| 96a15e25df | |||
| ff234c9874 | |||
| 7d3915fe05 | |||
| 4b3e2dfc62 | |||
| 737d013655 | |||
| 1f8d437fad | |||
| 9263b8f179 | |||
| 875f4b9fa4 | |||
| fd7ddd9696 | |||
| 065afc0089 | |||
| c1c14b2068 | |||
| 9e66d22256 | |||
| 02f0935710 | |||
| af4c3a93ce | |||
| 4141970530 | |||
| ca589cb7cf | |||
| d6ed22d1ff | |||
| 610a432e46 | |||
| 2ca895a5f8 | |||
| fd2286c253 | |||
| 5a582daa1a | |||
| 6a571e5e78 | |||
| 0349c4a32c | |||
| e1563bf298 | |||
| af6f422fec | |||
| f5c1b83598 | |||
| 30f380f37e | |||
| 0f7a85db59 | |||
| 43bc12713a | |||
| 6022bf97b5 | |||
| 159e151dc0 | |||
| 56954260c8 | |||
| c535044af8 | |||
| f5146be129 | |||
| d38ec06ed6 | |||
| 060f65900f | |||
| 66d3057d40 | |||
| b14a5925df | |||
| 9da47c406a | |||
| 09065bdb4e | |||
| 8f04fc5fdf | |||
| 230ee5f638 | |||
| 21db6ce265 | |||
| 1ecf53c96b | |||
| e67ef63b77 | |||
| 5772ebe746 | |||
| 0136e4d152 | |||
| 8b3ee4b4f5 | |||
| 6e8800f048 | |||
| d65a667acd | |||
| c6a3e86d2b | |||
| a8e41c95e7 | |||
| 9426359370 | |||
| e5247700df | |||
| 1c3f1e2276 | |||
| 7710e7c13f | |||
| a64c5ea3c1 | |||
| 17e1eb86dd | |||
| de9dfb3d71 | |||
| fc38f818dd | |||
| e76f08db89 | |||
| 7bcb5f21ce | |||
| 3641d63f6f | |||
| 71c4835a69 | |||
| 86a63ace41 | |||
| 32c95b6715 | |||
| 6f8b14fb2d | |||
| 3d8aa60838 | |||
| 87da94658d | |||
| 05fbefa7f4 | |||
| a2abf6db8f | |||
| 64a1c8b276 | |||
| 4fa07a1319 | |||
| a3cc7d9f92 | |||
| c47c60fdcc | |||
| 367455baaa | |||
| 6c2b7a61e2 | |||
| 6a6683fb25 | |||
| e3b6accb5d | |||
| 7e437d75bf | |||
| 62570177b6 | |||
| d2aff211c6 | |||
| 791ae389d8 | |||
| d027e7f26e | |||
| cd6ce61b80 | |||
| a5be29159f | |||
| f099b64ef4 | |||
| c4f348c252 | |||
| 0d388b4b0f | |||
| d64531f4b2 | |||
| 01b8f7acf3 | |||
| 8a7db2cd85 | |||
| 5a9415ae0c | |||
| 39f898cd30 | |||
| 9c55a8a4aa | |||
| 253ae09f24 | |||
| 703e9007b0 | |||
| 3e555b1753 | |||
| 1066b4a983 | |||
| b9a2cea862 | |||
| 0342f52359 | |||
| ea9012bd56 | |||
| 13400b6d83 | |||
| 8d57eda9d2 | |||
| 6b66cb495b | |||
| f4f7ed00d1 | |||
| 18556cb2f5 | |||
| 648af9ae18 | |||
| e16da9da44 | |||
| 4d8dbd99aa | |||
| 0a3f9549a9 | |||
| 2cfb21b98e | |||
| 3fedc701f1 | |||
| ed596aa3f3 | |||
| e2349b361e | |||
| 9221178522 | |||
| 9a5c2ab4a4 | |||
| d4c477769a | |||
| 6de9f0dcdb | |||
| 9662da00de | |||
| 662d824369 | |||
| a0bac12e95 | |||
| e98cb2ec24 | |||
| b5c6c3e485 | |||
| fa65ba3f25 | |||
| 0c54c064eb | |||
| b4e789bf0d | |||
| 9add016d7b | |||
| a2171c80a5 | |||
| 5a2fa2c2c3 | |||
| 4b2b184b8f | |||
| dc401de1e9 | |||
| 1439fdc083 | |||
| 6771a129f5 | |||
| f13de810e5 | |||
| c52f7dcedc | |||
| 0bf142ed50 | |||
| 0d791ad145 | |||
| 5396eefe75 | |||
| a9a197b005 | |||
| 1ade801e7c | |||
| c9cc1fa089 | |||
| 287acab892 | |||
| 30398021b3 | |||
| 15578b04d2 | |||
| 9d034824f7 | |||
| 8b8d66ab2e | |||
| 78b8cf4c77 | |||
| 1ead04ddc1 | |||
| c97c22b434 | |||
| d7a93463c0 | |||
| f6b73e58da | |||
| 28b8fb3e78 | |||
| 895e76b45e | |||
| 71d0c140ae | |||
| f06a3b8187 | |||
| ffcbbb480b | |||
| dfd1fb834b | |||
| 2c43d897c0 | |||
| 217eb1f61b | |||
| 5e1ff64cca | |||
| 9c232bfc1f | |||
| 9e73fc7fb1 | |||
| 03b8b610db | |||
| 4b46938dab | |||
| 6230f52f27 | |||
| 460cb20af7 | |||
| 1e4007f6da | |||
| 7dc44e81ec | |||
| bfc4048721 | |||
| 7174848588 | |||
| a5b667c331 | |||
| 9b6abff2be | |||
| 7c7f37e46b | |||
| 52a560bef2 | |||
| 369794dcdb |
@ -3,3 +3,6 @@
|
|||||||
Dockerfile*
|
Dockerfile*
|
||||||
.*
|
.*
|
||||||
docker-data/
|
docker-data/
|
||||||
|
node_modules/
|
||||||
|
static/data/
|
||||||
|
logs/
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
"node": true
|
"node": true
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"@typescript-eslint/consistent-type-imports": "error",
|
||||||
"@typescript-eslint/explicit-function-return-type": "error",
|
"@typescript-eslint/explicit-function-return-type": "error",
|
||||||
"@typescript-eslint/restrict-template-expressions": "error",
|
"@typescript-eslint/restrict-template-expressions": "error",
|
||||||
"@typescript-eslint/restrict-plus-operands": "error",
|
"@typescript-eslint/restrict-plus-operands": "error",
|
||||||
@ -30,7 +31,8 @@
|
|||||||
"no-mixed-spaces-and-tabs": "error",
|
"no-mixed-spaces-and-tabs": "error",
|
||||||
"@typescript-eslint/require-await": "error",
|
"@typescript-eslint/require-await": "error",
|
||||||
"import/no-named-as-default-member": "off",
|
"import/no-named-as-default-member": "off",
|
||||||
"import/no-cycle": "warn"
|
"import/no-cycle": "warn",
|
||||||
|
"@typescript-eslint/no-deprecated": "warn"
|
||||||
},
|
},
|
||||||
"parser": "@typescript-eslint/parser",
|
"parser": "@typescript-eslint/parser",
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
|
|||||||
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@ -12,14 +12,13 @@ jobs:
|
|||||||
- name: Setup Node.js environment
|
- name: Setup Node.js environment
|
||||||
uses: actions/setup-node@v4.0.2
|
uses: actions/setup-node@v4.0.2
|
||||||
with:
|
with:
|
||||||
node-version: ">=20.6.0"
|
node-version: ">=20.18.1"
|
||||||
- run: npm ci
|
- run: npm ci
|
||||||
- run: cp config-vanilla.json config.json
|
- run: cp config-vanilla.json config.json
|
||||||
- run: npm run verify
|
- run: npm run verify
|
||||||
- run: npm run lint:ci
|
- run: npm run lint:ci
|
||||||
- run: npm run prettier
|
- run: npm run prettier
|
||||||
- run: npm run update-translations
|
- run: npm run update-translations
|
||||||
- run: npm run fix-imports
|
|
||||||
- name: Fail if there are uncommitted changes
|
- name: Fail if there are uncommitted changes
|
||||||
run: |
|
run: |
|
||||||
if [[ -n "$(git status --porcelain)" ]]; then
|
if [[ -n "$(git status --porcelain)" ]]; then
|
||||||
|
|||||||
25
.github/workflows/docker.yml
vendored
25
.github/workflows/docker.yml
vendored
@ -4,9 +4,9 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
jobs:
|
jobs:
|
||||||
docker-amd64:
|
docker:
|
||||||
if: github.repository == 'OpenWF/SpaceNinjaServer'
|
if: github.repository == 'OpenWF/SpaceNinjaServer'
|
||||||
runs-on: amd64
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Docker buildx
|
- name: Set up Docker buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
@ -18,27 +18,10 @@ jobs:
|
|||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
platforms: linux/amd64
|
platforms: linux/arm64,linux/amd64
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
openwf/spaceninjaserver:latest
|
openwf/spaceninjaserver:latest
|
||||||
openwf/spaceninjaserver:${{ github.sha }}
|
|
||||||
docker-arm64:
|
|
||||||
if: github.repository == 'OpenWF/SpaceNinjaServer'
|
|
||||||
runs-on: arm64
|
|
||||||
steps:
|
|
||||||
- name: Set up Docker buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Log in to container registry
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: openwf
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
- name: Build and push
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
platforms: linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: |
|
|
||||||
openwf/spaceninjaserver:latest-arm64
|
openwf/spaceninjaserver:latest-arm64
|
||||||
|
openwf/spaceninjaserver:${{ github.sha }}
|
||||||
openwf/spaceninjaserver:${{ github.sha }}-arm64
|
openwf/spaceninjaserver:${{ github.sha }}-arm64
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"typescript.preferences.preferTypeOnlyAutoImports": true
|
||||||
|
}
|
||||||
17
AGENTS.md
17
AGENTS.md
@ -1,17 +0,0 @@
|
|||||||
## In General
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
Use `npm i` or `npm ci` to install all dependencies.
|
|
||||||
|
|
||||||
### Testing
|
|
||||||
|
|
||||||
Use `npm run verify` to verify that your changes pass TypeScript's checks.
|
|
||||||
|
|
||||||
### Formatting
|
|
||||||
|
|
||||||
Use `npm run prettier` to ensure your formatting matches the expected format. Failing to do so will cause CI failure.
|
|
||||||
|
|
||||||
## WebUI Specific
|
|
||||||
|
|
||||||
The translation system is designed around additions being made to `static/webui/translations/en.js`. They are copied over for translation via `npm run update-translations`. DO NOT produce non-English strings; we want them to be translated by humans who can understand the full context.
|
|
||||||
19
CONTRIBUTING.md
Normal file
19
CONTRIBUTING.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
## In General
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
Use `npm i` or `npm ci` to install all dependencies, including dev dependencies.
|
||||||
|
|
||||||
|
## Development Process
|
||||||
|
|
||||||
|
Auto reloading is supported for server and WebUI development. Simply use `npm run dev` or `npm run dev:bun` to start the server and edit away.
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
Before submitting a PR:
|
||||||
|
- Use `npm run verify` to verify that the code is type-safe.
|
||||||
|
- Use `npm run fix` to fix formatting issues as well as be informed of any unfixable issues. Avoid introducing new warnings.
|
||||||
|
|
||||||
|
## WebUI Specific
|
||||||
|
|
||||||
|
The translation system is designed around additions being made to `static/webui/translations/en.js`. They are copied over for translation via `npm run update-translations`. DO NOT provide translations generated by AI or other automated tools.
|
||||||
@ -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"]
|
||||||
|
|||||||
@ -6,18 +6,21 @@ More information for the moment here: [https://discord.gg/PNNZ3asUuY](https://di
|
|||||||
|
|
||||||
This project is in active development at <https://onlyg.it/OpenWF/SpaceNinjaServer>.
|
This project is in active development at <https://onlyg.it/OpenWF/SpaceNinjaServer>.
|
||||||
|
|
||||||
To get an idea of what functionality you can expect to be missing [have a look through the issues](https://onlyg.it/OpenWF/SpaceNinjaServer/issues?q=&type=all&state=open&labels=-4%2C-10&milestone=0&assignee=0&poster=). However, many things have been implemented and *should* work as expected. Please open an issue for anything where that's not the case and/or the server is reporting errors.
|
To get an idea of what functionality you can expect to be missing [have a look through the issues](https://onlyg.it/OpenWF/SpaceNinjaServer/issues). However, many things have been implemented and *should* work as expected. Please open an issue for anything where that's not the case and/or the server is reporting errors.
|
||||||
|
|
||||||
## config.json
|
## config.json
|
||||||
|
|
||||||
SpaceNinjaServer requires a `config.json`. To set it up, you can copy the [config-vanilla.json](config-vanilla.json), which has most cheats disabled.
|
SpaceNinjaServer requires a `config.json`. To set it up, you can copy the [config-vanilla.json](config-vanilla.json), which has most cheats disabled.
|
||||||
|
|
||||||
|
- `skipTutorial` affects only newly created accounts, so you may wish to change it before logging in for the first time.
|
||||||
- `logger.level` can be `fatal`, `error`, `warn`, `info`, `http`, `debug`, or `trace`.
|
- `logger.level` can be `fatal`, `error`, `warn`, `info`, `http`, `debug`, or `trace`.
|
||||||
- `myIrcAddresses` can be used to point to an IRC server. If not provided, defaults to `[ myAddress ]`.
|
- `ircExecutable` can be provided with a relative path to an EXE which will be ran as a child process of SpaceNinjaServer.
|
||||||
|
- `ircAddress`, `hubAddress`, and `nrsAddress` can be provided if these secondary servers are on a different machine.
|
||||||
- `worldState.eidolonOverride` can be set to `day` or `night` to lock the time to day/fass and night/vome on Plains of Eidolon/Cambion Drift.
|
- `worldState.eidolonOverride` can be set to `day` or `night` to lock the time to day/fass and night/vome on Plains of Eidolon/Cambion Drift.
|
||||||
- `worldState.vallisOverride` can be set to `warm` or `cold` to lock the temperature on Orb Vallis.
|
- `worldState.vallisOverride` can be set to `warm` or `cold` to lock the temperature on Orb Vallis.
|
||||||
- `worldState.duviriOverride` can be set to `joy`, `anger`, `envy`, `sorrow`, or `fear` to lock the Duviri spiral.
|
- `worldState.duviriOverride` can be set to `joy`, `anger`, `envy`, `sorrow`, or `fear` to lock the Duviri spiral.
|
||||||
- `worldState.nightwaveOverride` will lock the nightwave season, assuming the client is new enough for it. Valid values:
|
- `worldState.nightwaveOverride` will lock the nightwave season, assuming the client is new enough for it. Valid values:
|
||||||
|
- `RadioLegionIntermission14Syndicate` for Nora's Mix: Dreams of the Dead
|
||||||
- `RadioLegionIntermission13Syndicate` for Nora's Mix Vol. 9
|
- `RadioLegionIntermission13Syndicate` for Nora's Mix Vol. 9
|
||||||
- `RadioLegionIntermission12Syndicate` for Nora's Mix Vol. 8
|
- `RadioLegionIntermission12Syndicate` for Nora's Mix Vol. 8
|
||||||
- `RadioLegionIntermission11Syndicate` for Nora's Mix Vol. 7
|
- `RadioLegionIntermission11Syndicate` for Nora's Mix Vol. 7
|
||||||
@ -34,5 +37,5 @@ SpaceNinjaServer requires a `config.json`. To set it up, you can copy the [confi
|
|||||||
- `RadioLegion2Syndicate` for The Emissary
|
- `RadioLegion2Syndicate` for The Emissary
|
||||||
- `RadioLegionIntermissionSyndicate` for Intermission I
|
- `RadioLegionIntermissionSyndicate` for Intermission I
|
||||||
- `RadioLegionSyndicate` for The Wolf of Saturn Six
|
- `RadioLegionSyndicate` for The Wolf of Saturn Six
|
||||||
- `allTheFissures` can be set to `normal` or `hard` to enable all fissures either in normal or steel path, respectively.
|
- `worldState.allTheFissures` can be set to `normal` or `hard` to enable all fissures either in normal or steel path, respectively.
|
||||||
- `worldState.circuitGameModes` can be set to an array of game modes which will override the otherwise-random pattern in The Circuit. Valid element values are `Survival`, `VoidFlood`, `Excavation`, `Defense`, `Exterminate`, `Assassination`, and `Alchemy`.
|
- `worldState.circuitGameModes` can be set to an array of game modes which will override the otherwise-random pattern in The Circuit. Valid element values are `Survival`, `VoidFlood`, `Excavation`, `Defense`, `Exterminate`, `Assassination`, and `Alchemy`.
|
||||||
|
|||||||
@ -2,24 +2,32 @@
|
|||||||
|
|
||||||
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
|
||||||
|
git checkout -f origin/main
|
||||||
|
|
||||||
|
if exist static\data\0\ (
|
||||||
|
echo Updating stripped assets...
|
||||||
|
cd static\data\0\
|
||||||
|
git pull
|
||||||
|
cd ..\..\..\
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Updating dependencies...
|
||||||
|
node scripts/raw-precheck.js > NUL
|
||||||
|
if %errorlevel% == 0 (
|
||||||
|
call npm i --omit=dev --omit=optional
|
||||||
|
call npm run raw
|
||||||
|
) else (
|
||||||
|
call npm i --omit=dev
|
||||||
|
call npm run build
|
||||||
|
if %errorlevel% == 0 (
|
||||||
|
call npm run start
|
||||||
|
)
|
||||||
|
)
|
||||||
echo SpaceNinjaServer seems to have crashed.
|
echo SpaceNinjaServer seems to have crashed.
|
||||||
)
|
)
|
||||||
|
|
||||||
:a
|
:a
|
||||||
pause > nul
|
pause > nul
|
||||||
goto a
|
goto a
|
||||||
|
|||||||
@ -2,22 +2,28 @@
|
|||||||
|
|
||||||
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
|
||||||
|
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..."
|
||||||
|
node scripts/raw-precheck.js > /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
npm i --omit=dev --omit=optional
|
||||||
|
npm run raw
|
||||||
|
else
|
||||||
|
npm i --omit=dev
|
||||||
|
npm run build
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
npm run start
|
||||||
|
fi
|
||||||
|
fi
|
||||||
echo "SpaceNinjaServer seems to have crashed."
|
echo "SpaceNinjaServer seems to have crashed."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@ -5,58 +5,19 @@
|
|||||||
"level": "trace"
|
"level": "trace"
|
||||||
},
|
},
|
||||||
"myAddress": "localhost",
|
"myAddress": "localhost",
|
||||||
|
"bindAddress": "0.0.0.0",
|
||||||
"httpPort": 80,
|
"httpPort": 80,
|
||||||
"httpsPort": 443,
|
"httpsPort": 443,
|
||||||
"NRS": ["localhost"],
|
"ircExecutable": null,
|
||||||
|
"ircAddress": null,
|
||||||
|
"hubAddress": null,
|
||||||
|
"nrsAddress": null,
|
||||||
"administratorNames": [],
|
"administratorNames": [],
|
||||||
"autoCreateAccount": true,
|
"autoCreateAccount": true,
|
||||||
"skipTutorial": false,
|
"skipTutorial": false,
|
||||||
"skipAllDialogue": false,
|
|
||||||
"unlockAllScans": false,
|
|
||||||
"claimingBlueprintRefundsIngredients": false,
|
|
||||||
"dontSubtractPurchaseCreditCost": false,
|
|
||||||
"dontSubtractPurchasePlatinumCost": false,
|
|
||||||
"dontSubtractPurchaseItemCost": false,
|
|
||||||
"dontSubtractPurchaseStandingCost": false,
|
|
||||||
"dontSubtractVoidTraces": false,
|
|
||||||
"dontSubtractConsumables": false,
|
|
||||||
"unlockAllShipFeatures": false,
|
|
||||||
"unlockAllShipDecorations": false,
|
|
||||||
"unlockAllFlavourItems": false,
|
|
||||||
"unlockAllSkins": false,
|
"unlockAllSkins": false,
|
||||||
"unlockAllCapturaScenes": false,
|
|
||||||
"universalPolarityEverywhere": false,
|
|
||||||
"unlockDoubleCapacityPotatoesEverywhere": false,
|
|
||||||
"unlockExilusEverywhere": false,
|
|
||||||
"unlockArcanesEverywhere": false,
|
|
||||||
"noDailyStandingLimits": false,
|
|
||||||
"noDailyFocusLimit": false,
|
|
||||||
"noArgonCrystalDecay": false,
|
|
||||||
"noMasteryRankUpCooldown": false,
|
|
||||||
"noVendorPurchaseLimits": false,
|
|
||||||
"noDeathMarks": false,
|
|
||||||
"noKimCooldowns": false,
|
|
||||||
"fullyStockedVendors": false,
|
"fullyStockedVendors": false,
|
||||||
"baroAlwaysAvailable": false,
|
|
||||||
"baroFullyStocked": false,
|
|
||||||
"syndicateMissionsRepeatable": false,
|
|
||||||
"unlockAllProfitTakerStages": false,
|
|
||||||
"instantFinishRivenChallenge": false,
|
|
||||||
"instantResourceExtractorDrones": false,
|
|
||||||
"noResourceExtractorDronesDamage": false,
|
|
||||||
"skipClanKeyCrafting": false,
|
"skipClanKeyCrafting": false,
|
||||||
"noDojoRoomBuildStage": false,
|
|
||||||
"noDecoBuildStage": false,
|
|
||||||
"fastDojoRoomDestruction": false,
|
|
||||||
"noDojoResearchCosts": false,
|
|
||||||
"noDojoResearchTime": false,
|
|
||||||
"fastClanAscension": false,
|
|
||||||
"missionsCanGiveAllRelics": false,
|
|
||||||
"unlockAllSimarisResearchEntries": false,
|
|
||||||
"disableDailyTribute": false,
|
|
||||||
"spoofMasteryRank": -1,
|
|
||||||
"relicRewardItemCountMultiplier": 1,
|
|
||||||
"nightwaveStandingMultiplier": 1,
|
|
||||||
"unfaithfulBugFixes": {
|
"unfaithfulBugFixes": {
|
||||||
"ignore1999LastRegionPlayed": false,
|
"ignore1999LastRegionPlayed": false,
|
||||||
"fixXtraCheeseTimer": false,
|
"fixXtraCheeseTimer": false,
|
||||||
@ -67,15 +28,25 @@
|
|||||||
"affinityBoost": false,
|
"affinityBoost": false,
|
||||||
"resourceBoost": false,
|
"resourceBoost": false,
|
||||||
"tennoLiveRelay": false,
|
"tennoLiveRelay": false,
|
||||||
"wolfHunt": false,
|
"baroTennoConRelay": false,
|
||||||
|
"baroAlwaysAvailable": false,
|
||||||
|
"baroFullyStocked": false,
|
||||||
|
"varziaFullyStocked": false,
|
||||||
|
"wolfHunt": null,
|
||||||
"orphixVenom": false,
|
"orphixVenom": false,
|
||||||
"longShadow": false,
|
"longShadow": false,
|
||||||
"hallowedFlame": false,
|
"hallowedFlame": false,
|
||||||
"anniversary": null,
|
"anniversary": null,
|
||||||
"hallowedNightmares": false,
|
"hallowedNightmares": false,
|
||||||
"hallowedNightmaresRewardsOverride": 0,
|
"hallowedNightmaresRewardsOverride": 0,
|
||||||
|
"naberusNightsOverride": null,
|
||||||
"proxyRebellion": false,
|
"proxyRebellion": false,
|
||||||
"proxyRebellionRewardsOverride": 0,
|
"proxyRebellionRewardsOverride": 0,
|
||||||
|
"voidCorruption2025Week1": false,
|
||||||
|
"voidCorruption2025Week2": false,
|
||||||
|
"voidCorruption2025Week3": false,
|
||||||
|
"voidCorruption2025Week4": false,
|
||||||
|
"qtccAlerts": false,
|
||||||
"galleonOfGhouls": 0,
|
"galleonOfGhouls": 0,
|
||||||
"ghoulEmergenceOverride": null,
|
"ghoulEmergenceOverride": null,
|
||||||
"plagueStarOverride": null,
|
"plagueStarOverride": null,
|
||||||
@ -86,15 +57,16 @@
|
|||||||
"bellyOfTheBeastProgressOverride": 0,
|
"bellyOfTheBeastProgressOverride": 0,
|
||||||
"eightClaw": false,
|
"eightClaw": false,
|
||||||
"eightClawProgressOverride": 0,
|
"eightClawProgressOverride": 0,
|
||||||
|
"thermiaFracturesOverride": null,
|
||||||
|
"thermiaFracturesProgressOverride": 0,
|
||||||
"eidolonOverride": "",
|
"eidolonOverride": "",
|
||||||
"vallisOverride": "",
|
"vallisOverride": "",
|
||||||
"duviriOverride": "",
|
"duviriOverride": "",
|
||||||
"nightwaveOverride": "",
|
"nightwaveOverride": "",
|
||||||
"allTheFissures": "",
|
"allTheFissures": "",
|
||||||
"circuitGameModes": null,
|
|
||||||
"darvoStockMultiplier": 1,
|
|
||||||
"varziaOverride": "",
|
"varziaOverride": "",
|
||||||
"varziaFullyStocked": false
|
"circuitGameModes": null,
|
||||||
|
"darvoStockMultiplier": 1
|
||||||
},
|
},
|
||||||
"dev": {
|
"dev": {
|
||||||
"keepVendorsExpired": false
|
"keepVendorsExpired": false
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
services:
|
services:
|
||||||
spaceninjaserver:
|
spaceninjaserver:
|
||||||
# The image to use. If you have an ARM CPU, replace 'latest' with 'latest-arm64'.
|
|
||||||
image: openwf/spaceninjaserver:latest
|
image: openwf/spaceninjaserver:latest
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
@ -19,9 +18,6 @@ services:
|
|||||||
- mongodb
|
- mongodb
|
||||||
mongodb:
|
mongodb:
|
||||||
image: docker.io/library/mongo:8.0.0-noble
|
image: docker.io/library/mongo:8.0.0-noble
|
||||||
environment:
|
|
||||||
MONGO_INITDB_ROOT_USERNAME: openwfagent
|
|
||||||
MONGO_INITDB_ROOT_PASSWORD: spaceninjaserver
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./docker-data/database:/data/db
|
- ./docker-data/database:/data/db
|
||||||
command: mongod --quiet --logpath /dev/null
|
command: mongod --quiet --logpath /dev/null
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ ! -f conf/config.json ]; then
|
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://mongodb:27017/openWF" '.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
|
||||||
|
|||||||
299
package-lock.json
generated
299
package-lock.json
generated
@ -9,11 +9,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"license": "GNU",
|
"license": "GNU",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/express": "^5",
|
"body-parser": "^2.2.0",
|
||||||
"@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 +17,8 @@
|
|||||||
"mongoose": "^8.11.0",
|
"mongoose": "^8.11.0",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": "^5.5",
|
|
||||||
"undici": "^7.10.0",
|
"undici": "^7.10.0",
|
||||||
"warframe-public-export-plus": "^0.5.81",
|
"warframe-public-export-plus": "^0.5.93",
|
||||||
"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 +33,18 @@
|
|||||||
"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"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@types/body-parser": "^1.19.6",
|
||||||
|
"@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 +356,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 +367,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 +377,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 +389,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 +401,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 +415,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 +468,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 +492,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 +511,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 +541,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 +568,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 +590,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 +612,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 +625,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 +650,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 +668,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 +693,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 +717,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 +752,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 +764,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 +790,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 +806,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 +822,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 +838,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 +854,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 +870,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 +2309,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 +3855,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 +3911,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 +4003,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 +5180,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 +5416,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 +5449,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 +5534,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/warframe-public-export-plus": {
|
"node_modules/warframe-public-export-plus": {
|
||||||
"version": "0.5.81",
|
"version": "0.5.93",
|
||||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.81.tgz",
|
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.93.tgz",
|
||||||
"integrity": "sha512-kh3e21XThVDSwdC3TJsMsXZnlZ4B/21HdeJkKcjuTygpCd842EPEKS3lRZl3mpXFOmdha744vAW1XEyHfiLofg=="
|
"integrity": "sha512-A8LSFJoyg7sU1n4L0zhLK1g0CREh8Fxvk7eXKoT8nMTroQg6YgEw02gK0MUi9U3rWTnlaGTsXZMp/tgC7HWUKw=="
|
||||||
},
|
},
|
||||||
"node_modules/warframe-riven-info": {
|
"node_modules/warframe-riven-info": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
|
|||||||
45
package.json
45
package.json
@ -4,33 +4,29 @@
|
|||||||
"description": "WF Emulator",
|
"description": "WF Emulator",
|
||||||
"main": "index.ts",
|
"main": "index.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node --enable-source-maps --import ./build/src/pathman.js build/src/index.js",
|
"start": "node --enable-source-maps build/src/index.js",
|
||||||
"build": "tsgo --sourceMap && ncp static/webui build/static/webui",
|
"build": "tsgo --inlineSourceMap && ncp static/webui build/static/webui",
|
||||||
"build:tsc": "tsc --incremental --sourceMap && ncp static/webui build/static/webui",
|
"build:tsc": "tsc --incremental --inlineSourceMap && ncp static/webui build/static/webui",
|
||||||
"build:dev": "tsgo --sourceMap",
|
"build:dev": "tsgo --inlineSourceMap",
|
||||||
"build:dev:tsc": "tsc --incremental --sourceMap",
|
"build:dev:tsc": "tsc --incremental --inlineSourceMap",
|
||||||
"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",
|
"dev": "node scripts/dev.cjs",
|
||||||
"dev": "node scripts/dev.js",
|
"dev:bun": "bun scripts/dev.cjs",
|
||||||
"dev:bun": "bun scripts/dev.js",
|
|
||||||
"verify": "tsgo --noEmit",
|
"verify": "tsgo --noEmit",
|
||||||
"verify:tsc": "tsc --noEmit",
|
"verify:tsc": "tsc --noEmit",
|
||||||
"bun-run": "bun src/index.ts",
|
"raw": "node scripts/raw-precheck.js && 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 prettier"
|
||||||
"fix": "npm run update-translations && npm run fix-imports && npm run prettier"
|
|
||||||
},
|
},
|
||||||
"license": "GNU",
|
"license": "GNU",
|
||||||
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/express": "^5",
|
"body-parser": "^2.2.0",
|
||||||
"@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,22 @@
|
|||||||
"mongoose": "^8.11.0",
|
"mongoose": "^8.11.0",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"typescript": "^5.5",
|
|
||||||
"undici": "^7.10.0",
|
"undici": "^7.10.0",
|
||||||
"warframe-public-export-plus": "^0.5.81",
|
"warframe-public-export-plus": "^0.5.93",
|
||||||
"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/body-parser": "^1.19.6",
|
||||||
|
"@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 +59,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,17 @@ args.push("--dev");
|
|||||||
args.push("--secret");
|
args.push("--secret");
|
||||||
args.push(secret);
|
args.push(secret);
|
||||||
|
|
||||||
|
const cangoraw = (() => {
|
||||||
|
if (process.versions.bun) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const [major, minor] = process.versions.node.split(".").map(x => parseInt(x));
|
||||||
|
if (major > 22 || (major == 22 && minor >= 7)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
})();
|
||||||
|
|
||||||
let buildproc, runproc;
|
let buildproc, runproc;
|
||||||
const spawnopts = { stdio: "inherit", shell: true };
|
const spawnopts = { stdio: "inherit", shell: true };
|
||||||
function run(changedFile) {
|
function run(changedFile) {
|
||||||
@ -29,7 +40,10 @@ function run(changedFile) {
|
|||||||
runproc = undefined;
|
runproc = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const thisbuildproc = spawn("npm", ["run", process.versions.bun ? "verify" : "build:dev"], spawnopts);
|
const thisbuildproc = spawn(
|
||||||
|
[process.versions.bun ? "bun" : "npm", "run", cangoraw ? "verify" : "build:dev"].join(" "),
|
||||||
|
spawnopts
|
||||||
|
);
|
||||||
const thisbuildstart = Date.now();
|
const thisbuildstart = Date.now();
|
||||||
buildproc = thisbuildproc;
|
buildproc = thisbuildproc;
|
||||||
buildproc.on("exit", code => {
|
buildproc.on("exit", code => {
|
||||||
@ -38,8 +52,17 @@ 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(`${cangoraw ? "Verified" : "Built"} in ${Date.now() - thisbuildstart} ms`);
|
||||||
runproc = spawn("npm", ["run", process.versions.bun ? "bun-run" : "start", "--", ...args], spawnopts);
|
runproc = spawn(
|
||||||
|
[
|
||||||
|
process.versions.bun ? "bun" : "npm",
|
||||||
|
"run",
|
||||||
|
cangoraw ? (process.versions.bun ? "raw:bun" : "raw") : "start",
|
||||||
|
"--",
|
||||||
|
...args
|
||||||
|
].join(" "),
|
||||||
|
spawnopts
|
||||||
|
);
|
||||||
runproc.on("exit", () => {
|
runproc.on("exit", () => {
|
||||||
runproc = undefined;
|
runproc = undefined;
|
||||||
});
|
});
|
||||||
@ -1,46 +0,0 @@
|
|||||||
/* eslint-disable */
|
|
||||||
const fs = require("fs");
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
const root = path.join(process.cwd(), "..");
|
|
||||||
|
|
||||||
function listFiles(dir) {
|
|
||||||
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
||||||
let results = [];
|
|
||||||
for (const entry of entries) {
|
|
||||||
const fullPath = path.join(dir, entry.name);
|
|
||||||
if (entry.isDirectory()) {
|
|
||||||
results = results.concat(listFiles(fullPath));
|
|
||||||
} else {
|
|
||||||
results.push(fullPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
const files = listFiles(path.join(root, "src"));
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
let content;
|
|
||||||
try {
|
|
||||||
content = fs.readFileSync(file, "utf8");
|
|
||||||
} catch (e) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const dir = path.dirname(file);
|
|
||||||
const fixedContent = content.replaceAll(/} from "([^"]+)";/g, (sub, importPath) => {
|
|
||||||
if (!importPath.startsWith("@/")) {
|
|
||||||
const fullImportPath = path.resolve(dir, importPath);
|
|
||||||
if (fs.existsSync(fullImportPath + ".ts")) {
|
|
||||||
const relative = path.relative(root, fullImportPath).replace(/\\/g, "/");
|
|
||||||
const fixedPath = "@/" + relative;
|
|
||||||
console.log(`${importPath} -> ${fixedPath}`);
|
|
||||||
return sub.split(importPath).join(fixedPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sub;
|
|
||||||
});
|
|
||||||
if (content != fixedContent) {
|
|
||||||
fs.writeFileSync(file, fixedContent, "utf8");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
9
scripts/raw-precheck.js
Normal file
9
scripts/raw-precheck.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const [major, minor] = process.versions.node.split(".").map(x => parseInt(x));
|
||||||
|
if (major > 22 || (major == 22 && minor >= 7)) {
|
||||||
|
// ok
|
||||||
|
} else {
|
||||||
|
console.log("Sorry, your Node version is a bit too old for this. You have 2 options:");
|
||||||
|
console.log("- Update Node.js.");
|
||||||
|
console.log("- Use 'npm run build && npm run start'. Optional libraries must be installed for this.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
@ -31,7 +31,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => {
|
|||||||
const strings = extractStrings(line);
|
const strings = extractStrings(line);
|
||||||
if (Object.keys(strings).length > 0) {
|
if (Object.keys(strings).length > 0) {
|
||||||
Object.entries(strings).forEach(([key, value]) => {
|
Object.entries(strings).forEach(([key, value]) => {
|
||||||
if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED] ")) {
|
if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED]")) {
|
||||||
fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`);
|
fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`);
|
||||||
} else {
|
} else {
|
||||||
fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
|
fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
|
||||||
22
src/app.ts
22
src/app.ts
@ -1,23 +1,23 @@
|
|||||||
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();
|
||||||
|
|
||||||
app.use((req, _res, next) => {
|
app.use((req, _res, next) => {
|
||||||
// 38.5.0 introduced "ezip" for encrypted body blobs and "e" for request verification only (encrypted body blobs with no application data).
|
// 38.5.0 introduced "ezip" for encrypted body blobs and "e" for request verification only (encrypted body blobs with no application data).
|
||||||
// The bootstrapper decrypts it for us but having an unsupported Content-Encoding here would still be an issue for Express, so removing it.
|
// The client patch is expected to decrypt it for us but having an unsupported Content-Encoding here would still be an issue for Express, so removing it.
|
||||||
if (req.headers["content-encoding"] == "ezip" || req.headers["content-encoding"] == "e") {
|
if (req.headers["content-encoding"] == "ezip" || req.headers["content-encoding"] == "e") {
|
||||||
req.headers["content-encoding"] = undefined;
|
req.headers["content-encoding"] = undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
export const EPOCH = 1734307200_000; // Monday, Dec 16, 2024 @ 00:00 UTC+0; should logically be the start of winter in 1999 iteration 0
|
||||||
|
|
||||||
const millisecondsPerSecond = 1000;
|
const millisecondsPerSecond = 1000;
|
||||||
const secondsPerMinute = 60;
|
const secondsPerMinute = 60;
|
||||||
const minutesPerHour = 60;
|
const minutesPerHour = 60;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
|
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import {
|
|||||||
hasGuildPermission,
|
hasGuildPermission,
|
||||||
removeDojoDeco,
|
removeDojoDeco,
|
||||||
removeDojoRoom
|
removeDojoRoom
|
||||||
} from "@/src/services/guildService";
|
} from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const abortDojoComponentController: RequestHandler = async (req, res) => {
|
export const abortDojoComponentController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -31,12 +31,13 @@ export const abortDojoComponentController: RequestHandler = async (req, res) =>
|
|||||||
|
|
||||||
if (request.DecoId) {
|
if (request.DecoId) {
|
||||||
removeDojoDeco(guild, request.ComponentId, request.DecoId);
|
removeDojoDeco(guild, request.ComponentId, request.DecoId);
|
||||||
|
await guild.save();
|
||||||
|
res.json(await getDojoClient(guild, 0, request.ComponentId));
|
||||||
} else {
|
} else {
|
||||||
await removeDojoRoom(guild, request.ComponentId);
|
await removeDojoRoom(guild, request.ComponentId);
|
||||||
|
await guild.save();
|
||||||
|
res.json(await getDojoClient(guild, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
await guild.save();
|
|
||||||
res.json(await getDojoClient(guild, 0, request.ComponentId));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IAbortDojoComponentRequest {
|
interface IAbortDojoComponentRequest {
|
||||||
|
|||||||
@ -1,8 +1,13 @@
|
|||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
|
import {
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
getDojoClient,
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
getGuildForRequestEx,
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
hasAccessToDojo,
|
||||||
import { RequestHandler } from "express";
|
hasGuildPermission
|
||||||
|
} from "../../services/guildService.ts";
|
||||||
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {
|
export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,20 +1,19 @@
|
|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import {
|
import {
|
||||||
createVeiledRivenFingerprint,
|
createVeiledRivenFingerprint,
|
||||||
createUnveiledRivenFingerprint,
|
createUnveiledRivenFingerprint,
|
||||||
rivenRawToRealWeighted
|
rivenRawToRealWeighted
|
||||||
} from "@/src/helpers/rivenHelper";
|
} from "../../helpers/rivenHelper.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
|
import { addMods, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getRandomElement } from "@/src/services/rngService";
|
import { getRandomElement } from "../../services/rngService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportUpgrades } from "warframe-public-export-plus";
|
import { ExportUpgrades } from "warframe-public-export-plus";
|
||||||
import { config } from "@/src/services/configService";
|
|
||||||
|
|
||||||
export const activateRandomModController: RequestHandler = async (req, res) => {
|
export const activateRandomModController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId, "RawUpgrades Upgrades instantFinishRivenChallenge");
|
||||||
const request = getJSONfromString<IActiveRandomModRequest>(String(req.body));
|
const request = getJSONfromString<IActiveRandomModRequest>(String(req.body));
|
||||||
addMods(inventory, [
|
addMods(inventory, [
|
||||||
{
|
{
|
||||||
@ -23,7 +22,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
|
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
|
||||||
const fingerprint = config.instantFinishRivenChallenge
|
const fingerprint = inventory.instantFinishRivenChallenge
|
||||||
? createUnveiledRivenFingerprint(ExportUpgrades[rivenType])
|
? createUnveiledRivenFingerprint(ExportUpgrades[rivenType])
|
||||||
: createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
: createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
|
||||||
const upgradeIndex =
|
const upgradeIndex =
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Friendship } from "@/src/models/friendModel";
|
import { Friendship } from "../../models/friendModel.ts";
|
||||||
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "@/src/services/friendService";
|
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "../../services/friendService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IFriendInfo } from "@/src/types/friendTypes";
|
import type { IFriendInfo } from "../../types/friendTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const addFriendController: RequestHandler = async (req, res) => {
|
export const addFriendController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
|
import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
|
|
||||||
export const addFriendImageController: RequestHandler = async (req, res) => {
|
export const addFriendImageController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Account, Ignore } from "@/src/models/loginModel";
|
import { Account, Ignore } from "../../models/loginModel.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IFriendInfo } from "@/src/types/friendTypes";
|
import type { IFriendInfo } from "../../types/friendTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const addIgnoredUserController: RequestHandler = async (req, res) => {
|
export const addIgnoredUserController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Friendship } from "@/src/models/friendModel";
|
import { Friendship } from "../../models/friendModel.ts";
|
||||||
import { Account } from "@/src/models/loginModel";
|
import { Account } from "../../models/loginModel.ts";
|
||||||
import { addInventoryDataToFriendInfo, areFriendsOfFriends } from "@/src/services/friendService";
|
import { addInventoryDataToFriendInfo, areFriendsOfFriends } from "../../services/friendService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IFriendInfo } from "@/src/types/friendTypes";
|
import type { IFriendInfo } from "../../types/friendTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const addPendingFriendController: RequestHandler = async (req, res) => {
|
export const addPendingFriendController: RequestHandler = async (req, res) => {
|
||||||
const payload = getJSONfromString<IAddPendingFriendRequest>(String(req.body));
|
const payload = getJSONfromString<IAddPendingFriendRequest>(String(req.body));
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { getJSONfromString, regexEscape } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString, regexEscape } from "../../helpers/stringHelpers.ts";
|
||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
|
import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { createMessage } from "@/src/services/inboxService";
|
import { createMessage } from "../../services/inboxService.ts";
|
||||||
import { getEffectiveAvatarImageType, getInventory } from "@/src/services/inventoryService";
|
import { getEffectiveAvatarImageType, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getSuffixedName } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportFlavour } from "warframe-public-export-plus";
|
import { ExportFlavour } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const addToAllianceController: RequestHandler = async (req, res) => {
|
export const addToAllianceController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,15 +1,16 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
|
import { Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { Account } from "@/src/models/loginModel";
|
import { Account } from "../../models/loginModel.ts";
|
||||||
import { addInventoryDataToFriendInfo, areFriends } from "@/src/services/friendService";
|
import { addInventoryDataToFriendInfo, areFriends } from "../../services/friendService.ts";
|
||||||
import { hasGuildPermission } from "@/src/services/guildService";
|
import { hasGuildPermission } from "../../services/guildService.ts";
|
||||||
import { createMessage } from "@/src/services/inboxService";
|
import { createMessage } from "../../services/inboxService.ts";
|
||||||
import { getEffectiveAvatarImageType, getInventory } from "@/src/services/inventoryService";
|
import { getEffectiveAvatarImageType, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "../../services/loginService.ts";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import type { IOid } from "../../types/commonTypes.ts";
|
||||||
import { GuildPermission, IGuildMemberClient } from "@/src/types/guildTypes";
|
import type { IGuildMemberClient } from "../../types/guildTypes.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
import { ExportFlavour } from "warframe-public-export-plus";
|
import { ExportFlavour } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const addToGuildController: RequestHandler = async (req, res) => {
|
export const addToGuildController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const adoptPetController: RequestHandler = async (req, res) => {
|
export const adoptPetController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getPersonalRooms } from "@/src/services/personalRoomsService";
|
import { getPersonalRooms } from "../../services/personalRoomsService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const apartmentController: RequestHandler = async (req, res) => {
|
export const apartmentController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory, addMods } from "@/src/services/inventoryService";
|
import { getInventory, addMods } from "../../services/inventoryService.ts";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import type { IOid } from "../../types/commonTypes.ts";
|
||||||
|
|
||||||
export const arcaneCommonController: RequestHandler = async (req, res) => {
|
export const arcaneCommonController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { colorToShard, combineColors, shardToColor } from "@/src/helpers/shardHelper";
|
import { colorToShard, combineColors, shardToColor } from "../../helpers/shardHelper.ts";
|
||||||
|
|
||||||
export const archonFusionController: RequestHandler = async (req, res) => {
|
export const archonFusionController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
import { fromOid, toOid } from "@/src/helpers/inventoryHelpers";
|
import { fromOid, toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { createVeiledRivenFingerprint, rivenRawToRealWeighted } from "@/src/helpers/rivenHelper";
|
import { createVeiledRivenFingerprint, rivenRawToRealWeighted } from "../../helpers/rivenHelper.ts";
|
||||||
import { addMiscItems, addMods, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItems, addMods, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getRandomElement, getRandomWeightedReward, getRandomWeightedRewardUc } from "@/src/services/rngService";
|
import { getRandomElement, getRandomWeightedReward, getRandomWeightedRewardUc } from "../../services/rngService.ts";
|
||||||
import { IUpgradeFromClient } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IUpgradeFromClient } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportBoosterPacks, ExportUpgrades, TRarity } from "warframe-public-export-plus";
|
import type { TRarity } from "warframe-public-export-plus";
|
||||||
|
import { ExportBoosterPacks, ExportUpgrades } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const artifactTransmutationController: RequestHandler = async (req, res) => {
|
export const artifactTransmutationController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { IInventoryClient, IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IInventoryClient, IUpgradeClient } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
|
import { addMods, getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { broadcastInventoryUpdate } from "../../services/wsService.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);
|
||||||
@ -57,6 +58,7 @@ export const artifactsController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
res.send(itemId);
|
res.send(itemId);
|
||||||
|
broadcastInventoryUpdate(req);
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IArtifactsRequest {
|
interface IArtifactsRequest {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { GuildAd } from "@/src/models/guildModel";
|
import { GuildAd } from "../../models/guildModel.ts";
|
||||||
import { getGuildForRequestEx, hasGuildPermission } from "@/src/services/guildService";
|
import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => {
|
export const cancelGuildAdvertisementController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,10 +1,16 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
|
import {
|
||||||
import { logger } from "@/src/utils/logger";
|
getDojoClient,
|
||||||
import { GuildPermission, IDojoComponentDatabase } from "@/src/types/guildTypes";
|
getGuildForRequestEx,
|
||||||
|
hasAccessToDojo,
|
||||||
|
hasGuildPermission
|
||||||
|
} from "../../services/guildService.ts";
|
||||||
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { IDojoComponentDatabase } from "../../types/guildTypes.ts";
|
||||||
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
|
|
||||||
export const changeDojoRootController: RequestHandler = async (req, res) => {
|
export const changeDojoRootController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { GuildMember } from "@/src/models/guildModel";
|
import { GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getGuildForRequest, hasGuildPermissionEx } from "@/src/services/guildService";
|
import { getGuildForRequest, hasGuildPermissionEx } from "../../services/guildService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const changeGuildRankController: RequestHandler = async (req, res) => {
|
export const changeGuildRankController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const checkDailyMissionBonusController: RequestHandler = async (req, res) => {
|
export const checkDailyMissionBonusController: RequestHandler = async (req, res) => {
|
||||||
const account = await getAccountForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
//this is a controller for the claimCompletedRecipe route
|
//this is a controller for the claimCompletedRecipe route
|
||||||
//it will claim a recipe for the user
|
//it will claim a recipe for the user
|
||||||
|
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { getRecipe } from "@/src/services/itemDataService";
|
import { getRecipe } from "../../services/itemDataService.ts";
|
||||||
import { IOid, IOidWithLegacySupport } from "@/src/types/commonTypes";
|
import type { IOidWithLegacySupport } from "../../types/commonTypes.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import type { TAccountDocument } from "../../services/loginService.ts";
|
||||||
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import {
|
import {
|
||||||
getInventory,
|
getInventory,
|
||||||
updateCurrency,
|
updateCurrency,
|
||||||
@ -17,243 +18,258 @@ import {
|
|||||||
addKubrowPetPrint,
|
addKubrowPetPrint,
|
||||||
addPowerSuit,
|
addPowerSuit,
|
||||||
addEquipment
|
addEquipment
|
||||||
} from "@/src/services/inventoryService";
|
} from "../../services/inventoryService.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { InventorySlot, IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IPendingRecipeDatabase } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { toOid2 } from "@/src/helpers/inventoryHelpers";
|
import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
import { fromOid, toOid2 } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { IRecipe } from "warframe-public-export-plus";
|
import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
import { config } from "@/src/services/configService";
|
import type { IRecipe } from "warframe-public-export-plus";
|
||||||
import { EquipmentFeatures, IEquipmentClient, Status } from "@/src/types/equipmentTypes";
|
import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
|
||||||
|
import { EquipmentFeatures, Status } from "../../types/equipmentTypes.ts";
|
||||||
|
|
||||||
interface IClaimCompletedRecipeRequest {
|
interface IClaimCompletedRecipeRequest {
|
||||||
RecipeIds: IOid[];
|
RecipeIds: IOidWithLegacySupport[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IClaimCompletedRecipeResponse {
|
||||||
|
InventoryChanges: IInventoryChanges;
|
||||||
|
BrandedSuits?: IOidWithLegacySupport[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const claimCompletedRecipeController: RequestHandler = async (req, res) => {
|
export const claimCompletedRecipeController: RequestHandler = async (req, res) => {
|
||||||
const claimCompletedRecipeRequest = getJSONfromString<IClaimCompletedRecipeRequest>(String(req.body));
|
const claimCompletedRecipeRequest = getJSONfromString<IClaimCompletedRecipeRequest>(String(req.body));
|
||||||
const account = await getAccountForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
const inventory = await getInventory(account._id.toString());
|
const inventory = await getInventory(account._id.toString());
|
||||||
const pendingRecipe = inventory.PendingRecipes.id(claimCompletedRecipeRequest.RecipeIds[0].$oid);
|
const resp: IClaimCompletedRecipeResponse = {
|
||||||
if (!pendingRecipe) {
|
InventoryChanges: {}
|
||||||
throw new Error(`no pending recipe found with id ${claimCompletedRecipeRequest.RecipeIds[0].$oid}`);
|
};
|
||||||
}
|
for (const recipeId of claimCompletedRecipeRequest.RecipeIds) {
|
||||||
|
const pendingRecipe = inventory.PendingRecipes.id(fromOid(recipeId));
|
||||||
//check recipe is indeed ready to be completed
|
if (!pendingRecipe) {
|
||||||
// if (pendingRecipe.CompletionDate > new Date()) {
|
throw new Error(`no pending recipe found with id ${fromOid(recipeId)}`);
|
||||||
// throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`);
|
|
||||||
// }
|
|
||||||
|
|
||||||
inventory.PendingRecipes.pull(pendingRecipe._id);
|
|
||||||
|
|
||||||
const recipe = getRecipe(pendingRecipe.ItemType);
|
|
||||||
if (!recipe) {
|
|
||||||
throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.query.cancel) {
|
|
||||||
const inventoryChanges: IInventoryChanges = {};
|
|
||||||
await refundRecipeIngredients(inventory, inventoryChanges, recipe, pendingRecipe);
|
|
||||||
await inventory.save();
|
|
||||||
res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
|
|
||||||
} else {
|
|
||||||
logger.debug("Claiming Recipe", { recipe, pendingRecipe });
|
|
||||||
|
|
||||||
let BrandedSuits: undefined | IOidWithLegacySupport[];
|
|
||||||
if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
|
|
||||||
inventory.PendingSpectreLoadouts ??= [];
|
|
||||||
inventory.SpectreLoadouts ??= [];
|
|
||||||
|
|
||||||
const pendingLoadoutIndex = inventory.PendingSpectreLoadouts.findIndex(
|
|
||||||
x => x.ItemType == recipe.resultType
|
|
||||||
);
|
|
||||||
if (pendingLoadoutIndex != -1) {
|
|
||||||
const loadoutIndex = inventory.SpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
|
|
||||||
if (loadoutIndex != -1) {
|
|
||||||
inventory.SpectreLoadouts.splice(loadoutIndex, 1);
|
|
||||||
}
|
|
||||||
logger.debug(
|
|
||||||
"moving spectre loadout from pending to active",
|
|
||||||
inventory.toJSON().PendingSpectreLoadouts![pendingLoadoutIndex]
|
|
||||||
);
|
|
||||||
inventory.SpectreLoadouts.push(inventory.PendingSpectreLoadouts[pendingLoadoutIndex]);
|
|
||||||
inventory.PendingSpectreLoadouts.splice(pendingLoadoutIndex, 1);
|
|
||||||
}
|
|
||||||
} else if (recipe.secretIngredientAction == "SIA_UNBRAND") {
|
|
||||||
inventory.BrandedSuits!.splice(
|
|
||||||
inventory.BrandedSuits!.findIndex(x => x.equals(pendingRecipe.SuitToUnbrand)),
|
|
||||||
1
|
|
||||||
);
|
|
||||||
BrandedSuits = [toOid2(pendingRecipe.SuitToUnbrand!, account.BuildLabel)];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let InventoryChanges: IInventoryChanges = {};
|
//check recipe is indeed ready to be completed
|
||||||
if (recipe.consumeOnUse) {
|
// if (pendingRecipe.CompletionDate > new Date()) {
|
||||||
addRecipes(inventory, [
|
// throw new Error(`recipe ${pendingRecipe._id} is not ready to be completed`);
|
||||||
|
// }
|
||||||
|
|
||||||
|
inventory.PendingRecipes.pull(pendingRecipe._id);
|
||||||
|
|
||||||
|
const recipe = getRecipe(pendingRecipe.ItemType);
|
||||||
|
if (!recipe) {
|
||||||
|
throw new Error(`no completed item found for recipe ${pendingRecipe._id.toString()}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.query.cancel) {
|
||||||
|
const inventoryChanges: IInventoryChanges = {};
|
||||||
|
await refundRecipeIngredients(inventory, inventoryChanges, recipe, pendingRecipe);
|
||||||
|
await inventory.save();
|
||||||
|
res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await claimCompletedRecipe(account, inventory, recipe, pendingRecipe, resp, req.query.rush);
|
||||||
|
}
|
||||||
|
await inventory.save();
|
||||||
|
res.json(resp);
|
||||||
|
};
|
||||||
|
|
||||||
|
const claimCompletedRecipe = async (
|
||||||
|
account: TAccountDocument,
|
||||||
|
inventory: TInventoryDatabaseDocument,
|
||||||
|
recipe: IRecipe,
|
||||||
|
pendingRecipe: IPendingRecipeDatabase,
|
||||||
|
resp: IClaimCompletedRecipeResponse,
|
||||||
|
rush: any
|
||||||
|
): Promise<void> => {
|
||||||
|
logger.debug("Claiming Recipe", { recipe, pendingRecipe });
|
||||||
|
|
||||||
|
if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") {
|
||||||
|
inventory.PendingSpectreLoadouts ??= [];
|
||||||
|
inventory.SpectreLoadouts ??= [];
|
||||||
|
|
||||||
|
const pendingLoadoutIndex = inventory.PendingSpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
|
||||||
|
if (pendingLoadoutIndex != -1) {
|
||||||
|
const loadoutIndex = inventory.SpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType);
|
||||||
|
if (loadoutIndex != -1) {
|
||||||
|
inventory.SpectreLoadouts.splice(loadoutIndex, 1);
|
||||||
|
}
|
||||||
|
logger.debug(
|
||||||
|
"moving spectre loadout from pending to active",
|
||||||
|
inventory.toJSON().PendingSpectreLoadouts![pendingLoadoutIndex]
|
||||||
|
);
|
||||||
|
inventory.SpectreLoadouts.push(inventory.PendingSpectreLoadouts[pendingLoadoutIndex]);
|
||||||
|
inventory.PendingSpectreLoadouts.splice(pendingLoadoutIndex, 1);
|
||||||
|
}
|
||||||
|
} else if (recipe.secretIngredientAction == "SIA_UNBRAND") {
|
||||||
|
inventory.BrandedSuits!.splice(
|
||||||
|
inventory.BrandedSuits!.findIndex(x => x.equals(pendingRecipe.SuitToUnbrand)),
|
||||||
|
1
|
||||||
|
);
|
||||||
|
resp.BrandedSuits = [toOid2(pendingRecipe.SuitToUnbrand!, account.BuildLabel)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recipe.consumeOnUse) {
|
||||||
|
addRecipes(inventory, [
|
||||||
|
{
|
||||||
|
ItemType: pendingRecipe.ItemType,
|
||||||
|
ItemCount: -1
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rush) {
|
||||||
|
const end = Math.trunc(pendingRecipe.CompletionDate.getTime() / 1000);
|
||||||
|
const start = end - recipe.buildTime;
|
||||||
|
const secondsElapsed = Math.trunc(Date.now() / 1000) - start;
|
||||||
|
const progress = secondsElapsed / recipe.buildTime;
|
||||||
|
logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`);
|
||||||
|
const cost =
|
||||||
|
progress > 0.5 ? Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5))) : recipe.skipBuildTimePrice;
|
||||||
|
combineInventoryChanges(resp.InventoryChanges, updateCurrency(inventory, cost, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
|
||||||
|
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
|
||||||
|
if (pet.Details!.HatchDate!.getTime() > Date.now()) {
|
||||||
|
pet.Details!.HatchDate = new Date();
|
||||||
|
}
|
||||||
|
let canSetActive = true;
|
||||||
|
for (const pet of inventory.KubrowPets) {
|
||||||
|
if (pet.Details!.Status == Status.StatusAvailable) {
|
||||||
|
canSetActive = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
|
||||||
|
} else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
|
||||||
|
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
|
||||||
|
addKubrowPetPrint(inventory, pet, resp.InventoryChanges);
|
||||||
|
} else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
||||||
|
if (recipe.resultType == "/Lotus/Powersuits/Excalibur/ExcaliburUmbra") {
|
||||||
|
// Quite the special case here...
|
||||||
|
// We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed.
|
||||||
|
// Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati
|
||||||
|
|
||||||
|
const umbraModA = (
|
||||||
|
await addItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA",
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
`{"lvl":5}`
|
||||||
|
)
|
||||||
|
).Upgrades![0];
|
||||||
|
const umbraModB = (
|
||||||
|
await addItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB",
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
`{"lvl":5}`
|
||||||
|
)
|
||||||
|
).Upgrades![0];
|
||||||
|
const umbraModC = (
|
||||||
|
await addItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC",
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
`{"lvl":5}`
|
||||||
|
)
|
||||||
|
).Upgrades![0];
|
||||||
|
const sacrificeModA = (
|
||||||
|
await addItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA",
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
`{"lvl":5}`
|
||||||
|
)
|
||||||
|
).Upgrades![0];
|
||||||
|
const sacrificeModB = (
|
||||||
|
await addItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB",
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
`{"lvl":5}`
|
||||||
|
)
|
||||||
|
).Upgrades![0];
|
||||||
|
resp.InventoryChanges.Upgrades ??= [];
|
||||||
|
resp.InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB);
|
||||||
|
|
||||||
|
await addPowerSuit(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
|
||||||
{
|
{
|
||||||
ItemType: pendingRecipe.ItemType,
|
Configs: [
|
||||||
ItemCount: -1
|
{
|
||||||
}
|
Upgrades: [
|
||||||
]);
|
"",
|
||||||
}
|
"",
|
||||||
if (req.query.rush) {
|
"",
|
||||||
const end = Math.trunc(pendingRecipe.CompletionDate.getTime() / 1000);
|
"",
|
||||||
const start = end - recipe.buildTime;
|
"",
|
||||||
const secondsElapsed = Math.trunc(Date.now() / 1000) - start;
|
umbraModA.ItemId.$oid,
|
||||||
const progress = secondsElapsed / recipe.buildTime;
|
umbraModB.ItemId.$oid,
|
||||||
logger.debug(`rushing recipe at ${Math.trunc(progress * 100)}% completion`);
|
umbraModC.ItemId.$oid
|
||||||
const cost =
|
]
|
||||||
progress > 0.5
|
}
|
||||||
? Math.round(recipe.skipBuildTimePrice * (1 - (progress - 0.5)))
|
],
|
||||||
: recipe.skipBuildTimePrice;
|
XP: 900_000,
|
||||||
InventoryChanges = {
|
Features: EquipmentFeatures.DOUBLE_CAPACITY
|
||||||
...InventoryChanges,
|
},
|
||||||
...updateCurrency(inventory, cost, true)
|
resp.InventoryChanges
|
||||||
};
|
);
|
||||||
}
|
inventory.XPInfo.push({
|
||||||
|
ItemType: "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
|
||||||
|
XP: 900_000
|
||||||
|
});
|
||||||
|
|
||||||
if (recipe.secretIngredientAction == "SIA_CREATE_KUBROW") {
|
addEquipment(
|
||||||
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
|
inventory,
|
||||||
if (pet.Details!.HatchDate!.getTime() > Date.now()) {
|
"Melee",
|
||||||
pet.Details!.HatchDate = new Date();
|
"/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
|
||||||
}
|
{
|
||||||
let canSetActive = true;
|
Configs: [
|
||||||
for (const pet of inventory.KubrowPets) {
|
{ Upgrades: ["", "", "", "", "", "", sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }
|
||||||
if (pet.Details!.Status == Status.StatusAvailable) {
|
],
|
||||||
canSetActive = false;
|
XP: 450_000,
|
||||||
break;
|
Features: EquipmentFeatures.DOUBLE_CAPACITY
|
||||||
}
|
},
|
||||||
}
|
resp.InventoryChanges
|
||||||
pet.Details!.Status = canSetActive ? Status.StatusAvailable : Status.StatusStasis;
|
);
|
||||||
} else if (recipe.secretIngredientAction == "SIA_DISTILL_PRINT") {
|
inventory.XPInfo.push({
|
||||||
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
|
ItemType: "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
|
||||||
addKubrowPetPrint(inventory, pet, InventoryChanges);
|
XP: 450_000
|
||||||
} else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
});
|
||||||
if (recipe.resultType == "/Lotus/Powersuits/Excalibur/ExcaliburUmbra") {
|
} else {
|
||||||
// Quite the special case here...
|
combineInventoryChanges(
|
||||||
// We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed.
|
resp.InventoryChanges,
|
||||||
// Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati
|
await addItem(
|
||||||
|
|
||||||
const umbraModA = (
|
|
||||||
await addItem(
|
|
||||||
inventory,
|
|
||||||
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA",
|
|
||||||
1,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
`{"lvl":5}`
|
|
||||||
)
|
|
||||||
).Upgrades![0];
|
|
||||||
const umbraModB = (
|
|
||||||
await addItem(
|
|
||||||
inventory,
|
|
||||||
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB",
|
|
||||||
1,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
`{"lvl":5}`
|
|
||||||
)
|
|
||||||
).Upgrades![0];
|
|
||||||
const umbraModC = (
|
|
||||||
await addItem(
|
|
||||||
inventory,
|
|
||||||
"/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC",
|
|
||||||
1,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
`{"lvl":5}`
|
|
||||||
)
|
|
||||||
).Upgrades![0];
|
|
||||||
const sacrificeModA = (
|
|
||||||
await addItem(
|
|
||||||
inventory,
|
|
||||||
"/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA",
|
|
||||||
1,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
`{"lvl":5}`
|
|
||||||
)
|
|
||||||
).Upgrades![0];
|
|
||||||
const sacrificeModB = (
|
|
||||||
await addItem(
|
|
||||||
inventory,
|
|
||||||
"/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB",
|
|
||||||
1,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
`{"lvl":5}`
|
|
||||||
)
|
|
||||||
).Upgrades![0];
|
|
||||||
InventoryChanges.Upgrades ??= [];
|
|
||||||
InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB);
|
|
||||||
|
|
||||||
await addPowerSuit(
|
|
||||||
inventory,
|
inventory,
|
||||||
"/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
|
recipe.resultType,
|
||||||
{
|
recipe.num,
|
||||||
Configs: [
|
false,
|
||||||
{
|
undefined,
|
||||||
Upgrades: [
|
pendingRecipe.TargetFingerprint
|
||||||
"",
|
)
|
||||||
"",
|
);
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
umbraModA.ItemId.$oid,
|
|
||||||
umbraModB.ItemId.$oid,
|
|
||||||
umbraModC.ItemId.$oid
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
XP: 900_000,
|
|
||||||
Features: EquipmentFeatures.DOUBLE_CAPACITY
|
|
||||||
},
|
|
||||||
InventoryChanges
|
|
||||||
);
|
|
||||||
inventory.XPInfo.push({
|
|
||||||
ItemType: "/Lotus/Powersuits/Excalibur/ExcaliburUmbra",
|
|
||||||
XP: 900_000
|
|
||||||
});
|
|
||||||
|
|
||||||
addEquipment(
|
|
||||||
inventory,
|
|
||||||
"Melee",
|
|
||||||
"/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
|
|
||||||
{
|
|
||||||
Configs: [
|
|
||||||
{ Upgrades: ["", "", "", "", "", "", sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }
|
|
||||||
],
|
|
||||||
XP: 450_000,
|
|
||||||
Features: EquipmentFeatures.DOUBLE_CAPACITY
|
|
||||||
},
|
|
||||||
InventoryChanges
|
|
||||||
);
|
|
||||||
inventory.XPInfo.push({
|
|
||||||
ItemType: "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana",
|
|
||||||
XP: 450_000
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
InventoryChanges = {
|
|
||||||
...InventoryChanges,
|
|
||||||
...(await addItem(
|
|
||||||
inventory,
|
|
||||||
recipe.resultType,
|
|
||||||
recipe.num,
|
|
||||||
false,
|
|
||||||
undefined,
|
|
||||||
pendingRecipe.TargetFingerprint
|
|
||||||
))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (
|
}
|
||||||
config.claimingBlueprintRefundsIngredients &&
|
if (
|
||||||
recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg
|
inventory.claimingBlueprintRefundsIngredients &&
|
||||||
) {
|
recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg
|
||||||
await refundRecipeIngredients(inventory, InventoryChanges, recipe, pendingRecipe);
|
) {
|
||||||
}
|
await refundRecipeIngredients(inventory, resp.InventoryChanges, recipe, pendingRecipe);
|
||||||
await inventory.save();
|
|
||||||
res.json({ InventoryChanges, BrandedSuits });
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
|
import { combineInventoryChanges, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportChallenges } from "warframe-public-export-plus";
|
import { ExportChallenges } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const claimJunctionChallengeRewardController: RequestHandler = async (req, res) => {
|
export const claimJunctionChallengeRewardController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { addFusionPoints, getInventory } from "@/src/services/inventoryService";
|
import { addFusionPoints, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
|
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const clearDialogueHistoryController: RequestHandler = async (req, res) => {
|
export const clearDialogueHistoryController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
// example req.body: {"NewEpisodeReward":true,"crossPlaySetting":"ENABLED"}
|
// example req.body: {"NewEpisodeReward":true,"crossPlaySetting":"ENABLED"}
|
||||||
export const clearNewEpisodeRewardController: RequestHandler = (_req, res) => {
|
export const clearNewEpisodeRewardController: RequestHandler = (_req, res) => {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { checkCalendarAutoAdvance, getCalendarProgress, getInventory } from "@/src/services/inventoryService";
|
import { checkCalendarAutoAdvance, getCalendarProgress, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
|
||||||
import { getWorldState } from "@/src/services/worldStateService";
|
import { getWorldState } from "../../services/worldStateService.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
// GET request; query parameters: CompletedEventIdx=0&Iteration=4&Version=19&Season=CST_SUMMER
|
// GET request; query parameters: CompletedEventIdx=0&Iteration=4&Version=19&Season=CST_SUMMER
|
||||||
export const completeCalendarEventController: RequestHandler = async (req, res) => {
|
export const completeCalendarEventController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
|
import { addMiscItems, getInventory, updateCurrency } from "../../services/inventoryService.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { IVeiledRivenFingerprint } from "@/src/helpers/rivenHelper";
|
import type { IVeiledRivenFingerprint } from "../../helpers/rivenHelper.ts";
|
||||||
|
|
||||||
export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
|
export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
|
import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getAllianceClient } from "@/src/services/guildService";
|
import { getAllianceClient } from "../../services/guildService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const confirmAllianceInvitationController: RequestHandler = async (req, res) => {
|
export const confirmAllianceInvitationController: RequestHandler = async (req, res) => {
|
||||||
// Check requester is a warlord in their guild
|
// Check requester is a warlord in their guild
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
|
import { Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { Account } from "@/src/models/loginModel";
|
import { Account } from "../../models/loginModel.ts";
|
||||||
import {
|
import {
|
||||||
deleteGuild,
|
deleteGuild,
|
||||||
getGuildClient,
|
getGuildClient,
|
||||||
giveClanKey,
|
giveClanKey,
|
||||||
hasGuildPermission,
|
hasGuildPermission,
|
||||||
removeDojoKeyItems
|
removeDojoKeyItems
|
||||||
} from "@/src/services/guildService";
|
} from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getAccountIdForRequest, getSuffixedName } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
|
|
||||||
// GET request: A player accepting an invite they got in their inbox.
|
// GET request: A player accepting an invite they got in their inbox.
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
import { checkClanAscensionHasRequiredContributors } from "@/src/services/guildService";
|
import { checkClanAscensionHasRequiredContributors } from "../../services/guildService.ts";
|
||||||
import { addFusionPoints, getInventory } from "@/src/services/inventoryService";
|
import { addFusionPoints, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
|
|
||||||
export const contributeGuildClassController: RequestHandler = async (req, res) => {
|
export const contributeGuildClassController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
|
import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
|
||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
import { GuildMember } from "../../models/guildModel.ts";
|
||||||
|
import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
import {
|
import {
|
||||||
addGuildMemberMiscItemContribution,
|
addGuildMemberMiscItemContribution,
|
||||||
getDojoClient,
|
getDojoClient,
|
||||||
@ -8,14 +9,15 @@ import {
|
|||||||
processDojoBuildMaterialsGathered,
|
processDojoBuildMaterialsGathered,
|
||||||
scaleRequiredCount,
|
scaleRequiredCount,
|
||||||
setDojoRoomLogFunded
|
setDojoRoomLogFunded
|
||||||
} from "@/src/services/guildService";
|
} from "../../services/guildService.ts";
|
||||||
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
|
import { addMiscItems, getInventory, updateCurrency } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IDojoContributable, IGuildMemberDatabase } from "@/src/types/guildTypes";
|
import type { IDojoContributable, IGuildMemberDatabase } from "../../types/guildTypes.ts";
|
||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus";
|
import type { IDojoBuild } from "warframe-public-export-plus";
|
||||||
|
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||||
|
|
||||||
interface IContributeToDojoComponentRequest {
|
interface IContributeToDojoComponentRequest {
|
||||||
ComponentId: string;
|
ComponentId: string;
|
||||||
|
|||||||
@ -1,10 +1,5 @@
|
|||||||
import {
|
import type { TGuildDatabaseDocument, TGuildMemberDatabaseDocument } from "../../models/guildModel.ts";
|
||||||
Alliance,
|
import { Alliance, Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
Guild,
|
|
||||||
GuildMember,
|
|
||||||
TGuildDatabaseDocument,
|
|
||||||
TGuildMemberDatabaseDocument
|
|
||||||
} from "@/src/models/guildModel";
|
|
||||||
import {
|
import {
|
||||||
addGuildMemberMiscItemContribution,
|
addGuildMemberMiscItemContribution,
|
||||||
addGuildMemberShipDecoContribution,
|
addGuildMemberShipDecoContribution,
|
||||||
@ -12,18 +7,18 @@ import {
|
|||||||
addVaultMiscItems,
|
addVaultMiscItems,
|
||||||
addVaultShipDecos,
|
addVaultShipDecos,
|
||||||
getGuildForRequestEx
|
getGuildForRequestEx
|
||||||
} from "@/src/services/guildService";
|
} from "../../services/guildService.ts";
|
||||||
import {
|
import {
|
||||||
addFusionTreasures,
|
addFusionTreasures,
|
||||||
addMiscItems,
|
addMiscItems,
|
||||||
addShipDecorations,
|
addShipDecorations,
|
||||||
getInventory,
|
getInventory,
|
||||||
updateCurrency
|
updateCurrency
|
||||||
} from "@/src/services/inventoryService";
|
} from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { ITypeCount } from "@/src/types/commonTypes";
|
import type { ITypeCount } from "../../types/commonTypes.ts";
|
||||||
import { IFusionTreasure, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IFusionTreasure, IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const contributeToVaultController: RequestHandler = async (req, res) => {
|
export const contributeToVaultController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
|
import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getAllianceClient } from "@/src/services/guildService";
|
import { getAllianceClient } from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const createAllianceController: RequestHandler = async (req, res) => {
|
export const createAllianceController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,15 +1,27 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Guild, GuildMember } from "@/src/models/guildModel";
|
import { Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { createUniqueClanName, getGuildClient, giveClanKey } from "@/src/services/guildService";
|
import { createUniqueClanName, getGuildClient, giveClanKey } from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
import { sendWsBroadcastTo } from "../../services/wsService.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);
|
||||||
const payload = getJSONfromString<ICreateGuildRequest>(String(req.body));
|
const payload = getJSONfromString<ICreateGuildRequest>(String(req.body));
|
||||||
|
|
||||||
|
const inventory = await getInventory(account._id.toString(), "GuildId LevelKeys Recipes");
|
||||||
|
if (inventory.GuildId) {
|
||||||
|
const guild = await Guild.findById(inventory.GuildId);
|
||||||
|
if (guild) {
|
||||||
|
res.json({
|
||||||
|
...(await getGuildClient(guild, account))
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Remove pending applications for this account
|
// Remove pending applications for this account
|
||||||
await GuildMember.deleteMany({ accountId: account._id, status: 1 });
|
await GuildMember.deleteMany({ accountId: account._id, status: 1 });
|
||||||
|
|
||||||
@ -27,7 +39,6 @@ export const createGuildController: RequestHandler = async (req, res) => {
|
|||||||
rank: 0
|
rank: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
const inventory = await getInventory(account._id.toString(), "GuildId LevelKeys Recipes");
|
|
||||||
inventory.GuildId = guild._id;
|
inventory.GuildId = guild._id;
|
||||||
const inventoryChanges: IInventoryChanges = {};
|
const inventoryChanges: IInventoryChanges = {};
|
||||||
giveClanKey(inventory, inventoryChanges);
|
giveClanKey(inventory, inventoryChanges);
|
||||||
@ -37,6 +48,7 @@ export const createGuildController: RequestHandler = async (req, res) => {
|
|||||||
...(await getGuildClient(guild, account)),
|
...(await getGuildClient(guild, account)),
|
||||||
InventoryChanges: inventoryChanges
|
InventoryChanges: inventoryChanges
|
||||||
});
|
});
|
||||||
|
sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
interface ICreateGuildRequest {
|
interface ICreateGuildRequest {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
|
|
||||||
export const creditsController: RequestHandler = async (req, res) => {
|
export const creditsController: RequestHandler = async (req, res) => {
|
||||||
const inventory = (
|
const inventory = (
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
|
import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { ICrewMemberClient } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { ICrewMemberClient } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
|
|
||||||
export const crewMembersController: RequestHandler = async (req, res) => {
|
export const crewMembersController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addMiscItems, freeUpSlot, getInventory, updateCurrency } from "@/src/services/inventoryService";
|
import { addMiscItems, freeUpSlot, getInventory, updateCurrency } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import type { IOid } from "../../types/commonTypes.ts";
|
||||||
import { ICrewShipComponentFingerprint, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { ICrewShipComponentFingerprint } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
|
import { ExportCustoms, ExportDojoRecipes } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const crewShipFusionController: RequestHandler = async (req, res) => {
|
export const crewShipFusionController: RequestHandler = async (req, res) => {
|
||||||
@ -80,7 +81,7 @@ export const crewShipFusionController: RequestHandler = async (req, res) => {
|
|||||||
const newFval = (newPerc - rangeA[0]) / (rangeA[1] - rangeA[0]);
|
const newFval = (newPerc - rangeA[0]) / (rangeA[1] - rangeA[0]);
|
||||||
buffA.Value = Math.trunc(newFval * 0x3fffffff);
|
buffA.Value = Math.trunc(newFval * 0x3fffffff);
|
||||||
}
|
}
|
||||||
if (inferiorFingerprint.SubroutineIndex) {
|
if (inferiorFingerprint.SubroutineIndex !== undefined) {
|
||||||
const useSuperiorSubroutine = tierA < tierB ? !payload.UseSubroutineA : payload.UseSubroutineA;
|
const useSuperiorSubroutine = tierA < tierB ? !payload.UseSubroutineA : payload.UseSubroutineA;
|
||||||
if (!useSuperiorSubroutine) {
|
if (!useSuperiorSubroutine) {
|
||||||
fingerprint.SubroutineIndex = inferiorFingerprint.SubroutineIndex;
|
fingerprint.SubroutineIndex = inferiorFingerprint.SubroutineIndex;
|
||||||
|
|||||||
@ -3,16 +3,19 @@ import {
|
|||||||
addCrewShipRawSalvage,
|
addCrewShipRawSalvage,
|
||||||
getInventory,
|
getInventory,
|
||||||
addEquipment
|
addEquipment
|
||||||
} from "@/src/services/inventoryService";
|
} from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ICrewShipComponentFingerprint, IInnateDamageFingerprint } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type {
|
||||||
|
ICrewShipComponentFingerprint,
|
||||||
|
IInnateDamageFingerprint
|
||||||
|
} from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { ExportCustoms, ExportRailjackWeapons, ExportUpgrades } from "warframe-public-export-plus";
|
import { ExportCustoms, ExportRailjackWeapons, ExportUpgrades } from "warframe-public-export-plus";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { getRandomInt } from "@/src/services/rngService";
|
import { getRandomInt } from "../../services/rngService.ts";
|
||||||
import { IFingerprintStat } from "@/src/helpers/rivenHelper";
|
import type { IFingerprintStat } from "../../helpers/rivenHelper.ts";
|
||||||
import { IEquipmentDatabase } from "@/src/types/equipmentTypes";
|
import type { IEquipmentDatabase } from "../../types/equipmentTypes.ts";
|
||||||
|
|
||||||
export const crewShipIdentifySalvageController: RequestHandler = async (req, res) => {
|
export const crewShipIdentifySalvageController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
import { hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
|
import { hasAccessToDojo, hasGuildPermission } from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountForRequest, getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest, getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => {
|
export const customObstacleCourseLeaderboardController: RequestHandler = async (req, res) => {
|
||||||
const data = getJSONfromString<ICustomObstacleCourseLeaderboardRequest>(String(req.body));
|
const data = getJSONfromString<ICustomObstacleCourseLeaderboardRequest>(String(req.body));
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import { getGuildForRequest, hasGuildPermission } from "@/src/services/guildService";
|
import { getGuildForRequest, hasGuildPermission } from "../../services/guildService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission, IGuildRank } from "@/src/types/guildTypes";
|
import type { IGuildRank } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const customizeGuildRanksController: RequestHandler = async (req, res) => {
|
export const customizeGuildRanksController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { AllianceMember, GuildMember } from "@/src/models/guildModel";
|
import { AllianceMember, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const declineAllianceInviteController: RequestHandler = async (req, res) => {
|
export const declineAllianceInviteController: RequestHandler = async (req, res) => {
|
||||||
// Check requester is a warlord in their guild
|
// Check requester is a warlord in their guild
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { GuildMember } from "@/src/models/guildModel";
|
import { GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const declineGuildInviteController: RequestHandler = async (req, res) => {
|
export const declineGuildInviteController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountForRequest(req);
|
const accountId = await getAccountForRequest(req);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { deleteSession } from "@/src/managers/sessionManager";
|
import { deleteSession } from "../../managers/sessionManager.ts";
|
||||||
|
|
||||||
const deleteSessionController: RequestHandler = (_req, res) => {
|
const deleteSessionController: RequestHandler = (_req, res) => {
|
||||||
deleteSession(_req.query.sessionId as string);
|
deleteSession(_req.query.sessionId as string);
|
||||||
|
|||||||
@ -5,12 +5,12 @@ import {
|
|||||||
hasGuildPermission,
|
hasGuildPermission,
|
||||||
refundDojoDeco,
|
refundDojoDeco,
|
||||||
removeDojoDeco
|
removeDojoDeco
|
||||||
} from "@/src/services/guildService";
|
} from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const destroyDojoDecoController: RequestHandler = async (req, res) => {
|
export const destroyDojoDecoController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { Alliance, AllianceMember, Guild, GuildMember } from "@/src/models/guildModel";
|
import { Alliance, AllianceMember, Guild, GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { GuildPermission } from "@/src/types/guildTypes";
|
import { GuildPermission } from "../../types/guildTypes.ts";
|
||||||
import { parallelForeach } from "@/src/utils/async-utils";
|
import { parallelForeach } from "../../utils/async-utils.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
|
export const divvyAllianceVaultController: RequestHandler = async (req, res) => {
|
||||||
// Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
|
// Afaict, there's no way to put anything other than credits in the alliance vault (anymore?), so just no-op if this is not a request to divvy credits.
|
||||||
|
|||||||
@ -1,10 +1,17 @@
|
|||||||
import { GuildMember, TGuildDatabaseDocument } from "@/src/models/guildModel";
|
import type { TGuildDatabaseDocument } from "../../models/guildModel.ts";
|
||||||
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, scaleRequiredCount } from "@/src/services/guildService";
|
import { GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getInventory, updateCurrency } from "@/src/services/inventoryService";
|
import {
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
getDojoClient,
|
||||||
import { IDojoContributable } from "@/src/types/guildTypes";
|
getGuildForRequestEx,
|
||||||
import { RequestHandler } from "express";
|
hasAccessToDojo,
|
||||||
import { ExportDojoRecipes, IDojoBuild } from "warframe-public-export-plus";
|
scaleRequiredCount
|
||||||
|
} from "../../services/guildService.ts";
|
||||||
|
import { getInventory, updateCurrency } from "../../services/inventoryService.ts";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import type { IDojoContributable } from "../../types/guildTypes.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import type { IDojoBuild } from "warframe-public-export-plus";
|
||||||
|
import { ExportDojoRecipes } from "warframe-public-export-plus";
|
||||||
|
|
||||||
interface IDojoComponentRushRequest {
|
interface IDojoComponentRushRequest {
|
||||||
DecoType?: string;
|
DecoType?: string;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
// Arbiter Dojo endpoints, not really used by us as we don't provide a ContentURL.
|
// Arbiter Dojo endpoints, not really used by us as we don't provide a ContentURL.
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate, toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { config } from "@/src/services/configService";
|
import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
|
import { fromStoreItem } from "../../services/itemDataService.ts";
|
||||||
import { fromStoreItem } from "@/src/services/itemDataService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getRandomInt, getRandomWeightedRewardUc } from "../../services/rngService.ts";
|
||||||
import { getRandomInt, getRandomWeightedRewardUc } from "@/src/services/rngService";
|
import type { IMongoDate, IOid } from "../../types/commonTypes.ts";
|
||||||
import { IMongoDate, IOid } from "@/src/types/commonTypes";
|
import type { IDroneClient } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { RequestHandler } from "express";
|
||||||
import { RequestHandler } from "express";
|
|
||||||
import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";
|
import { ExportDrones, ExportResources, ExportSystems } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const dronesController: RequestHandler = async (req, res) => {
|
export const dronesController: RequestHandler = async (req, res) => {
|
||||||
@ -39,10 +38,13 @@ export const dronesController: RequestHandler = async (req, res) => {
|
|||||||
ActiveDrones: activeDrones
|
ActiveDrones: activeDrones
|
||||||
});
|
});
|
||||||
} else if ("droneId" in req.query && "systemIndex" in req.query) {
|
} else if ("droneId" in req.query && "systemIndex" in req.query) {
|
||||||
const inventory = await getInventory(accountId, "Drones");
|
const inventory = await getInventory(
|
||||||
|
accountId,
|
||||||
|
"Drones instantResourceExtractorDrones noResourceExtractorDronesDamage"
|
||||||
|
);
|
||||||
const drone = inventory.Drones.id(req.query.droneId as string)!;
|
const drone = inventory.Drones.id(req.query.droneId as string)!;
|
||||||
const droneMeta = ExportDrones[drone.ItemType];
|
const droneMeta = ExportDrones[drone.ItemType];
|
||||||
drone.DeployTime = config.instantResourceExtractorDrones ? new Date(0) : new Date();
|
drone.DeployTime = inventory.instantResourceExtractorDrones ? new Date(0) : new Date();
|
||||||
if (drone.RepairStart) {
|
if (drone.RepairStart) {
|
||||||
const repairMinutes = (Date.now() - drone.RepairStart.getTime()) / 60_000;
|
const repairMinutes = (Date.now() - drone.RepairStart.getTime()) / 60_000;
|
||||||
const hpPerMinute = droneMeta.repairRate / 60;
|
const hpPerMinute = droneMeta.repairRate / 60;
|
||||||
@ -51,11 +53,11 @@ export const dronesController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
drone.System = parseInt(req.query.systemIndex as string);
|
drone.System = parseInt(req.query.systemIndex as string);
|
||||||
const system = ExportSystems[drone.System - 1];
|
const system = ExportSystems[drone.System - 1];
|
||||||
drone.DamageTime = config.instantResourceExtractorDrones
|
drone.DamageTime = inventory.instantResourceExtractorDrones
|
||||||
? new Date()
|
? new Date()
|
||||||
: new Date(Date.now() + getRandomInt(3 * 3600 * 1000, 4 * 3600 * 1000));
|
: new Date(Date.now() + getRandomInt(3 * 3600 * 1000, 4 * 3600 * 1000));
|
||||||
drone.PendingDamage =
|
drone.PendingDamage =
|
||||||
!config.noResourceExtractorDronesDamage && Math.random() < system.damageChance
|
!inventory.noResourceExtractorDronesDamage && Math.random() < system.damageChance
|
||||||
? getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue)
|
? getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue)
|
||||||
: 0;
|
: 0;
|
||||||
const resource = getRandomWeightedRewardUc(system.resources, droneMeta.probabilities)!;
|
const resource = getRandomWeightedRewardUc(system.resources, droneMeta.probabilities)!;
|
||||||
|
|||||||
@ -1,13 +1,18 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { combineInventoryChanges, getInventory } from "@/src/services/inventoryService";
|
import { combineInventoryChanges, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { IEndlessXpReward, IInventoryClient, TEndlessXpCategory } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type {
|
||||||
import { logger } from "@/src/utils/logger";
|
IEndlessXpReward,
|
||||||
import { ExportRewards, ICountedStoreItem } from "warframe-public-export-plus";
|
IInventoryClient,
|
||||||
import { getRandomElement } from "@/src/services/rngService";
|
TEndlessXpCategory
|
||||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
} from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { ICountedStoreItem } from "warframe-public-export-plus";
|
||||||
|
import { ExportRewards } from "warframe-public-export-plus";
|
||||||
|
import { getRandomElement } from "../../services/rngService.ts";
|
||||||
|
import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
|
||||||
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
|
||||||
export const endlessXpController: RequestHandler = async (req, res) => {
|
export const endlessXpController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory, updateEntratiVault } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const entratiLabConquestModeController: RequestHandler = async (req, res) => {
|
export const entratiLabConquestModeController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -11,26 +11,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
|
|||||||
"EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
|
"EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission"
|
||||||
);
|
);
|
||||||
const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
|
const body = getJSONfromString<IEntratiLabConquestModeRequest>(String(req.body));
|
||||||
if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) {
|
updateEntratiVault(inventory);
|
||||||
const EPOCH = 1734307200 * 1000; // Mondays, amirite?
|
|
||||||
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
|
|
||||||
const week = Math.trunc(day / 7);
|
|
||||||
const weekStart = EPOCH + week * 604800000;
|
|
||||||
const weekEnd = weekStart + 604800000;
|
|
||||||
inventory.EntratiVaultCountLastPeriod = 0;
|
|
||||||
inventory.EntratiVaultCountResetDate = new Date(weekEnd);
|
|
||||||
if (inventory.EntratiLabConquestUnlocked) {
|
|
||||||
inventory.EntratiLabConquestUnlocked = 0;
|
|
||||||
inventory.EntratiLabConquestCacheScoreMission = 0;
|
|
||||||
inventory.EntratiLabConquestActiveFrameVariants = [];
|
|
||||||
}
|
|
||||||
if (inventory.EchoesHexConquestUnlocked) {
|
|
||||||
inventory.EchoesHexConquestUnlocked = 0;
|
|
||||||
inventory.EchoesHexConquestCacheScoreMission = 0;
|
|
||||||
inventory.EchoesHexConquestActiveFrameVariants = [];
|
|
||||||
inventory.EchoesHexConquestActiveStickers = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (body.BuyMode) {
|
if (body.BuyMode) {
|
||||||
inventory.EntratiVaultCountLastPeriod! += 2;
|
inventory.EntratiVaultCountLastPeriod! += 2;
|
||||||
if (body.IsEchoesDeepArchemedea) {
|
if (body.IsEchoesDeepArchemedea) {
|
||||||
@ -51,7 +32,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res)
|
|||||||
}
|
}
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
res.json({
|
res.json({
|
||||||
EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate),
|
EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate!),
|
||||||
EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
|
EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod,
|
||||||
EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
|
EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked,
|
||||||
EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
|
EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission,
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getRecipe, WeaponTypeInternal } from "@/src/services/itemDataService";
|
import type { WeaponTypeInternal } from "../../services/itemDataService.ts";
|
||||||
import { EquipmentFeatures } from "@/src/types/equipmentTypes";
|
import { getRecipe } from "../../services/itemDataService.ts";
|
||||||
|
import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
|
||||||
|
|
||||||
export const evolveWeaponController: RequestHandler = async (req, res) => {
|
export const evolveWeaponController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
62
src/controllers/api/feedPrinceController.ts
Normal file
62
src/controllers/api/feedPrinceController.ts
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import { addMiscItem, getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
|
import { logger } from "../../utils/logger.ts";
|
||||||
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
|
||||||
|
export const feedPrinceController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId, "MiscItems NokkoColony NodeIntrosCompleted");
|
||||||
|
const payload = getJSONfromString<IFeedPrinceRequest>(String(req.body));
|
||||||
|
|
||||||
|
switch (payload.Mode) {
|
||||||
|
case "r": {
|
||||||
|
inventory.NokkoColony ??= {
|
||||||
|
FeedLevel: 0,
|
||||||
|
JournalEntries: []
|
||||||
|
};
|
||||||
|
const InventoryChanges: IInventoryChanges = {};
|
||||||
|
inventory.NokkoColony.FeedLevel += payload.Amount;
|
||||||
|
if (
|
||||||
|
(!inventory.NodeIntrosCompleted.includes("CompletedVision1") && inventory.NokkoColony.FeedLevel > 20) ||
|
||||||
|
(!inventory.NodeIntrosCompleted.includes("CompletedVision2") && inventory.NokkoColony.FeedLevel > 60)
|
||||||
|
) {
|
||||||
|
res.json({
|
||||||
|
FeedSucceeded: false,
|
||||||
|
FeedLevel: inventory.NokkoColony.FeedLevel - payload.Amount,
|
||||||
|
InventoryChanges
|
||||||
|
} satisfies IFeedPrinceResponse);
|
||||||
|
} else {
|
||||||
|
addMiscItem(
|
||||||
|
inventory,
|
||||||
|
"/Lotus/Types/Items/MiscItems/MushroomFood",
|
||||||
|
payload.Amount * -1,
|
||||||
|
InventoryChanges
|
||||||
|
);
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
FeedSucceeded: true,
|
||||||
|
FeedLevel: inventory.NokkoColony.FeedLevel,
|
||||||
|
InventoryChanges
|
||||||
|
} satisfies IFeedPrinceResponse);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
logger.debug(`data provided to ${req.path}: ${String(req.body)}`);
|
||||||
|
throw new Error(`unknown feedPrince mode: ${payload.Mode}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IFeedPrinceRequest {
|
||||||
|
Mode: string; // r
|
||||||
|
Amount: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IFeedPrinceResponse {
|
||||||
|
FeedSucceeded: boolean;
|
||||||
|
FeedLevel: number;
|
||||||
|
InventoryChanges: IInventoryChanges;
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getSession } from "@/src/managers/sessionManager";
|
import { getSession } from "../../managers/sessionManager.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { IFindSessionRequest } from "@/src/types/session";
|
import type { IFindSessionRequest } from "../../types/session.ts";
|
||||||
|
|
||||||
export const findSessionsController: RequestHandler = (_req, res) => {
|
export const findSessionsController: RequestHandler = (_req, res) => {
|
||||||
const req = JSON.parse(String(_req.body)) as IFindSessionRequest;
|
const req = JSON.parse(String(_req.body)) as IFindSessionRequest;
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addMiscItems, addStanding, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItems, addStanding, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportResources } from "warframe-public-export-plus";
|
import { ExportResources } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const fishmongerController: RequestHandler = async (req, res) => {
|
export const fishmongerController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,22 +1,91 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory, addMiscItems, addEquipment, occupySlot } from "@/src/services/inventoryService";
|
import { getInventory, addMiscItems, addEquipment, occupySlot } from "../../services/inventoryService.ts";
|
||||||
import { IMiscItem, TFocusPolarity, TEquipmentKey, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem, TFocusPolarity, TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { ExportFocusUpgrades } from "warframe-public-export-plus";
|
import { ExportFocusUpgrades } from "warframe-public-export-plus";
|
||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
|
import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
|
import { version_compare } from "../../helpers/inventoryHelpers.ts";
|
||||||
|
|
||||||
export const focusController: RequestHandler = async (req, res) => {
|
export const focusController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
switch (req.query.op) {
|
|
||||||
|
let op = req.query.op as string;
|
||||||
|
const focus2 = account.BuildLabel && version_compare(account.BuildLabel, "2022.04.29.12.53") < 0;
|
||||||
|
if (focus2) {
|
||||||
|
// Focus 2.0
|
||||||
|
switch (req.query.op) {
|
||||||
|
case Focus2Operation.InstallLens:
|
||||||
|
op = "InstallLens";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.UnlockWay:
|
||||||
|
op = "UnlockWay";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.UnlockUpgrade:
|
||||||
|
op = "UnlockUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.IncreasePool:
|
||||||
|
op = "IncreasePool";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.LevelUpUpgrade:
|
||||||
|
op = "LevelUpUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.ActivateWay:
|
||||||
|
op = "ActivateWay";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.UpdateUpgrade:
|
||||||
|
op = "UpdateUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.SentTrainingAmplifier:
|
||||||
|
op = "SentTrainingAmplifier";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.UnbindUpgrade:
|
||||||
|
op = "UnbindUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus2Operation.ConvertShard:
|
||||||
|
op = "ConvertShard";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Focus 3.0
|
||||||
|
switch (req.query.op) {
|
||||||
|
case Focus3Operation.InstallLens:
|
||||||
|
op = "InstallLens";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.UnlockWay:
|
||||||
|
op = "UnlockWay";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.UnlockUpgrade:
|
||||||
|
op = "UnlockUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.LevelUpUpgrade:
|
||||||
|
op = "LevelUpUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.ActivateWay:
|
||||||
|
op = "ActivateWay";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.SentTrainingAmplifier:
|
||||||
|
op = "SentTrainingAmplifier";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.UnbindUpgrade:
|
||||||
|
op = "UnbindUpgrade";
|
||||||
|
break;
|
||||||
|
case Focus3Operation.ConvertShard:
|
||||||
|
op = "ConvertShard";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (op) {
|
||||||
default:
|
default:
|
||||||
logger.error("Unhandled focus op type: " + String(req.query.op));
|
logger.error("Unhandled focus op type: " + String(req.query.op));
|
||||||
logger.debug(String(req.body));
|
logger.debug(String(req.body));
|
||||||
res.end();
|
res.end();
|
||||||
break;
|
break;
|
||||||
case FocusOperation.InstallLens: {
|
case "InstallLens": {
|
||||||
const request = JSON.parse(String(req.body)) as ILensInstallRequest;
|
const request = JSON.parse(String(req.body)) as ILensInstallRequest;
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
const item = inventory[request.Category].id(request.WeaponId);
|
const item = inventory[request.Category].id(request.WeaponId);
|
||||||
if (item) {
|
if (item) {
|
||||||
item.FocusLens = request.LensType;
|
item.FocusLens = request.LensType;
|
||||||
@ -34,15 +103,15 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.UnlockWay: {
|
case "UnlockWay": {
|
||||||
const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
|
const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
|
||||||
const focusPolarity = focusTypeToPolarity(focusType);
|
const focusPolarity = focusTypeToPolarity(focusType);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString(), "FocusAbility FocusUpgrades FocusXP");
|
||||||
const cost = inventory.FocusAbility ? 50_000 : 0;
|
const cost = inventory.FocusAbility ? 50_000 : 0;
|
||||||
inventory.FocusAbility ??= focusType;
|
inventory.FocusAbility ??= focusType;
|
||||||
inventory.FocusUpgrades.push({ ItemType: focusType });
|
inventory.FocusUpgrades.push({ ItemType: focusType });
|
||||||
if (inventory.FocusXP) {
|
if (cost) {
|
||||||
inventory.FocusXP[focusPolarity]! -= cost;
|
inventory.FocusXP![focusPolarity]! -= cost;
|
||||||
}
|
}
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
res.json({
|
res.json({
|
||||||
@ -51,12 +120,29 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.ActivateWay: {
|
case "IncreasePool": {
|
||||||
|
const request = JSON.parse(String(req.body)) as IIncreasePoolRequest;
|
||||||
|
const focusPolarity = focusTypeToPolarity(request.FocusType);
|
||||||
|
const inventory = await getInventory(account._id.toString(), "FocusXP FocusCapacity");
|
||||||
|
let cost = 0;
|
||||||
|
for (let capacity = request.CurrentTotalCapacity; capacity != request.NewTotalCapacity; ++capacity) {
|
||||||
|
cost += increasePoolCost[capacity - 5];
|
||||||
|
}
|
||||||
|
inventory.FocusXP![focusPolarity]! -= cost;
|
||||||
|
inventory.FocusCapacity = request.NewTotalCapacity;
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
TotalCapacity: request.NewTotalCapacity,
|
||||||
|
FocusPointCosts: { [focusPolarity]: cost }
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "ActivateWay": {
|
||||||
const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
|
const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
|
||||||
|
|
||||||
await Inventory.updateOne(
|
await Inventory.updateOne(
|
||||||
{
|
{
|
||||||
accountOwnerId: accountId
|
accountOwnerId: account._id.toString()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
FocusAbility: focusType
|
FocusAbility: focusType
|
||||||
@ -68,13 +154,20 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.UnlockUpgrade: {
|
case "UnlockUpgrade": {
|
||||||
const request = JSON.parse(String(req.body)) as IUnlockUpgradeRequest;
|
const request = JSON.parse(String(req.body)) as IUnlockUpgradeRequest;
|
||||||
const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
|
const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
let cost = 0;
|
let cost = 0;
|
||||||
for (const focusType of request.FocusTypes) {
|
for (const focusType of request.FocusTypes) {
|
||||||
cost += ExportFocusUpgrades[focusType].baseFocusPointCost;
|
if (focusType in ExportFocusUpgrades) {
|
||||||
|
cost += ExportFocusUpgrades[focusType].baseFocusPointCost;
|
||||||
|
} else if (focusType == "/Lotus/Upgrades/Focus/Power/Residual/ChannelEfficiencyFocusUpgrade") {
|
||||||
|
// Zenurik's Inner Might (Focus 2.0)
|
||||||
|
cost += 50_000;
|
||||||
|
} else {
|
||||||
|
logger.warn(`unknown focus upgrade ${focusType}, will unlock it for free`);
|
||||||
|
}
|
||||||
inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 });
|
inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 });
|
||||||
}
|
}
|
||||||
inventory.FocusXP![focusPolarity]! -= cost;
|
inventory.FocusXP![focusPolarity]! -= cost;
|
||||||
@ -85,15 +178,20 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.LevelUpUpgrade: {
|
case "LevelUpUpgrade":
|
||||||
|
case "UpdateUpgrade": {
|
||||||
const request = JSON.parse(String(req.body)) as ILevelUpUpgradeRequest;
|
const request = JSON.parse(String(req.body)) as ILevelUpUpgradeRequest;
|
||||||
const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
|
const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
let cost = 0;
|
let cost = 0;
|
||||||
for (const focusUpgrade of request.FocusInfos) {
|
for (const focusUpgrade of request.FocusInfos) {
|
||||||
cost += focusUpgrade.FocusXpCost;
|
cost += focusUpgrade.FocusXpCost;
|
||||||
const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
|
const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
|
||||||
focusUpgradeDb.Level = focusUpgrade.Level;
|
if (op == "UpdateUpgrade") {
|
||||||
|
focusUpgradeDb.IsActive = focusUpgrade.IsActive;
|
||||||
|
} else {
|
||||||
|
focusUpgradeDb.Level = focusUpgrade.Level;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
inventory.FocusXP![focusPolarity]! -= cost;
|
inventory.FocusXP![focusPolarity]! -= cost;
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
@ -103,9 +201,9 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.SentTrainingAmplifier: {
|
case "SentTrainingAmplifier": {
|
||||||
const request = JSON.parse(String(req.body)) as ISentTrainingAmplifierRequest;
|
const request = JSON.parse(String(req.body)) as ISentTrainingAmplifierRequest;
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
const inventoryChanges = addEquipment(inventory, "OperatorAmps", request.StartingWeaponType, {
|
const inventoryChanges = addEquipment(inventory, "OperatorAmps", request.StartingWeaponType, {
|
||||||
ModularParts: [
|
ModularParts: [
|
||||||
"/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/SentAmpTrainingGrip",
|
"/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/SentAmpTrainingGrip",
|
||||||
@ -118,10 +216,10 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
res.json(inventoryChanges.OperatorAmps![0]);
|
res.json(inventoryChanges.OperatorAmps![0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.UnbindUpgrade: {
|
case "UnbindUpgrade": {
|
||||||
const request = JSON.parse(String(req.body)) as IUnbindUpgradeRequest;
|
const request = JSON.parse(String(req.body)) as IUnbindUpgradeRequest;
|
||||||
const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
|
const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
inventory.FocusXP![focusPolarity]! -= 750_000 * request.FocusTypes.length;
|
inventory.FocusXP![focusPolarity]! -= 750_000 * request.FocusTypes.length;
|
||||||
addMiscItems(inventory, [
|
addMiscItems(inventory, [
|
||||||
{
|
{
|
||||||
@ -148,7 +246,7 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FocusOperation.ConvertShard: {
|
case "ConvertShard": {
|
||||||
const request = JSON.parse(String(req.body)) as IConvertShardRequest;
|
const request = JSON.parse(String(req.body)) as IConvertShardRequest;
|
||||||
// Tally XP
|
// Tally XP
|
||||||
let xp = 0;
|
let xp = 0;
|
||||||
@ -166,7 +264,7 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
for (const shard of request.Shards) {
|
for (const shard of request.Shards) {
|
||||||
shard.ItemCount *= -1;
|
shard.ItemCount *= -1;
|
||||||
}
|
}
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(account._id.toString());
|
||||||
const polarity = request.Polarity;
|
const polarity = request.Polarity;
|
||||||
inventory.FocusXP ??= {};
|
inventory.FocusXP ??= {};
|
||||||
inventory.FocusXP[polarity] ??= 0;
|
inventory.FocusXP[polarity] ??= 0;
|
||||||
@ -178,7 +276,8 @@ export const focusController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FocusOperation {
|
// Focus 3.0
|
||||||
|
enum Focus3Operation {
|
||||||
InstallLens = "1",
|
InstallLens = "1",
|
||||||
UnlockWay = "2",
|
UnlockWay = "2",
|
||||||
UnlockUpgrade = "3",
|
UnlockUpgrade = "3",
|
||||||
@ -189,6 +288,20 @@ enum FocusOperation {
|
|||||||
ConvertShard = "9"
|
ConvertShard = "9"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Focus 2.0
|
||||||
|
enum Focus2Operation {
|
||||||
|
InstallLens = "1",
|
||||||
|
UnlockWay = "2",
|
||||||
|
UnlockUpgrade = "3",
|
||||||
|
IncreasePool = "4",
|
||||||
|
LevelUpUpgrade = "5",
|
||||||
|
ActivateWay = "6",
|
||||||
|
UpdateUpgrade = "7", // used to change the IsActive state, same format as ILevelUpUpgradeRequest
|
||||||
|
SentTrainingAmplifier = "9",
|
||||||
|
UnbindUpgrade = "10",
|
||||||
|
ConvertShard = "11"
|
||||||
|
}
|
||||||
|
|
||||||
// For UnlockWay & ActivateWay
|
// For UnlockWay & ActivateWay
|
||||||
interface IWayRequest {
|
interface IWayRequest {
|
||||||
FocusType: string;
|
FocusType: string;
|
||||||
@ -198,6 +311,13 @@ interface IUnlockUpgradeRequest {
|
|||||||
FocusTypes: string[];
|
FocusTypes: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Focus 2.0
|
||||||
|
interface IIncreasePoolRequest {
|
||||||
|
FocusType: string;
|
||||||
|
CurrentTotalCapacity: number;
|
||||||
|
NewTotalCapacity: number;
|
||||||
|
}
|
||||||
|
|
||||||
interface ILevelUpUpgradeRequest {
|
interface ILevelUpUpgradeRequest {
|
||||||
FocusInfos: {
|
FocusInfos: {
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
@ -205,6 +325,7 @@ interface ILevelUpUpgradeRequest {
|
|||||||
IsUniversal: boolean;
|
IsUniversal: boolean;
|
||||||
Level: number;
|
Level: number;
|
||||||
IsActiveAbility: boolean;
|
IsActiveAbility: boolean;
|
||||||
|
IsActive?: number; // Focus 2.0
|
||||||
}[];
|
}[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +351,7 @@ interface ILensInstallRequest {
|
|||||||
|
|
||||||
// Works for ways & upgrades
|
// Works for ways & upgrades
|
||||||
const focusTypeToPolarity = (type: string): TFocusPolarity => {
|
const focusTypeToPolarity = (type: string): TFocusPolarity => {
|
||||||
return ("AP_" + type.substr(1).split("/")[3].toUpperCase()) as TFocusPolarity;
|
return ("AP_" + type.substring(1).split("/")[3].toUpperCase()) as TFocusPolarity;
|
||||||
};
|
};
|
||||||
|
|
||||||
const shardValues = {
|
const shardValues = {
|
||||||
@ -239,3 +360,19 @@ const shardValues = {
|
|||||||
"/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantItem": 25_000,
|
"/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantItem": 25_000,
|
||||||
"/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantTierTwoItem": 40_000
|
"/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantTierTwoItem": 40_000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Starting at a capacity of 5 (Source: https://wiki.warframe.com/w/Focus_2.0)
|
||||||
|
const increasePoolCost = [
|
||||||
|
2576, 3099, 3638, 4190, 4755, 5331, 5918, 6514, 7120, 7734, 8357, 8988, 9626, 10271, 10923, 11582, 12247, 12918,
|
||||||
|
13595, 14277, 14965, 15659, 16357, 17061, 17769, 18482, 19200, 19922, 20649, 21380, 22115, 22854, 23597, 24344,
|
||||||
|
25095, 25850, 26609, 27371, 28136, 28905, 29678, 30454, 31233, 32015, 32801, 33590, 34382, 35176, 35974, 36775,
|
||||||
|
37579, 38386, 39195, 40008, 40823, 41641, 42461, 43284, 44110, 44938, 45769, 46603, 47439, 48277, 49118, 49961,
|
||||||
|
50807, 51655, 52505, 53357, 54212, 55069, 55929, 56790, 57654, 58520, 59388, 60258, 61130, 62005, 62881, 63759,
|
||||||
|
64640, 65522, 66407, 67293, 68182, 69072, 69964, 70858, 71754, 72652, 73552, 74453, 75357, 76262, 77169, 78078,
|
||||||
|
78988, 79900, 80814, 81730, 82648, 83567, 84488, 85410, 86334, 87260, 88188, 89117, 90047, 90980, 91914, 92849,
|
||||||
|
93786, 94725, 95665, 96607, 97550, 98495, 99441, 100389, 101338, 102289, 103241, 104195, 105150, 106107, 107065,
|
||||||
|
108024, 108985, 109948, 110911, 111877, 112843, 113811, 114780, 115751, 116723, 117696, 118671, 119647, 120624,
|
||||||
|
121603, 122583, 123564, 124547, 125531, 126516, 127503, 128490, 129479, 130470, 131461, 132454, 133448, 134443,
|
||||||
|
135440, 136438, 137437, 138437, 139438, 140441, 141444, 142449, 143455, 144463, 145471, 146481, 147492, 148503,
|
||||||
|
149517
|
||||||
|
];
|
||||||
|
|||||||
27
src/controllers/api/forceRemoveItemController.ts
Normal file
27
src/controllers/api/forceRemoveItemController.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import type { RequestHandler } from "express";
|
||||||
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
|
|
||||||
|
export const forceRemoveItemController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId, "MiscItems");
|
||||||
|
const body = getJSONfromString<IForceRemoveItemRequest>(String(req.body));
|
||||||
|
const inventoryChanges: IInventoryChanges = {};
|
||||||
|
for (const item of body.items) {
|
||||||
|
const index = inventory.MiscItems.findIndex(x => x.ItemType == item);
|
||||||
|
if (index != -1) {
|
||||||
|
inventoryChanges.MiscItems ??= [];
|
||||||
|
inventoryChanges.MiscItems.push({ ItemType: item, ItemCount: inventory.MiscItems[index].ItemCount * -1 });
|
||||||
|
|
||||||
|
inventory.MiscItems.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await inventory.save();
|
||||||
|
res.json({ InventoryChanges: inventoryChanges });
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IForceRemoveItemRequest {
|
||||||
|
items: string[];
|
||||||
|
}
|
||||||
@ -1,9 +1,9 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { ExportResources } from "warframe-public-export-plus";
|
import { ExportResources } from "warframe-public-export-plus";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { addFusionTreasures, addMiscItems, getInventory } from "@/src/services/inventoryService";
|
import { addFusionTreasures, addMiscItems, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { IMiscItem } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { parseFusionTreasure } from "@/src/helpers/inventoryHelpers";
|
import { parseFusionTreasure } from "../../helpers/inventoryHelpers.ts";
|
||||||
|
|
||||||
interface IFusionTreasureRequest {
|
interface IFusionTreasureRequest {
|
||||||
oldTreasureName: string;
|
oldTreasureName: string;
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addMiscItem, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItem, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { toStoreItem } from "@/src/services/itemDataService";
|
import { toStoreItem } from "../../services/itemDataService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
|
import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
|
||||||
import { IMongoDate } from "@/src/types/commonTypes";
|
import type { IMongoDate } from "../../types/commonTypes.ts";
|
||||||
import { IMissionReward } from "@/src/types/missionTypes";
|
import type { IMissionReward } from "../../types/missionTypes.ts";
|
||||||
import { IGardeningClient, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
|
import type { IGardeningClient, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { dict_en, ExportResources } from "warframe-public-export-plus";
|
import { dict_en, ExportResources } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const gardeningController: RequestHandler = async (req, res) => {
|
export const gardeningController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { updateGeneric } from "@/src/services/inventoryService";
|
import { updateGeneric } from "../../services/inventoryService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { IGenericUpdate } from "@/src/types/genericUpdate";
|
import type { IGenericUpdate } from "../../types/genericUpdate.ts";
|
||||||
|
|
||||||
// This endpoint used to be /api/genericUpdate.php, but sometime around the Jade Shadows update, it was changed to /api/updateNodeIntros.php.
|
// This endpoint used to be /api/genericUpdate.php, but sometime around the Jade Shadows update, it was changed to /api/updateNodeIntros.php.
|
||||||
// SpaceNinjaServer supports both endpoints right now.
|
// SpaceNinjaServer supports both endpoints right now.
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { Alliance, Guild } from "@/src/models/guildModel";
|
import { Alliance, Guild } from "../../models/guildModel.ts";
|
||||||
import { getAllianceClient } from "@/src/services/guildService";
|
import { getAllianceClient } from "../../services/guildService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getAllianceController: RequestHandler = async (req, res) => {
|
export const getAllianceController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { DailyDeal } from "@/src/models/worldStateModel";
|
import { DailyDeal } from "../../models/worldStateModel.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
|
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
|
||||||
const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
|
const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { Friendship } from "@/src/models/friendModel";
|
import { Friendship } from "../../models/friendModel.ts";
|
||||||
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "@/src/services/friendService";
|
import { addAccountDataToFriendInfo, addInventoryDataToFriendInfo } from "../../services/friendService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IFriendInfo } from "@/src/types/friendTypes";
|
import type { IFriendInfo } from "../../types/friendTypes.ts";
|
||||||
import { Request, RequestHandler, Response } from "express";
|
import type { Request, RequestHandler, Response } from "express";
|
||||||
|
|
||||||
// POST with {} instead of GET as of 38.5.0
|
// POST with {} instead of GET as of 38.5.0
|
||||||
export const getFriendsController: RequestHandler = async (req: Request, res: Response) => {
|
export const getFriendsController: RequestHandler = async (req: Request, res: Response) => {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { GuildMember } from "@/src/models/guildModel";
|
import { GuildMember } from "../../models/guildModel.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IGuildMemberClient } from "@/src/types/guildTypes";
|
import type { IGuildMemberClient } from "../../types/guildTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getGuildContributionsController: RequestHandler = async (req, res) => {
|
export const getGuildContributionsController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "../../utils/logger.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { createUniqueClanName, getGuildClient } from "@/src/services/guildService";
|
import { createUniqueClanName, getGuildClient } from "../../services/guildService.ts";
|
||||||
|
|
||||||
export const getGuildController: RequestHandler = async (req, res) => {
|
export const getGuildController: RequestHandler = async (req, res) => {
|
||||||
const account = await getAccountForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { Types } from "mongoose";
|
import { Types } from "mongoose";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
import { getDojoClient } from "@/src/services/guildService";
|
import { getDojoClient } from "../../services/guildService.ts";
|
||||||
import { Account } from "@/src/models/loginModel";
|
import { Account } from "../../models/loginModel.ts";
|
||||||
|
|
||||||
export const getGuildDojoController: RequestHandler = async (req, res) => {
|
export const getGuildDojoController: RequestHandler = async (req, res) => {
|
||||||
const guildId = req.query.guildId as string;
|
const guildId = req.query.guildId as string;
|
||||||
@ -19,7 +19,7 @@ export const getGuildDojoController: RequestHandler = async (req, res) => {
|
|||||||
_id: new Types.ObjectId(),
|
_id: new Types.ObjectId(),
|
||||||
pf: "/Lotus/Levels/ClanDojo/DojoHall.level",
|
pf: "/Lotus/Levels/ClanDojo/DojoHall.level",
|
||||||
ppf: "",
|
ppf: "",
|
||||||
CompletionTime: new Date(Date.now()),
|
CompletionTime: new Date(Date.now() - 1000),
|
||||||
DecoCapacity: 600
|
DecoCapacity: 600
|
||||||
});
|
});
|
||||||
await guild.save();
|
await guild.save();
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountForRequest } from "@/src/services/loginService";
|
import { getAccountForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
|
|
||||||
export const getGuildEventScoreController: RequestHandler = async (req, res) => {
|
export const getGuildEventScoreController: RequestHandler = async (req, res) => {
|
||||||
const account = await getAccountForRequest(req);
|
const account = await getAccountForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { Guild } from "@/src/models/guildModel";
|
import { Guild } from "../../models/guildModel.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IMongoDate } from "@/src/types/commonTypes";
|
import type { IMongoDate } from "../../types/commonTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getGuildLogController: RequestHandler = async (req, res) => {
|
export const getGuildLogController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { Account, Ignore } from "@/src/models/loginModel";
|
import { Account, Ignore } from "../../models/loginModel.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IFriendInfo } from "@/src/types/friendTypes";
|
import type { IFriendInfo } from "../../types/friendTypes.ts";
|
||||||
import { parallelForeach } from "@/src/utils/async-utils";
|
import { parallelForeach } from "../../utils/async-utils.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getIgnoredUsersController: RequestHandler = async (req, res) => {
|
export const getIgnoredUsersController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
|
import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { generateRewardSeed } from "@/src/services/rngService";
|
import { generateRewardSeed } from "../../services/rngService.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getNewRewardSeedController: RequestHandler = async (req, res) => {
|
export const getNewRewardSeedController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { EPOCH, getSeasonChallengePools, getWorldState, pushWeeklyActs } from "@/src/services/worldStateService";
|
import { getSeasonChallengePools, getWorldState, pushWeeklyActs } from "../../services/worldStateService.ts";
|
||||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
import { EPOCH, unixTimesInMs } from "../../constants/timeConstants.ts";
|
||||||
import { ISeasonChallenge } from "@/src/types/worldStateTypes";
|
import type { ISeasonChallenge } from "../../types/worldStateTypes.ts";
|
||||||
import { ExportChallenges } from "warframe-public-export-plus";
|
import { ExportChallenges } from "warframe-public-export-plus";
|
||||||
|
|
||||||
export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
|
export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { config } from "@/src/services/configService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import allShipFeatures from "@/static/fixed_responses/allShipFeatures.json";
|
import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import type { IGetShipResponse, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
|
||||||
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
|
import { getLoadout } from "../../services/loadoutService.ts";
|
||||||
import { IGetShipResponse, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
|
import { toOid } from "../../helpers/inventoryHelpers.ts";
|
||||||
import { getLoadout } from "@/src/services/loadoutService";
|
|
||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
|
|
||||||
|
|
||||||
export const getShipController: RequestHandler = async (req, res) => {
|
export const getShipController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -31,9 +29,5 @@ export const getShipController: RequestHandler = async (req, res) => {
|
|||||||
TailorShop: personalRooms.TailorShop
|
TailorShop: personalRooms.TailorShop
|
||||||
};
|
};
|
||||||
|
|
||||||
if (config.unlockAllShipFeatures) {
|
|
||||||
getShipResponse.Ship.Features = allShipFeatures;
|
|
||||||
}
|
|
||||||
|
|
||||||
res.json(getShipResponse);
|
res.json(getShipResponse);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { applyStandingToVendorManifest, getVendorManifestByTypeName } from "@/src/services/serversideVendorsService";
|
import { applyStandingToVendorManifest, getVendorManifestByTypeName } from "../../services/serversideVendorsService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { config } from "@/src/services/configService";
|
import { config } from "../../services/configService.ts";
|
||||||
|
|
||||||
export const getVendorInfoController: RequestHandler = async (req, res) => {
|
export const getVendorInfoController: RequestHandler = async (req, res) => {
|
||||||
let manifest = getVendorManifestByTypeName(req.query.vendor as string);
|
let manifest = getVendorManifestByTypeName(req.query.vendor as string);
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { crackRelic } from "@/src/helpers/relicHelper";
|
import { crackRelic } from "../../helpers/relicHelper.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IVoidTearParticipantInfo } from "@/src/types/requestTypes";
|
import type { IVoidTearParticipantInfo } from "../../types/requestTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => {
|
export const getVoidProjectionRewardsController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -11,7 +11,11 @@ export const getVoidProjectionRewardsController: RequestHandler = async (req, re
|
|||||||
|
|
||||||
if (data.ParticipantInfo.QualifiesForReward && !data.ParticipantInfo.HaveRewardResponse) {
|
if (data.ParticipantInfo.QualifiesForReward && !data.ParticipantInfo.HaveRewardResponse) {
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
await crackRelic(inventory, data.ParticipantInfo);
|
const reward = await crackRelic(inventory, data.ParticipantInfo);
|
||||||
|
if (!inventory.MissionRelicRewards || inventory.MissionRelicRewards.length >= data.CurrentWave) {
|
||||||
|
inventory.MissionRelicRewards = [];
|
||||||
|
}
|
||||||
|
inventory.MissionRelicRewards.push({ ItemType: reward.type, ItemCount: reward.itemCount });
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +1,19 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { Account } from "@/src/models/loginModel";
|
import { Account } from "../../models/loginModel.ts";
|
||||||
import { areFriends } from "@/src/services/friendService";
|
import { areFriends } from "../../services/friendService.ts";
|
||||||
import { createMessage } from "@/src/services/inboxService";
|
import { createMessage } from "../../services/inboxService.ts";
|
||||||
import {
|
import {
|
||||||
combineInventoryChanges,
|
combineInventoryChanges,
|
||||||
getEffectiveAvatarImageType,
|
getEffectiveAvatarImageType,
|
||||||
getInventory,
|
getInventory,
|
||||||
updateCurrency
|
updateCurrency
|
||||||
} from "@/src/services/inventoryService";
|
} from "../../services/inventoryService.ts";
|
||||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
|
import { getAccountForRequest, getSuffixedName } from "../../services/loginService.ts";
|
||||||
import { handleDailyDealPurchase, handleStoreItemAcquisition } from "@/src/services/purchaseService";
|
import { handleDailyDealPurchase, handleStoreItemAcquisition } from "../../services/purchaseService.ts";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import type { IOid } from "../../types/commonTypes.ts";
|
||||||
import { IPurchaseParams, IPurchaseResponse, PurchaseSource } from "@/src/types/purchaseTypes";
|
import type { IPurchaseParams, IPurchaseResponse } from "../../types/purchaseTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import { PurchaseSource } from "../../types/purchaseTypes.ts";
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
|
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
|
||||||
|
|
||||||
const checkPurchaseParams = (params: IPurchaseParams): boolean => {
|
const checkPurchaseParams = (params: IPurchaseParams): boolean => {
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { sendWsBroadcastTo } from "@/src/services/wsService";
|
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
|
import { addMiscItems, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
|
import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
|
||||||
import { ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
import type { ArtifactPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
|
||||||
import { ExportRecipes } from "warframe-public-export-plus";
|
import { ExportRecipes } from "warframe-public-export-plus";
|
||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
|
||||||
import { EquipmentFeatures, IEquipmentClient } from "@/src/types/equipmentTypes";
|
import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
|
||||||
|
import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
|
||||||
|
|
||||||
interface IGildWeaponRequest {
|
interface IGildWeaponRequest {
|
||||||
ItemName: string;
|
ItemName: string;
|
||||||
@ -74,5 +75,5 @@ export const gildWeaponController: RequestHandler = async (req, res) => {
|
|||||||
InventoryChanges: inventoryChanges,
|
InventoryChanges: inventoryChanges,
|
||||||
AffiliationMods: affiliationMods
|
AffiliationMods: affiliationMods
|
||||||
});
|
});
|
||||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
broadcastInventoryUpdate(req);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,16 +1,17 @@
|
|||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
import { parseString } from "@/src/helpers/general";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { giveKeyChainItem } from "../../services/questService.ts";
|
||||||
import { giveKeyChainItem } from "@/src/services/questService";
|
import type { IKeyChainRequest } from "../../types/requestTypes.ts";
|
||||||
import { IKeyChainRequest } from "@/src/types/requestTypes";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
|
|
||||||
export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
|
export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
|
||||||
const accountId = parseString(req.query.accountId);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const keyChainInfo = getJSONfromString<IKeyChainRequest>((req.body as string).toString());
|
const keyChainInfo = getJSONfromString<IKeyChainRequest>((req.body as string).toString());
|
||||||
|
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
const inventoryChanges = await giveKeyChainItem(inventory, keyChainInfo);
|
const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain)!;
|
||||||
|
const inventoryChanges = await giveKeyChainItem(inventory, keyChainInfo, questKey);
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
|
||||||
res.send(inventoryChanges);
|
res.send(inventoryChanges);
|
||||||
|
|||||||
@ -1,15 +1,16 @@
|
|||||||
import { getInventory } from "@/src/services/inventoryService";
|
import { getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { giveKeyChainMessage } from "@/src/services/questService";
|
import { giveKeyChainMessage } from "../../services/questService.ts";
|
||||||
import { IKeyChainRequest } from "@/src/types/requestTypes";
|
import type { IKeyChainRequest } from "../../types/requestTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
|
export const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const keyChainInfo = JSON.parse((req.body as Buffer).toString()) as IKeyChainRequest;
|
const keyChainInfo = JSON.parse((req.body as Buffer).toString()) as IKeyChainRequest;
|
||||||
|
|
||||||
const inventory = await getInventory(accountId, "QuestKeys");
|
const inventory = await getInventory(accountId, "QuestKeys accountOwnerId");
|
||||||
await giveKeyChainMessage(inventory, accountId, keyChainInfo);
|
const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain)!;
|
||||||
|
await giveKeyChainMessage(inventory, keyChainInfo, questKey);
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
|
||||||
res.send(1);
|
res.send(1);
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
||||||
import { addItem, getInventory } from "@/src/services/inventoryService";
|
import { addItem, getInventory } from "../../services/inventoryService.ts";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
||||||
import { IOid } from "@/src/types/commonTypes";
|
import type { IOid } from "../../types/commonTypes.ts";
|
||||||
import { RequestHandler } from "express";
|
import type { RequestHandler } from "express";
|
||||||
|
|
||||||
export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {
|
export const giveQuestKeyRewardController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user