Guest User

hack-manager.js

a guest
Aug 23rd, 2022
2,469
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 to them
  8.         var multiarray = await findHackable(ns, allServers);    // finds and nukes optimal, hackable, and rootale servers
  9.         var hackableServers = multiarray[0]; // Not used in this function, ignore
  10.         var rootableServers = multiarray[1];
  11.         var optimalServer = multiarray[2];
  12.  
  13.         var target = optimalServer;
  14.  
  15.         // Threshold to stop growing a server, a % of total money on server.
  16.         // 0.90 means the script will grow the server until it has at least 90% of its total wealth.
  17.         // Lower this if the script spends all of its time growing.
  18.         // Increase for more efficiency, but with fewer updates in terminal.
  19.         var moneyThresh = ns.getServerMaxMoney(target) * 0.90;
  20.  
  21.         // Threshold for the minimum security level you want before hacking.
  22.         // Default is 5. Increase this if you seem to always be weakening and not hacking.
  23.         // Once the security level reaches the threshold, it will weaken the server
  24.         var securityThresh = ns.getServerMinSecurityLevel(target) + 5;
  25.  
  26.         let numThreads = 1;
  27.         var numTimesToHack = 0.05; // Don't touch this
  28.  
  29.         // Number of times the code weakens/grows/hacks in a row once it decides on which one to do.
  30.         // Higher this number is the more efficient the extraction.
  31.         // Lowering this number will give you an update more quickly, but some efficiency is lost.
  32.         // Minimum 1
  33.         numTimesToHack += 2;
  34.  
  35.         //weakens/grows/hacks the optimal server from all rootable servers except home
  36.         if (ns.getServerSecurityLevel(target) > securityThresh) {
  37.             for (let i = 0; i < rootableServers.length; i++) {
  38.                 ns.killall(rootableServers[i]);
  39.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i])) //free ram
  40.                 numThreads /= ns.getScriptRam("w1.js", "home");
  41.                 numThreads = Math.floor(numThreads);
  42.                 if (numThreads > 0) {
  43.                     ns.exec("w1.js", rootableServers[i], numThreads, target);
  44.                 }
  45.             }
  46.             await printServerDetails(ns, target, securityThresh, numTimesToHack, 'weaken');
  47.             await ns.sleep(numTimesToHack * ns.getWeakenTime(target) + 300);
  48.         } else if (ns.getServerMoneyAvailable(target) < moneyThresh) {
  49.             for (let i = 0; i < rootableServers.length; i++) {
  50.                 ns.killall(rootableServers[i]);
  51.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i]))
  52.                 numThreads /= ns.getScriptRam("g1.js", "home");
  53.                 if (numThreads > 0) {
  54.                     ns.exec("g1.js", rootableServers[i], numThreads, target);
  55.                 }
  56.             }
  57.             await printServerDetails(ns, target, securityThresh, numTimesToHack, 'grow');
  58.             await ns.sleep(numTimesToHack * ns.getGrowTime(target) + 300);
  59.         } else {
  60.             for (let i = 0; i < rootableServers.length; i++) {
  61.                 ns.killall(rootableServers[i]);
  62.                 numThreads = (ns.getServerMaxRam(rootableServers[i]) - ns.getServerUsedRam(rootableServers[i]))
  63.                 numThreads /= ns.getScriptRam("h1.js", "home");
  64.                 if (numThreads > 0) {
  65.                     ns.exec("h1.js", rootableServers[i], numThreads, target);
  66.                 }
  67.             }
  68.             await printServerDetails(ns, target, securityThresh, numTimesToHack, 'hack');
  69.             await ns.sleep(numTimesToHack * ns.getHackTime(target) + 300);
  70.         }
  71.     }
  72.  
  73. }
  74.  
  75. /**
  76. * Copies files in file list to all servers and returns an array of all servers
  77. */
  78. async function findAllServers(ns) {
  79.     const fileList = ["w1.js", "g1.js", "h1.js"];   //These files just infinitely hack, weaken, and grow respectively.
  80.     var q = [];
  81.     var serverDiscovered = [];
  82.  
  83.     q.push("home");
  84.     serverDiscovered["home"] = true;
  85.  
  86.     while (q.length) {
  87.         let v = q.shift();
  88.  
  89.         let edges = ns.scan(v);
  90.  
  91.         for (let i = 0; i < edges.length; i++) {
  92.             if (!serverDiscovered[edges[i]]) {
  93.                 serverDiscovered[edges[i]] = true;
  94.                 q.push(edges[i]);
  95.                 await ns.scp(fileList, edges[i], "home");
  96.             }
  97.         }
  98.     }
  99.     return Object.keys(serverDiscovered);
  100. }
  101.  
  102. /**
  103. * Finds list of all hackable and all rootable servers. Also finds optimal server to hack.
  104. * A hackable server is one which you can hack, grow, and weaken.
  105. * A rootable server is one which you can nuke.
  106. * Returns a 2d array with list of hackable, rootable, and the optimal server to hack
  107. */
  108. async function findHackable(ns, allServers) {
  109.     var hackableServers = [];
  110.     var rootableServers = [];
  111.     var numPortsPossible = 0;
  112.  
  113.     if (ns.fileExists("BruteSSH.exe", "home")) {
  114.         numPortsPossible += 1;
  115.     }
  116.     if (ns.fileExists("FTPCrack.exe", "home")) {
  117.         numPortsPossible += 1;
  118.     }
  119.     if (ns.fileExists("RelaySMTP.exe", "home")) {
  120.         numPortsPossible += 1;
  121.     }
  122.     if (ns.fileExists("HTTPWorm.exe", "home")) {
  123.         numPortsPossible += 1;
  124.     }
  125.     if (ns.fileExists("SQLInject.exe", "home")) {
  126.         numPortsPossible += 1;
  127.     }
  128.  
  129.  
  130.     for (let i = 0; i < allServers.length; i++) {
  131.         //if your hacking level is high enough and you can open enough ports, add it to hackable servers list
  132.         if (ns.getHackingLevel() >= ns.getServerRequiredHackingLevel(allServers[i]) && numPortsPossible >= ns.getServerNumPortsRequired(allServers[i])) {
  133.             hackableServers.push(allServers[i]);
  134.         }
  135.         //if it isn't home(this makes sure that you don't kill this script) and you either
  136.         //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)
  137.         //  or you can open enough ports
  138.         if (allServers[i] != "home" && (ns.hasRootAccess(allServers[i]) || (numPortsPossible >= ns.getServerNumPortsRequired(allServers[i])))) {
  139.             rootableServers.push(allServers[i]);
  140.             //if you don't have root access, open ports and nuke it
  141.             if (!ns.hasRootAccess(allServers[i])) {
  142.                 if (ns.fileExists("BruteSSH.exe")) {
  143.                     ns.brutessh(allServers[i]);
  144.                 }
  145.                 if (ns.fileExists("FTPCrack.exe")) {
  146.                     ns.ftpcrack(allServers[i]);
  147.                 }
  148.                 if (ns.fileExists("RelaySMTP.exe")) {
  149.                     ns.relaysmtp(allServers[i]);
  150.                 }
  151.                 if (ns.fileExists("HTTPWorm.exe")) {
  152.                     ns.httpworm(allServers[i]);
  153.                 }
  154.                 if (ns.fileExists("SQLInject.exe")) {
  155.                     ns.sqlinject(allServers[i]);
  156.                 }
  157.                 ns.nuke(allServers[i]);
  158.             }
  159.         }
  160.     }
  161.  
  162.     //finds optimal server to hack
  163.     let optimalServer = await findOptimal(ns, hackableServers);
  164.  
  165.     return [hackableServers, rootableServers, optimalServer];
  166. }
  167.  
  168. /**
  169.  * Finds the best server to hack.
  170.  * The algorithm works by assigning a value to each server and returning the max value server.
  171.  * The value is the serverMaxMoney divided by the sum of the server's weaken time, grow time, and hack time.
  172.  * You can easily change this function to choose a server based on whatever optimizing algorithm you want,
  173.  *  just return the server name to hack.
  174. */
  175. async function findOptimal(ns, hackableServers) {
  176.     let optimalServer = "n00dles";
  177.     let optimalVal = 0;
  178.     let currVal;
  179.     let currTime;
  180.  
  181.     for (let i = 0; i < hackableServers.length; i++) {
  182.         currVal = ns.getServerMaxMoney(hackableServers[i]);
  183.         currTime = ns.getWeakenTime(hackableServers[i]) + ns.getGrowTime(hackableServers[i]) + ns.getHackTime(hackableServers[i]);
  184.         currVal /= currTime;
  185.         if (currVal >= optimalVal) {
  186.             optimalVal = currVal;
  187.             optimalServer = hackableServers[i];
  188.         }
  189.     }
  190.  
  191.     return optimalServer;
  192. }
  193.  
  194. /**
  195.  * Prints the current state of a server
  196. */
  197. async function printServerDetails(ns, host, securityThresh, numTimesToHack, hackType) {
  198.     const moneyCurrent = Math.floor(ns.getServerMoneyAvailable(host));
  199.     const moneyMax = Math.floor(ns.getServerMaxMoney(host));
  200.     const moneyPerc = Math.floor((moneyCurrent / moneyMax * 100));
  201.  
  202.     let dollarUS = Intl.NumberFormat("en-US", {
  203.         style: "currency",
  204.         currency: "USD",
  205.     });
  206.  
  207.     const newCur = dollarUS.format(moneyCurrent);
  208.     const newMax = dollarUS.format(moneyMax);
  209.     const curMoney = dollarUS.format(ns.getServerMoneyAvailable("home"));
  210.  
  211.     const servSec = Math.floor(ns.getServerSecurityLevel(host));
  212.     const servMaxSec = Math.floor(ns.getServerMinSecurityLevel(host));
  213.  
  214.     let workTime = 0;
  215.     let workType = "NONE";
  216.  
  217.     if (hackType == "hack") {
  218.         workTime = ns.getHackTime(host);
  219.         workType = "\n\n [HACKING... @ ";
  220.     } else if (hackType == "grow") {
  221.         workTime = ns.getGrowTime(host);
  222.         workType = "\n\n [GROWING... @ ";
  223.     } else if (hackType == "weaken") {
  224.         workTime = ns.getWeakenTime(host);
  225.         workType = "\n\n [WEAKENING... @ ";
  226.     } else {
  227.         ns.tprint("Incorrect hackType in getServerDetails. Only hack, grow, and weaken are allowed. Ending script.");
  228.         return;
  229.     }
  230.  
  231.     var output = "\n  - Security: " + servSec + "  [Minimum: " + servMaxSec + ", Threshold: " + securityThresh + "]";
  232.     output += "\n";
  233.     output += "  - Server's Money: " + newCur + " out of " + newMax + " (" + moneyPerc + "%)";
  234.     output += "\n";
  235.     output += "  => My Money: " + curMoney;
  236.     output += "\n";
  237.     output += " [Estimated seconds to next action: " + Math.floor((numTimesToHack * workTime + 300) / 1000) + "]\n\n";
  238.  
  239.     ns.tprint(workType + host + "]" + output);
  240.  
  241.     return;
  242. }
Advertisement
Add Comment
Please, Sign In to add comment