/** @param {NS} ns */ export async function main(ns) { ns.tail(); let serverRoutes = await scanRecursiveWrapper(ns); let currentHackingLevel = ns.getHackingLevel(); let currentArray = []; let currentHop = ""; for (const [name, entry] of Object.entries(serverRoutes)) { if (ns.getServerRequiredHackingLevel(name) < currentHackingLevel && ns.hasRootAccess(name) === true) { currentArray = entry; if (entry.length > 0) { while (currentArray.length > 0) { currentHop = currentArray.shift(); if (ns.singularity.connect(currentHop) === false) ns.tprint("Error when trying to connect to: " + currentHop); } ns.tprint("Trying to backdoor " + currentHop) await ns.singularity.installBackdoor(currentHop); ns.tprint("Success on " + currentHop) ns.singularity.connect("home"); } } } } /** @param {NS} ns */ async function scanRecursiveWrapper(ns) { let startTime = Date.now(); ns.rm("ServerRouteList.txt"); await scanRecursive(ns, [], "home", startTime); let result = JSON.parse("[" + ns.read("ServerRouteList.txt") + "{}]").reduce((acc, obj) => ({ ...acc, ...obj }), {}); ns.write("ServerRouteList.txt", JSON.stringify(result, "w")); return result; } /** @param {NS} ns */ async function scanRecursive(ns, parents, currentServer, startTime) { let currentTime = Date.now(); if (currentTime > startTime + 5) { return } else { let currentChildren = ns.scan(currentServer); let parentsSet = new Set(parents); let cleanedChildren = currentChildren.filter(element => !parentsSet.has(element)); let tempServername = String(currentServer); ns.write("ServerRouteList.txt", JSON.stringify({ [tempServername]: parents }) + ",", "a"); parents.push(currentServer); for (let child in cleanedChildren) { await scanRecursive(ns, parents, cleanedChildren[child], startTime) } } }