diff --git a/config.json.example b/config.json.example index 9287091c..78eac7a1 100644 --- a/config.json.example +++ b/config.json.example @@ -13,7 +13,6 @@ "skipTutorial": false, "skipAllDialogue": false, "unlockAllScans": false, - "unlockAllMissions": false, "infiniteCredits": false, "infinitePlatinum": false, "infiniteEndo": false, diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index cdaf8d4d..ed4b8cff 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -6,13 +6,7 @@ import allDialogue from "@/static/fixed_responses/allDialogue.json"; import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes"; import { IInventoryClient, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes"; import { IPolarity, ArtifactPolarity, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes"; -import { - ExportCustoms, - ExportFlavour, - ExportRegions, - ExportResources, - ExportVirtuals -} from "warframe-public-export-plus"; +import { ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus"; import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService"; import { addMiscItems, @@ -22,7 +16,7 @@ import { generateRewardSeed } from "@/src/services/inventoryService"; import { logger } from "@/src/utils/logger"; -import { catBreadHash } from "@/src/helpers/stringHelpers"; +import { addString, catBreadHash } from "@/src/helpers/stringHelpers"; import { Types } from "mongoose"; import { getNemesisManifest } from "@/src/helpers/nemesisHelpers"; import { getPersonalRooms } from "@/src/services/personalRoomsService"; @@ -167,18 +161,6 @@ export const getInventoryResponse = async ( } } - if (config.unlockAllMissions) { - inventoryResponse.Missions = []; - for (const tag of Object.keys(ExportRegions)) { - inventoryResponse.Missions.push({ - Completes: 1, - Tier: 1, - Tag: tag - }); - } - addString(inventoryResponse.NodeIntrosCompleted, "TeshinHardModeUnlocked"); - } - if (config.unlockAllShipDecorations) { inventoryResponse.ShipDecorations = []; for (const [uniqueName, item] of Object.entries(ExportResources)) { @@ -362,12 +344,6 @@ const allEudicoHeistJobs = [ "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour" ]; -const addString = (arr: string[], str: string): void => { - if (arr.indexOf(str) == -1) { - arr.push(str); - } -}; - const getExpRequiredForMr = (rank: number): number => { if (rank <= 30) { return 2500 * rank * rank; diff --git a/src/controllers/custom/completeAllMissionsController.ts b/src/controllers/custom/completeAllMissionsController.ts new file mode 100644 index 00000000..2e7ac2fb --- /dev/null +++ b/src/controllers/custom/completeAllMissionsController.ts @@ -0,0 +1,34 @@ +import { addString } from "@/src/helpers/stringHelpers"; +import { getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { addFixedLevelRewards } from "@/src/services/missionInventoryUpdateService"; +import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; +import { IMissionReward } from "@/src/types/missionTypes"; +import { RequestHandler } from "express"; +import { ExportRegions } from "warframe-public-export-plus"; + +export const completeAllMissionsController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId); + const MissionRewards: IMissionReward[] = []; + for (const [tag, node] of Object.entries(ExportRegions)) { + if (!inventory.Missions.find(x => x.Tag == tag)) { + inventory.Missions.push({ + Completes: 1, + Tier: 1, + Tag: tag + }); + + if (node.missionReward) { + console.log(node.missionReward); + addFixedLevelRewards(node.missionReward, inventory, MissionRewards); + } + } + } + for (const reward of MissionRewards) { + await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true); + } + addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked"); + await inventory.save(); + res.end(); +}; diff --git a/src/helpers/stringHelpers.ts b/src/helpers/stringHelpers.ts index 06d2ac28..3512c1ea 100644 --- a/src/helpers/stringHelpers.ts +++ b/src/helpers/stringHelpers.ts @@ -54,3 +54,9 @@ export const regexEscape = (str: string): string => { str = str.split("}").join("\\}"); return str; }; + +export const addString = (arr: string[], str: string): void => { + if (arr.indexOf(str) == -1) { + arr.push(str); + } +}; diff --git a/src/routes/custom.ts b/src/routes/custom.ts index 75eb80a4..35d89d4d 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -12,6 +12,7 @@ import { ircDroppedController } from "@/src/controllers/custom/ircDroppedControl import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAllIntrinsicsController"; import { addMissingMaxRankModsController } from "@/src/controllers/custom/addMissingMaxRankModsController"; import { webuiFileChangeDetectedController } from "@/src/controllers/custom/webuiFileChangeDetectedController"; +import { completeAllMissionsController } from "@/src/controllers/custom/completeAllMissionsController"; import { createAccountController } from "@/src/controllers/custom/createAccountController"; import { createMessageController } from "@/src/controllers/custom/createMessageController"; @@ -40,6 +41,7 @@ customRouter.get("/ircDropped", ircDroppedController); customRouter.get("/unlockAllIntrinsics", unlockAllIntrinsicsController); customRouter.get("/addMissingMaxRankMods", addMissingMaxRankModsController); customRouter.get("/webuiFileChangeDetected", webuiFileChangeDetectedController); +customRouter.get("/completeAllMissions", completeAllMissionsController); customRouter.post("/createAccount", createAccountController); customRouter.post("/createMessage", createMessageController); diff --git a/src/services/configService.ts b/src/services/configService.ts index 6ef2e96f..79d76d73 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -19,7 +19,6 @@ export interface IConfig { skipTutorial?: boolean; skipAllDialogue?: boolean; unlockAllScans?: boolean; - unlockAllMissions?: boolean; infiniteCredits?: boolean; infinitePlatinum?: boolean; infiniteEndo?: boolean; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 499115f9..e903f9de 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1367,7 +1367,7 @@ export const addFixedLevelRewards = ( if (rewards.countedItems) { for (const item of rewards.countedItems) { MissionRewards.push({ - StoreItem: `/Lotus/StoreItems${item.ItemType.substring("Lotus/".length)}`, + StoreItem: toStoreItem(item.ItemType), ItemCount: item.ItemCount }); } diff --git a/static/webui/index.html b/static/webui/index.html index 1a748968..dca46e9d 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -452,9 +452,6 @@ -
- -
@@ -587,10 +584,6 @@ -
- - -
@@ -782,9 +775,11 @@
+ +
diff --git a/static/webui/script.js b/static/webui/script.js index 1f1e86dd..110dd1a8 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -114,11 +114,9 @@ function doLogin() { window.registerSubmit = false; } -function revalidateAuthz(succ_cb) { - getWebSocket().then(() => { - // We have a websocket connection, so authz should be good. - succ_cb(); - }); +async function revalidateAuthz() { + await getWebSocket(); + // We have a websocket connection, so authz should be good. } function logout() { @@ -138,7 +136,7 @@ function doLogout() { function renameAccount() { const newname = window.prompt(loc("code_changeNameConfirm")); if (newname) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { fetch("/custom/renameAccount?" + window.authz + "&newname=" + newname).then(() => { $(".displayname").text(newname); updateLocElements(); @@ -149,7 +147,7 @@ function renameAccount() { function deleteAccount() { if (window.confirm(loc("code_deleteAccountConfirm"))) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { fetch("/custom/deleteAccount?" + window.authz).then(() => { logout(); single.loadRoute("/webui/"); // Show login screen @@ -649,7 +647,7 @@ function updateInventory() { a.href = "#"; a.onclick = function (event) { event.preventDefault(); - revalidateAuthz(() => { + revalidateAuthz().then(() => { const promises = []; if (item.XP < maxXP) { promises.push(addGearExp(category, item.ItemId.$oid, maxXP - item.XP)); @@ -1239,7 +1237,7 @@ function doAcquireEquipment(category) { .focus(); return; } - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.post({ url: "/custom/addItems?" + window.authz, contentType: "application/json", @@ -1366,7 +1364,7 @@ function doAcquireModularEquipment(category, WeaponType) { } }); if (category == "KubrowPets") Parts.unshift(WeaponType); - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.post({ url: "/api/modularWeaponCrafting.php?" + window.authz, contentType: "application/octet-stream", @@ -1419,7 +1417,7 @@ $("input[list]").on("input", function () { }); function dispatchAddItemsRequestsBatch(requests) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.post({ url: "/custom/addItems?" + window.authz, contentType: "application/json", @@ -1463,7 +1461,7 @@ function addMissingEvolutionProgress() { } function maxRankAllEvolutions() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1"); req.done(data => { const requests = []; @@ -1487,7 +1485,7 @@ function maxRankAllEvolutions() { } function maxRankAllEquipment(categories) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1"); req.done(data => { window.itemListPromise.then(itemMap => { @@ -1561,7 +1559,7 @@ function addGearExp(category, oid, xp) { } function sendBatchGearExp(data) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/addXp?" + window.authz, contentType: "application/json", @@ -1574,7 +1572,7 @@ function sendBatchGearExp(data) { } function renameGear(category, oid, name) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { if (category == "KubrowPets") { $.post({ url: "/api/renamePet.php?" + window.authz + "&webui=1", @@ -1602,7 +1600,7 @@ function renameGear(category, oid, name) { function disposeOfGear(category, oid) { if (category == "KubrowPets") { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/releasePet.php?" + window.authz, contentType: "application/octet-stream", @@ -1624,7 +1622,7 @@ function disposeOfGear(category, oid) { Count: 0 } ]; - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/sell.php?" + window.authz, contentType: "text/plain", @@ -1646,7 +1644,7 @@ function disposeOfItems(category, type, count) { Count: count } ]; - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/sell.php?" + window.authz, contentType: "text/plain", @@ -1656,7 +1654,7 @@ function disposeOfItems(category, type, count) { } function gildEquipment(category, oid) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/gildWeapon.php?" + window.authz + "&ItemId=" + oid + "&Category=" + category, contentType: "application/octet-stream", @@ -1670,7 +1668,7 @@ function gildEquipment(category, oid) { } function maturePet(oid, revert) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/maturePet.php?" + window.authz, contentType: "application/octet-stream", @@ -1685,7 +1683,7 @@ function maturePet(oid, revert) { } function setEvolutionProgress(requests) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.post({ url: "/custom/setEvolutionProgress?" + window.authz, contentType: "application/json", @@ -1705,7 +1703,7 @@ function doAcquireMiscItems() { } const count = parseInt($("#miscitem-count").val()); if (count != 0) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/addItems?" + window.authz, contentType: "application/json", @@ -1746,7 +1744,7 @@ function doAcquireRiven() { return; } const uniqueName = "/Lotus/Upgrades/Mods/Randomized/" + $("#addriven-type").val(); - revalidateAuthz(() => { + revalidateAuthz().then(() => { // Add riven type to inventory $.post({ url: "/custom/addItems?" + window.authz, @@ -1793,7 +1791,7 @@ $("#addriven-fingerprint").on("input", () => { }); function setFingerprint(ItemType, ItemId, fingerprint) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/api/artifacts.php?" + window.authz, contentType: "text/plain", @@ -1821,7 +1819,7 @@ function doAcquireMod() { } const count = parseInt($("#mod-count").val()); if (count != 0) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/addItems?" + window.authz, contentType: "application/json", @@ -1898,7 +1896,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () { ); } else { if ((await res.text()) == "Log-in expired") { - revalidateAuthz(() => { + revalidateAuthz().then(() => { if (single.getCurrentPath() == "/webui/cheats") { single.loadRoute("/webui/cheats"); } @@ -1915,7 +1913,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () { }); function doUnlockAllFocusSchools() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1").done(async data => { const missingFocusUpgrades = { "/Lotus/Upgrades/Focus/Attack/AttackFocusAbility": true, @@ -1966,13 +1964,13 @@ function unlockFocusSchool(upgradeType) { } function doHelminthUnlockAll() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post("/api/infestedFoundry.php?" + window.authz + "&mode=custom_unlockall"); }); } function doIntrinsicsUnlockAll() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.get("/custom/unlockAllIntrinsics?" + window.authz); }); } @@ -1984,7 +1982,7 @@ function doAddAllMods() { } modsAll.delete("/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser"); - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1"); req.done(data => { for (const modOwned of data.RawUpgrades) { @@ -2016,7 +2014,7 @@ function doAddAllMods() { } function doRemoveUnrankedMods() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1"); req.done(inventory => { window.itemListPromise.then(itemMap => { @@ -2041,7 +2039,7 @@ function doRemoveUnrankedMods() { } function doAddMissingMaxRankMods() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { fetch("/custom/addMissingMaxRankMods?" + window.authz).then(() => { updateInventory(); }); @@ -2063,7 +2061,7 @@ function doPushArchonCrystalUpgrade() { $("[list='datalist-archonCrystalUpgrades']").addClass("is-invalid").focus(); return; } - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.get( "/custom/pushArchonCrystalUpgrade?" + window.authz + @@ -2081,7 +2079,7 @@ function doPushArchonCrystalUpgrade() { } function doPopArchonCrystalUpgrade(type) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.get( "/custom/popArchonCrystalUpgrade?" + window.authz + @@ -2096,7 +2094,7 @@ function doPopArchonCrystalUpgrade(type) { } function doImport() { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/import?" + window.authz, contentType: "application/json", @@ -2113,7 +2111,7 @@ function doImport() { function doChangeSupportedSyndicate() { const uniqueName = document.getElementById("changeSyndicate").value; - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.get("/api/setSupportedSyndicate.php?" + window.authz + "&syndicate=" + uniqueName).done(function () { updateInventory(); }); @@ -2121,7 +2119,7 @@ function doChangeSupportedSyndicate() { } function doAddCurrency(currency) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/addCurrency?" + window.authz, contentType: "application/json", @@ -2136,7 +2134,7 @@ function doAddCurrency(currency) { } function doQuestUpdate(operation, itemType) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType, contentType: "application/json" @@ -2147,7 +2145,7 @@ function doQuestUpdate(operation, itemType) { } function doBulkQuestUpdate(operation) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/manageQuests?" + window.authz + "&operation=" + operation, contentType: "application/json" @@ -2245,7 +2243,7 @@ function handleModularSelection(category) { } function setBooster(ItemType, ExpiryDate, callback) { - revalidateAuthz(() => { + revalidateAuthz().then(() => { $.post({ url: "/custom/setBooster?" + window.authz, contentType: "application/json", @@ -2335,3 +2333,9 @@ async function doMaxPlexus() { toast(loc("code_noEquipmentToRankUp")); } } + +async function doUnlockAllMissions() { + await revalidateAuthz(); + await fetch("/custom/completeAllMissions?" + window.authz); + updateInventory(); +}