Advertisement
justapastebinaccount

hack-manager.ns

Dec 19th, 2021
7,210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Finds the optimal server to hack and hacks it from all possible servers except home.
  3.  * Only run from home server
  4.  * @param {NS} ns **/
  5. export async function main(ns) {
  6.     while (true) {
  7.         var allServers = await findAllServers(ns);  // finds all servers and clones grow hack and weaken files
  8.         var multiarray = await findHackable(ns, allServers);    // finds and nukes optimal, hackable, and rootale servers.
  9.         var hackableServers = multiarray[0];
  10.         var rootableServers = multiarray[1];
  11.         var optimalServer = multiarray[2];
  12.  
  13.         ns.tprint('[STARTED] @ ' + optimalServer);
  14.         var target = optimalServer;
  15.         var moneyThresh = ns.getServerMaxMoney(target) * 0.9;   //change thresholds to whatever values you prefer
  16.         var securityThresh = ns.getServerMinSecurityLevel(target) + 3;
  17.         let numThreads = 1;
  18.         var numTimesToHack = 0.05;
  19.  
  20.         //Number of times the code weakens/grows/hacks in a row once it decides on which one to do.
  21.         //Change to the value you prefer.
  22.         //Higher number means longer time without updating list of all servers and optimal server, but also less time lost in buffer time in between cycles.
  23.         //I would recommend having it at 1 at the start of the run and gradually increasing it as the rate at which you get more servers you can use decreases.
  24.         //Don't increase it too far tho, as weaken/hack/grow times also tend to increase throughout a run.
  25.         numTimesToHack += 2;
  26.  
  27.         //weakens/grows/hacks the optimal server from all rootable servers except home
  28.         if (ns.getServerSecurityLevel(target) > securityThresh) {
  29.             ns.tprint("weakening")
  30.             for (let i = 0; i < rootableServers.length; i++) {
  31.                 ns.killall(rootableServers[i]);
  32.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i])) //free ram
  33.                 numThreads /= ns.getScriptRam("w1.ns", "home");
  34.                 numThreads = Math.floor(numThreads);
  35.                 if (numThreads > 0) {
  36.                     ns.exec("w1.ns", rootableServers[i], numThreads, target);
  37.                 }
  38.             }
  39.             await ns.sleep(numTimesToHack * ns.getWeakenTime(target) + 300);
  40.         } else if (ns.getServerMoneyAvailable(target) < moneyThresh) {
  41.             ns.tprint("growing")
  42.             for (let i = 0; i < rootableServers.length; i++) {
  43.                 ns.killall(rootableServers[i]);
  44.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i]))
  45.                 numThreads /= ns.getScriptRam("g1.ns", "home");
  46.                 if (numThreads > 0) {
  47.                     ns.exec("g1.ns", rootableServers[i], numThreads, target);
  48.                 }
  49.             }
  50.             await ns.sleep(numTimesToHack * ns.getGrowTime(target) + 300);
  51.         } else {
  52.             ns.tprint("hacking")
  53.             for (let i = 0; i < rootableServers.length; i++) {
  54.                 ns.killall(rootableServers[i]);
  55.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i]))
  56.                 numThreads /= ns.getScriptRam("h1.ns", "home");
  57.                 if (numThreads > 0) {
  58.                     ns.exec("h1.ns", rootableServers[i], numThreads, target);
  59.                 }
  60.             }
  61.             await ns.sleep(numTimesToHack * ns.getHackTime(target) + 300);
  62.         }
  63.     }
  64.  
  65. }
  66.  
  67. /**
  68. * Copies files in file list to all servers and returns an array of all servers
  69. */
  70. async function findAllServers(ns) {
  71.     const fileList = ["h1.ns", "w1.ns", "g1.ns"];   //These files just infinitely hack, weaken, and grow respectively.
  72.     var q = [];
  73.     var serverDiscovered = [];
  74.  
  75.     q.push("home");
  76.     serverDiscovered["home"] = true;
  77.  
  78.     while (q.length) {
  79.         let v = q.shift();
  80.  
  81.         let edges = ns.scan(v);
  82.  
  83.         for (let i = 0; i < edges.length; i++) {
  84.             if (!serverDiscovered[edges[i]]) {
  85.                 serverDiscovered[edges[i]] = true;
  86.                 q.push(edges[i]);
  87.                 await ns.scp(fileList, "home", edges[i]);
  88.             }
  89.         }
  90.     }
  91.     return Object.keys(serverDiscovered);
  92. }
  93.  
  94. /**
  95. * Finds list of all hackable and all rootable servers. Also finds optimal server to hack.
  96. * A hackable server is one which you can hack, grow, and weaken.
  97. * A rootable server is one which you can nuke.
  98. * Returns a 2d array with list of hackable, rootable, and the optimal server to hack
  99. */
  100. async function findHackable(ns, allServers) {
  101.     var hackableServers = [];
  102.     var rootableServers = [];
  103.     var numPortsPossible = 0;
  104.  
  105.     if (ns.fileExists("BruteSSH.exe", "home")) {
  106.         numPortsPossible += 1;
  107.     }
  108.     if (ns.fileExists("FTPCrack.exe", "home")) {
  109.         numPortsPossible += 1;
  110.     }
  111.     if (ns.fileExists("RelaySMTP.exe", "home")) {
  112.         numPortsPossible += 1;
  113.     }
  114.     if (ns.fileExists("HTTPWorm.exe", "home")) {
  115.         numPortsPossible += 1;
  116.     }
  117.     if (ns.fileExists("SQLInject.exe", "home")) {
  118.         numPortsPossible += 1;
  119.     }
  120.  
  121.  
  122.     for (let i = 0; i < allServers.length; i++) {
  123.         //if your hacking level is high enough and you can open enough ports, add it to hackable servers list
  124.         if (ns.getHackingLevel() >= ns.getServerRequiredHackingLevel(allServers[i]) && numPortsPossible >= ns.getServerNumPortsRequired(allServers[i])) {
  125.             hackableServers.push(allServers[i]);
  126.         }
  127.         //if it isn't home(this makes sure that you don't kill this script) and you either
  128.         //already have root access(this is useful for servers bought by the player as you have access to those even if the security is higher than you can nuke)
  129.         //  or you can open enough ports
  130.         if (allServers[i] != "home" && (ns.hasRootAccess(allServers[i]) || (numPortsPossible >= ns.getServerNumPortsRequired(allServers[i])))) {
  131.             rootableServers.push(allServers[i]);
  132.             //if you don't have root access, open ports and nuke it
  133.             if (!ns.hasRootAccess(allServers[i])) {
  134.                 if (ns.fileExists("BruteSSH.exe")) {
  135.                     ns.brutessh(allServers[i]);
  136.                 }
  137.                 if (ns.fileExists("FTPCrack.exe")) {
  138.                     ns.ftpcrack(allServers[i]);
  139.                 }
  140.                 if (ns.fileExists("RelaySMTP.exe")) {
  141.                     ns.relaysmtp(allServers[i]);
  142.                 }
  143.                 if (ns.fileExists("HTTPWorm.exe")) {
  144.                     ns.httpworm(allServers[i]);
  145.                 }
  146.                 if (ns.fileExists("SQLInject.exe")) {
  147.                     ns.sqlinject(allServers[i]);
  148.                 }
  149.                 ns.nuke(allServers[i]);
  150.             }
  151.         }
  152.     }
  153.  
  154.     //finds optimal server to hack
  155.     let optimalServer = await findOptimal(ns, hackableServers);
  156.  
  157.     return [hackableServers, rootableServers, optimalServer];
  158. }
  159.  
  160. /**
  161.  * Finds the best server to hack.
  162.  * The algorithm works by assigning a value to each server and returning the max value server.
  163.  * The value is the serverMaxMoney divided by the sum of the server's weaken time, grow time, and hack time.
  164.  * You can easily change this function to choose a server based on whatever optimizing algorithm you want,
  165.  *  just return the server name to hack.
  166. */
  167. async function findOptimal(ns, hackableServers) {
  168.     let optimalServer = "n00dles";
  169.     let optimalVal = 0;
  170.     let currVal;
  171.     let currTime;
  172.  
  173.     for (let i = 0; i < hackableServers.length; i++) {
  174.         currVal = ns.getServerMaxMoney(hackableServers[i]);
  175.         currTime = ns.getWeakenTime(hackableServers[i]) + ns.getGrowTime(hackableServers[i]) + ns.getHackTime(hackableServers[i]);
  176.         currVal /= currTime;
  177.         if (currVal >= optimalVal) {
  178.             optimalVal = currVal;
  179.             optimalServer = hackableServers[i];
  180.         }
  181.     }
  182.  
  183.     return optimalServer;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement