From ac377024684cb008042bcde7d21e08edb824b72b Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 26 Apr 2025 11:56:16 -0700 Subject: [PATCH] feat(webui): add missing max rank mods (#1863) Closes #916 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1863 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- .../custom/addMissingMaxRankModsController.ts | 44 +++++++++++++++++++ src/routes/custom.ts | 2 + static/webui/index.html | 3 +- static/webui/script.js | 8 ++++ static/webui/translations/de.js | 3 +- static/webui/translations/en.js | 3 +- static/webui/translations/es.js | 3 +- static/webui/translations/fr.js | 3 +- static/webui/translations/ru.js | 3 +- static/webui/translations/zh.js | 3 +- 10 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 src/controllers/custom/addMissingMaxRankModsController.ts diff --git a/src/controllers/custom/addMissingMaxRankModsController.ts b/src/controllers/custom/addMissingMaxRankModsController.ts new file mode 100644 index 00000000..99cd09ec --- /dev/null +++ b/src/controllers/custom/addMissingMaxRankModsController.ts @@ -0,0 +1,44 @@ +import { getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { RequestHandler } from "express"; +import { ExportArcanes, ExportUpgrades } from "warframe-public-export-plus"; + +export const addMissingMaxRankModsController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId, "Upgrades"); + + const maxOwnedRanks: Record = {}; + for (const upgrade of inventory.Upgrades) { + const fingerprint = JSON.parse(upgrade.UpgradeFingerprint ?? "{}") as { lvl?: number }; + if (fingerprint.lvl) { + maxOwnedRanks[upgrade.ItemType] ??= 0; + if (fingerprint.lvl > maxOwnedRanks[upgrade.ItemType]) { + maxOwnedRanks[upgrade.ItemType] = fingerprint.lvl; + } + } + } + + for (const [uniqueName, data] of Object.entries(ExportUpgrades)) { + if (data.fusionLimit != 0 && data.type != "PARAZON" && maxOwnedRanks[uniqueName] != data.fusionLimit) { + inventory.Upgrades.push({ + ItemType: uniqueName, + UpgradeFingerprint: JSON.stringify({ lvl: data.fusionLimit }) + }); + } + } + + for (const [uniqueName, data] of Object.entries(ExportArcanes)) { + if ( + data.name != "/Lotus/Language/Items/GenericCosmeticEnhancerName" && + maxOwnedRanks[uniqueName] != data.fusionLimit + ) { + inventory.Upgrades.push({ + ItemType: uniqueName, + UpgradeFingerprint: JSON.stringify({ lvl: data.fusionLimit }) + }); + } + } + + await inventory.save(); + res.end(); +}; diff --git a/src/routes/custom.ts b/src/routes/custom.ts index e555ef46..8411d996 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -10,6 +10,7 @@ import { getAccountInfoController } from "@/src/controllers/custom/getAccountInf import { renameAccountController } from "@/src/controllers/custom/renameAccountController"; import { ircDroppedController } from "@/src/controllers/custom/ircDroppedController"; import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAllIntrinsicsController"; +import { addMissingMaxRankModsController } from "@/src/controllers/custom/addMissingMaxRankModsController"; import { createAccountController } from "@/src/controllers/custom/createAccountController"; import { createMessageController } from "@/src/controllers/custom/createMessageController"; @@ -35,6 +36,7 @@ customRouter.get("/getAccountInfo", getAccountInfoController); customRouter.get("/renameAccount", renameAccountController); customRouter.get("/ircDropped", ircDroppedController); customRouter.get("/unlockAllIntrinsics", unlockAllIntrinsicsController); +customRouter.get("/addMissingMaxRankMods", addMissingMaxRankModsController); customRouter.post("/createAccount", createAccountController); customRouter.post("/createMessage", createMessageController); diff --git a/static/webui/index.html b/static/webui/index.html index d01d49ec..5210cd66 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -510,8 +510,9 @@
- + +
diff --git a/static/webui/script.js b/static/webui/script.js index 79b671d0..b7c63fdf 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -1795,6 +1795,14 @@ function doRemoveUnrankedMods() { }); } +function doAddMissingMaxRankMods() { + revalidateAuthz(() => { + fetch("/custom/addMissingMaxRankMods?" + window.authz).then(() => { + updateInventory(); + }); + }); +} + // Powersuit Route single.getRoute("#powersuit-route").on("beforeload", function () { diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 47291541..7b21eac2 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -120,8 +120,9 @@ dict = { mods_fingerprintHelp: `Benötigst du Hilfe mit dem Fingerabdruck?`, mods_rivens: `Rivens`, mods_mods: `Mods`, - mods_bulkAddMods: `Fehlende Mods hinzufügen`, + mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`, mods_removeUnranked: `Mods ohne Rang entfernen`, + mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`, cheats_administratorRequirement: `Du musst Administrator sein, um diese Funktion nutzen zu können. Um Administrator zu werden, füge |DISPLAYNAME| zu administratorNames in der config.json hinzu.`, cheats_server: `Server`, cheats_skipTutorial: `Tutorial überspringen`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 3fe369a7..a2c3f312 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -119,8 +119,9 @@ dict = { mods_fingerprintHelp: `Need help with the fingerprint?`, mods_rivens: `Rivens`, mods_mods: `Mods`, - mods_bulkAddMods: `Add Missing Mods`, + mods_addMissingUnrankedMods: `Add Missing Unranked Mods`, mods_removeUnranked: `Remove Unranked Mods`, + mods_addMissingMaxRankMods: `Add Missing Max Rank Mods`, cheats_administratorRequirement: `You must be an administrator to use this feature. To become an administrator, add |DISPLAYNAME| to administratorNames in the config.json.`, cheats_server: `Server`, cheats_skipTutorial: `Skip Tutorial`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index a2b29f0c..e7079188 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -120,8 +120,9 @@ dict = { mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`, mods_rivens: `Agrietados`, mods_mods: `Mods`, - mods_bulkAddMods: `Agregar mods faltantes`, + mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`, mods_removeUnranked: `Quitar mods sin rango`, + mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`, cheats_administratorRequirement: `Debes ser administrador para usar esta función. Para convertirte en administrador, agrega |DISPLAYNAME| a administratorNames en el archivo config.json.`, cheats_server: `Servidor`, cheats_skipTutorial: `Omitir tutorial`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 4f2bead1..e8c6f369 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -120,8 +120,9 @@ dict = { mods_fingerprintHelp: `Besoin d'aide pour l'empreinte ?`, mods_rivens: `Rivens`, mods_mods: `Mods`, - mods_bulkAddMods: `Ajouter les mods manquants`, + mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`, mods_removeUnranked: `[UNTRANSLATED] Remove Unranked Mods`, + mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`, cheats_administratorRequirement: `Rôle d'administrateur requis pour cette fonctionnalité. Ajoutez |DISPLAYNAME| à la ligne administratorNames dans le fichier config.json.`, cheats_server: `Serveur`, cheats_skipTutorial: `Passer le tutoriel`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 4a4b658d..919dc13b 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -120,8 +120,9 @@ dict = { mods_fingerprintHelp: `Нужна помощь с отпечатком?`, mods_rivens: `Моды Разлома`, mods_mods: `Моды`, - mods_bulkAddMods: `Добавить отсутствующие моды`, + mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`, mods_removeUnranked: `[UNTRANSLATED] Remove Unranked Mods`, + mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`, cheats_administratorRequirement: `Вы должны быть администратором для использования этой функции. Чтобы стать администратором, добавьте \"|DISPLAYNAME|\" в administratorNames в config.json.`, cheats_server: `Сервер`, cheats_skipTutorial: `Пропустить обучение`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index c7d17e67..4148d86b 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -120,8 +120,9 @@ dict = { mods_fingerprintHelp: `需要印记相关的帮助?`, mods_rivens: `裂罅MOD`, mods_mods: `Mods`, - mods_bulkAddMods: `添加缺失MOD`, + mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`, mods_removeUnranked: `[UNTRANSLATED] Remove Unranked Mods`, + mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`, cheats_administratorRequirement: `您必须是管理员才能使用此功能。要成为管理员,请将 |DISPLAYNAME| 添加到 config.json 的 administratorNames 中。`, cheats_server: `服务器`, cheats_skipTutorial: `跳过教程`,