The3vilM0nk3y

hiveCluster/hiveMind.js

Apr 26th, 2022 (edited)
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import * as helpers from "/apis/helpers.js"
  2. import * as myForms from "/apis/myFormulas.js"
  3. let doLog = true;
  4. let logLevel = 1;
  5. //-----GUI SETTINGS-----//
  6.  
  7. let doGUI = true;
  8. let showKarma = true;
  9. let showScriptIncome = true;
  10. let showScriptExp = true;
  11. let showHacknetIncome = true;
  12.  
  13. const doc = globalThis['document'];
  14. const hook0 = doc.getElementById('overview-extra-hook-0');
  15. const hook1 = doc.getElementById('overview-extra-hook-1');
  16. /** @param {NS} ns */
  17. async function updateGUI(ns) {
  18.     try {
  19.         const headers = [];
  20.         const values = [];
  21.         if (showKarma) {
  22.             headers.push("Karma");
  23.             values.push(ns.heart.break().toPrecision(5));
  24.         }
  25.         if (showScriptIncome) {
  26.             let income = ns.getScriptIncome();
  27.             headers.push("Script $   ");
  28.             values.push(ns.nFormat(income[1], "(0.00 a)") + "/s");
  29.         }
  30.         if (showScriptExp) {
  31.             let exp = ns.getScriptExpGain();
  32.             headers.push("Script EXP  ");
  33.             values.push(ns.nFormat(exp, "(0.00 a)") + "/s");
  34.         }
  35.         if (showHacknetIncome) {
  36.             let hnIncome = 0;
  37.             for (let i = 0; i < ns.hacknet.numNodes(); i++) {
  38.                 hnIncome += ns.hacknet.getNodeStats(i).production;
  39.             }
  40.             headers.push("Hacknet $  ");
  41.             values.push(ns.nFormat(hnIncome, "(0.00 a)") + "/s");
  42.         }
  43.         hook0.innerText = headers.join(" \n");
  44.         hook1.innerText = values.join(" \n");
  45.  
  46.     } catch (err) {
  47.         ns.print("Error updating the GUI! - " + String(err));
  48.     }
  49.  
  50. }
  51. /** @param {NS} ns @param {Server} server @param {Player} player*/
  52. export async function main(ns) {
  53.     let debugMode = false;
  54.     let debugLevel = 1;
  55.     //get server names
  56.     let server = ns.args[0];
  57.     let host = ns.getHostname();
  58.     //define scripts
  59.     let hackScript = "/hiveCluster/hack.js"; // swZFa6Sz
  60.     let growScript = "/hiveCluster/grow.js"; // q7KQwtij
  61.     let weakenScript = "/hiveCluster/weaken.js";  //hg6DS4aQ
  62.    
  63.     if (!ns.fileExists(hackScript)) await ns.wget("https://pastebin.com/raw.php?i=swZFa6Sz", hackScript);
  64.     if (!ns.fileExists(growScript)) await ns.wget("https://pastebin.com/raw.php?i=q7KQwtij", growScript);
  65.     if (!ns.fileExists(weakenScript)) await ns.wget("https://pastebin.com/raw.php?i=hg6DS4aQ", weakenScript);
  66.    
  67.     //get ram amounts for all scripts.
  68.     let runningScripts = ["/hiveCluster/hiveMind.js", "scanForCCT.js"];
  69.     //GB of RAM to keep free on home server for running scripts
  70.     var constantRam = 4;
  71.     for (let s of runningScripts) constantRam += ns.getScriptRam(s);
  72.     var hackscriptRam = ns.getScriptRam(hackScript);
  73.     var growscriptRam = ns.getScriptRam(growScript);
  74.     var weakenscriptRam = ns.getScriptRam(weakenScript);
  75.     var maxRam = (ns.getServerMaxRam(host) - constantRam);
  76.     var homeThreadsHack = Math.floor(maxRam / hackscriptRam);
  77.     var homeThreadsGrow = Math.floor(maxRam / growscriptRam);
  78.     var homeThreadsWeaken = Math.floor(maxRam / weakenscriptRam);
  79.  
  80.     //Get a list of all servers
  81.     let filters = [host, "MyServer-"];
  82.     let useExact = false;
  83.  
  84.     let usableServers = [];
  85.     //Gather max hive memory and threads, starting with home values.
  86.     let maxMemory = maxRam;
  87.     let maxThreadsHack = homeThreadsHack;
  88.     let maxThreadsGrow = homeThreadsGrow;
  89.     let maxThreadsWeaken = homeThreadsWeaken;
  90.     //filter the list of servers by usability
  91.     async function getUsableServers() {
  92.         let servers = await helpers.getAllServers(ns, filters, useExact);
  93.         maxRam = (ns.getServerMaxRam(host) - constantRam);
  94.         maxMemory = maxRam;
  95.         homeThreadsHack = Math.floor(maxRam / hackscriptRam);
  96.         homeThreadsGrow = Math.floor(maxRam / growscriptRam);
  97.         homeThreadsWeaken = Math.floor(maxRam / weakenscriptRam);
  98.         maxThreadsHack = homeThreadsHack;
  99.         maxThreadsGrow = homeThreadsGrow;
  100.         maxThreadsWeaken = homeThreadsWeaken;
  101.         let list = [];
  102.         list.push([host, homeThreadsHack, homeThreadsGrow, homeThreadsWeaken]);
  103.         for (let server of servers) {
  104.             if (!ns.hasRootAccess(server)) { await dropImmunity(ns, server); }
  105.             //only use those with root
  106.             if (ns.hasRootAccess(server)) {
  107.                 if (!ns.fileExists("refreshFiles.txt", server)) {
  108.                     await ns.scp([hackScript, weakenScript, growScript, "refreshFiles.txt"], server);
  109.                     ns.tprint("Moving files to ", server)
  110.                 }
  111.                 let mem = ns.getServerMaxRam(server);
  112.                 let thr = Math.floor(mem / hackscriptRam);
  113.                 let hackThr = Math.floor(mem / hackscriptRam);;
  114.                 let growThr = Math.floor(mem / growscriptRam);;
  115.                 let weakenThr = Math.floor(mem / weakenscriptRam);;
  116.                 //only add servers to the list if they can handle at least one thread.
  117.                 if (thr > 0) {
  118.                     //add memory and threads to max pools
  119.                     maxMemory += mem;
  120.                     //maxThreads += thr;
  121.                     maxThreadsHack += hackThr;
  122.                     maxThreadsGrow += growThr;
  123.                     maxThreadsWeaken += weakenThr;
  124.                     //add to array of usable servers
  125.                     list.push([server, hackThr, growThr, weakenThr]);
  126.                 }
  127.             }
  128.         }
  129.         return helpers.sortArray(list, [[1, 1]]);
  130.     }
  131.     //sort the usable servers by the most possible threads, highest being first.
  132.     usableServers = await getUsableServers();
  133.     ns.tprint("Hive Mind Participants - ", usableServers);
  134.     ns.tprint("Max Hack Threads Capable -" + maxThreadsHack);
  135.     ns.tprint("Max Grow Threads Capable -" + maxThreadsGrow);
  136.     ns.tprint("Max Weaken Threads Capable -" + maxThreadsWeaken);
  137.     ns.tprint("Max Memory Available - " + maxMemory);
  138.     await ns.sleep(1000);
  139.  
  140.  
  141.     //------start calulations-----//
  142.     let batchActions = [];
  143.     let batch;
  144.  
  145.     let hackTime = ns.getHackTime(server);
  146.     let growTime = hackTime * 3.2;
  147.     let weakenTime = hackTime * 4;
  148.     let tgTime;
  149.     let twTime;
  150.  
  151.     var player = ns.getPlayer();
  152.     var fserver = ns.getServer(server);
  153.  
  154.     var cs = ns.getServerSecurityLevel(server);
  155.     var ms = ns.getServerMinSecurityLevel(server);
  156.     var mm = ns.getServerMaxMoney(server);
  157.     var ma = ns.getServerMoneyAvailable(server);
  158.  
  159.     let currentTime = performance.now();
  160.     //check if server was drained of money.
  161.     if (ma <= 0) {
  162.         ns.tprint(server, " has been drained of all it's money. Attempting a full recovery. Please wait.");
  163.         batchActions.push([maxThreadsGrow, growScript, currentTime + growTime + 1000, server, growTime + 1000, growscriptRam]);
  164.         batch = batchSplit(ns, batchActions, usableServers);
  165.         if (debugMode) {
  166.             if (debugLevel >= 2) {
  167.                 ns.tprint(batch);
  168.             }
  169.             ns.tprint("Sleep - ", growTime + 200);
  170.             await ns.sleep(1);
  171.         }
  172.         else {
  173.             await executeBatch(ns, batch, server);
  174.             //wait for growth
  175.             await ns.sleep(growTime + 2000);
  176.         }
  177.         //get all the variables with new info.
  178.         mm = ns.getServerMaxMoney(server);
  179.         ma = ns.getServerMoneyAvailable(server);
  180.         if (ma <= 0) {
  181.             ns.tprint("Unable to recover. This server is more than likely un-hackable. Terminating program.");
  182.             return;
  183.         }
  184.         player = ns.getPlayer();
  185.         fserver = ns.getServer(server);
  186.         cs = ns.getServerSecurityLevel(server);
  187.         ms = ns.getServerMinSecurityLevel(server);
  188.         hackTime = ns.getHackTime(server);
  189.         growTime = hackTime * 3.2;
  190.         weakenTime = hackTime * 4;
  191.         usableServers = await getUsableServers();
  192.  
  193.     }
  194.  
  195.     //var maxGrowThreads = ((maxRam / growscriptRam) - weakenThreads);
  196.     //let memNeeded = weakenThreads * weakenscriptRam;
  197.  
  198.  
  199.     //neededGrowThreads = neededGrowThreads + (neededGrowThreads * bufferGrowPercent);
  200.  
  201.  
  202.     //Can be changed to delay. Used to offset function call times potentially
  203.     let timeDelay = 50;
  204.     currentTime = performance.now();
  205.     let growthRemaining;
  206.     let weakenRemaining;
  207.     async function startPriming(secondaryPrime = false) {
  208.         ns.tprint("Priming Security and Money for " + server);
  209.         let growThreadsToDouble = ns.growthAnalyze(server, 2);
  210.         let neededMoney = mm - ma;
  211.         ns.tprint("NeededGrowThreads - ", neededMoney, " / ", ma, " * ", growThreadsToDouble);
  212.         let neededGrowThreads = Math.ceil(neededMoney / ma * growThreadsToDouble);
  213.  
  214.         var weakenThreads = 2000 - (ms / 0.05);
  215.         //[threadCount, command, timeToFinish, target, executionTime, scriptRam]
  216.         //create a batch order
  217.         let growthRemaining = neededGrowThreads;
  218.         let weakenRemaining = weakenThreads;
  219.         while (growthRemaining > 0 || weakenRemaining > 0) {
  220.  
  221.  
  222.             if (weakenRemaining > 0) {
  223.                 ns.tprint("Starting a Weaken Cycle.");
  224.                 batchActions = [];
  225.                 batch;
  226.                 currentTime = performance.now();
  227.                 hackTime = ns.getHackTime(server);
  228.                 weakenTime = hackTime * 4;
  229.                 twTime = weakenTime + timeDelay;
  230.                 if (weakenRemaining > maxThreadsWeaken) {
  231.                     batchActions.push([maxThreadsWeaken, weakenScript, currentTime + twTime, server, twTime, weakenscriptRam]);
  232.                     ns.tprint("Weakening with ", maxThreadsWeaken, " threads.");
  233.                 } else {
  234.                     batchActions.push([weakenRemaining, weakenScript, currentTime + twTime, server, twTime, weakenscriptRam]);
  235.                     ns.tprint("Weakening with ", weakenRemaining, " threads.");
  236.                 }
  237.                 batch = batchSplit(ns, batchActions, usableServers);
  238.                 if (batch[0] == false) {
  239.                     //ns.tprint(batch);
  240.                     ns.tprint("Something went wrong with batching - " + batch[2]);
  241.                     return;
  242.                 } else {
  243.                     weakenRemaining -= maxThreadsWeaken;
  244.                     if (debugMode) {
  245.                         if (debugLevel >= 2) {
  246.                             ns.tprint(batch);
  247.                         }
  248.                         ns.tprint("Sleep - ", twTime + 1000);
  249.                         await ns.sleep(1);
  250.                     } else {
  251.                         await executeBatch(ns, batch, server);
  252.                         await ns.sleep(twTime + 1000);
  253.                     }
  254.                     ns.tprint("Weaken Cycle Finished.");
  255.                     usableServers = await getUsableServers();
  256.                 }
  257.             }
  258.             if (growthRemaining > 0) {
  259.                 batchActions = [];
  260.                 batch;
  261.                 ns.tprint("Starting a Grow Cycle.");
  262.                 currentTime = performance.now();
  263.                 hackTime = ns.getHackTime(server);
  264.                 growTime = hackTime * 3.2;
  265.                 tgTime = growTime + timeDelay;
  266.                 if (growthRemaining > maxThreadsGrow) {
  267.                     ns.tprint("Growing with ", maxThreadsGrow, " threads.");
  268.                     batchActions.push([maxThreadsGrow, growScript, currentTime + tgTime, server, tgTime, growscriptRam]);
  269.                 } else {
  270.                     ns.tprint("Growing with ", growthRemaining, " threads.");
  271.                     batchActions.push([growthRemaining, growScript, currentTime + tgTime, server, tgTime, growscriptRam]);
  272.                 }
  273.                 batch = batchSplit(ns, batchActions, usableServers);
  274.                 if (batch[0] == false) {
  275.                     //ns.tprint(batch);
  276.                     ns.tprint("Something went wrong with batching - " + batch[2]);
  277.                     return;
  278.                 } else {
  279.                     growthRemaining -= maxThreadsGrow;
  280.                     if (debugMode) {
  281.                         if (debugLevel >= 2) {
  282.                             ns.tprint(batch);
  283.                         }
  284.                         ns.tprint("Sleep - ", tgTime + 1000);
  285.                         await ns.sleep(1000);
  286.                     }
  287.                     else {
  288.                         await executeBatch(ns, batch, server);
  289.                         await ns.sleep(tgTime + 1000);
  290.                     }
  291.                     ns.tprint("Grow Cycle Finished. Remaining Threads - ", growthRemaining);
  292.                     usableServers = await getUsableServers();
  293.                 }
  294.             }
  295.             //recheck values as they have now changed.
  296.             mm = ns.getServerMaxMoney(server);
  297.             ma = ns.getServerMoneyAvailable(server);
  298.             player = ns.getPlayer();
  299.             fserver = ns.getServer(server);
  300.             cs = ns.getServerSecurityLevel(server);
  301.             ms = ns.getServerMinSecurityLevel(server);
  302.             hackTime = ns.getHackTime(server);
  303.             growTime = hackTime * 3.2;
  304.             weakenTime = hackTime * 4;
  305.             growThreadsToDouble = ns.growthAnalyze(server, 2);
  306.             neededMoney = mm - ma;
  307.             ns.tprint("NeededGrowThreads - ", neededMoney, " / ", ma, " * ", growThreadsToDouble);
  308.             neededGrowThreads = Math.ceil(neededMoney / ma * growThreadsToDouble);
  309.  
  310.             weakenThreads = (cs - ms) / 0.05;
  311.             //[threadCount, command, timeToFinish, target, executionTime, scriptRam]
  312.             //create a batch order
  313.             growthRemaining = neededGrowThreads;
  314.             weakenRemaining = weakenThreads;
  315.  
  316.         }
  317.  
  318.  
  319.         //recheck values as they have now changed.
  320.         mm = ns.getServerMaxMoney(server);
  321.         ma = ns.getServerMoneyAvailable(server);
  322.         player = ns.getPlayer();
  323.         fserver = ns.getServer(server);
  324.         cs = ns.getServerSecurityLevel(server);
  325.         ms = ns.getServerMinSecurityLevel(server);
  326.         hackTime = ns.getHackTime(server);
  327.         growTime = hackTime * 3.2;
  328.         weakenTime = hackTime * 4;
  329.         usableServers = await getUsableServers();
  330.         if ((cs > ms || ma < mm)) {
  331.             if (!secondaryPrime) {
  332.                 await startPriming(true);
  333.             } else {
  334.                 return false;
  335.             }
  336.  
  337.         }
  338.         return true;
  339.     }
  340.     let primed = true;
  341.     //Priming the server.  Max money and Min security must be acheived for this to work
  342.     if (ma < mm || cs > ms) { primed = await startPriming(false); }
  343.  
  344.     if (!primed) {
  345.         ns.tprint("Unable to prime the server. Terminating.");
  346.         return;
  347.     }
  348.  
  349.  
  350.     ns.tprint("At Main Stage");
  351.     ns.tprint("Current Security Level: ", cs);
  352.     ns.tprint("Min Security Level: ", ms);
  353.     ns.tprint("Current Money: ", ma, " / ", mm);
  354.     let healthCheck = 120;
  355.     let healthy = true;
  356.     let offset = 50;
  357.     let lastExecutionTime = performance.now();
  358.     while (healthy) {
  359.         while (healthy) {
  360.             healthCheck -= 1;
  361.             cs = ns.getServerSecurityLevel(server);
  362.             ms = ns.getServerMinSecurityLevel(server);
  363.             mm = ns.getServerMaxMoney(server);
  364.             ma = ns.getServerMoneyAvailable(server);
  365.  
  366.             //check if this is a healty tick to check stats on.
  367.             if (cs > ms || ma < mm) {
  368.                 //check how long we have been unhealthy
  369.                 //ns.tprint("HEALTH ISSUE: " + healthCheck);
  370.                 if (healthCheck <= 0) {
  371.                     //break out if unhealthy too long
  372.                     healthy = false;
  373.                     continue;
  374.                 }
  375.                 //if we havn't been unhealthy too long. wait a offset cycle
  376.                 await ns.sleep(offset);
  377.                 continue;
  378.             }
  379.             else {
  380.                 //set health to max since we are healthy
  381.                 healthCheck = 120;
  382.             }
  383.             //ns.tprint("Starting Batch Calculation.");
  384.             //calculate stats needed
  385.             hackTime = ns.getHackTime(server);
  386.             growTime = hackTime * 3.2;
  387.             weakenTime = hackTime * 4;
  388.             currentTime = performance.now();
  389.             usableServers = await getUsableServers();
  390.             player = ns.getPlayer();
  391.             let ratioData;
  392.             let hackID = 0;
  393.             let outOfSyncDelay = 0;
  394.             batchActions = [];
  395.             batch = [false, [], "No Valid Server to Batch too."];
  396.             //Find the largest server with available RAM to handle the hack
  397.             //ns.tprint(usableServers.length - 1);
  398.             for (var i = usableServers.length - 1; i >= 0; i--) {
  399.                 let sName = usableServers[i][0];
  400.                 //get max threads available for this server
  401.                 let mem = ns.getServerMaxRam(sName) - ns.getServerUsedRam(sName);
  402.                 if (sName == host) mem = mem - constantRam;
  403.                 let threads = Math.floor(mem / hackscriptRam);
  404.                 //ns.tprint(sName, " threads - ", threads);
  405.                 //continue to next server if there are not enough threads
  406.                 if (threads <= 0) continue;
  407.                 //get ratio of threads. limiting to a max of 50% hack
  408.                 ratioData = getRatio(ns, ns.getServer(server), player, threads);
  409.                 //ns.tprint(ratioData);
  410.                 if (ratioData.hack > 0) {
  411.                     let thTime = hackTime + timeDelay;
  412.                     tgTime = growTime + timeDelay;
  413.                     twTime = weakenTime + timeDelay;
  414.                     let finishTime = currentTime + weakenTime;
  415.                     //check for out of sync. This can happen if hacking times get shorter.
  416.                     //we check for when the last run should finish and see if this new run will finish before it
  417.                     //this is a redundant check, but i left it in just in case.
  418.                     if (finishTime < lastExecutionTime) {
  419.                         outOfSyncDelay = lastExecutionTime - finishTime;
  420.                         batch[2] = "Out of Sync Detected. by - " + outOfSyncDelay;
  421.                         break;
  422.                     }
  423.  
  424.                     batchActions.push([ratioData.weaken1, weakenScript, finishTime + offset, server, twTime, weakenscriptRam]);
  425.                     batchActions.push([ratioData.grow, growScript, finishTime + (offset * 2), server, tgTime, growscriptRam]);
  426.                     batchActions.push([ratioData.weaken2, weakenScript, finishTime + (offset * 3), server, twTime, weakenscriptRam]);
  427.                     //[server, remainingThreads, command, target, timeToFinish, executionTime, actionID++]
  428.                     batch = batchSplit(ns, batchActions, usableServers, [[sName, ratioData.hack, hackScript, server, finishTime, thTime, hackID]]);
  429.                     //ns.tprint(batch);
  430.                     hackID += 1;
  431.                     lastExecutionTime = finishTime + (offset * 4);
  432.                 }
  433.                 break;
  434.             }
  435.             if (batch[0] == true) {
  436.                 executeBatch(ns, batch);
  437.                 await ns.sleep(offset * 8);
  438.             } else {
  439.                 if (batch[2] != "No Valid Server to Batch too.") {
  440.                     ns.tprint(batch[2], " Batch info - ", batch[1]);
  441.                 }
  442.                 await ns.sleep(offset * 8);
  443.             }
  444.             if (doGUI) await updateGUI(ns);
  445.         }
  446.         //check health of the node.
  447.  
  448.         if (!healthy) {
  449.             ns.tprint("Fell out of sync somehow. Waiting for threads to end.");
  450.             while (performance.now() < lastExecutionTime) {
  451.                 await ns.sleep(100);
  452.             }
  453.             //Something is out of whack here. Lets attempt a reprime
  454.             healthy = await startPriming();
  455.         }
  456.     }
  457.     ns.tprint("Ending due to not being healthy anymore.");
  458.     cs = ns.getServerSecurityLevel(server);
  459.     ms = ns.getServerMinSecurityLevel(server);
  460.     mm = ns.getServerMaxMoney(server);
  461.     ma = ns.getServerMoneyAvailable(server);
  462.  
  463.  
  464.     ns.tprint("At End");
  465.     ns.tprint("Current Security Level: ", cs);
  466.     ns.tprint("Min Security Level: ", ms);
  467.     ns.tprint("Current Money: ", ma, " / ", mm);
  468.  
  469.  
  470. }
  471.  
  472. function getRatio(ns, server, player, hackThreads = 1, roundThreadsUp = true) {
  473.     let weakenTime = myForms.weakenTime(server, player);
  474.     //get how much money one thread of hack would get us
  475.     let hackPercent = myForms.hackPercent(server, player);
  476.     if (hackPercent * hackThreads > .5) hackThreads = Math.ceil(.5 / hackPercent);
  477.     let moneyStolen = server.moneyMax * hackPercent * hackThreads;
  478.     //figure out how many grow threads it would take to recover
  479.  
  480.  
  481.     let growPercent = myForms.growPercent(server, 1, player, 1);
  482.     let moneyGrown = (server.moneyMax - moneyStolen) * (growPercent - 1);
  483.     //ns.tprint(moneyGrown, " = (", server.moneyMax, " - ", moneyStolen, ") * ", growPercent - 1);
  484.     let growthThreads = moneyStolen / moneyGrown;
  485.     //ns.tprint(growthThreads, " = ", moneyStolen, " / ", moneyGrown);
  486.     if (roundThreadsUp) growthThreads = Math.ceil(growthThreads);
  487.     //figure out how many weaken Threads are needed.
  488.     let weakenThreads1 = 0;
  489.     let weakenThreads2 = 0;
  490.     if (roundThreadsUp) {
  491.         weakenThreads1 = Math.ceil(hackThreads / 25);
  492.         weakenThreads2 = Math.ceil(growthThreads / 1.25);
  493.     }
  494.     else {
  495.         weakenThreads1 = hackThreads / 25;
  496.         weakenThreads2 = growthThreads / 1.25;
  497.     }
  498.     let totalThreads = hackThreads + growthThreads + weakenThreads1 + weakenThreads2;
  499.     let incomePerSecond = moneyStolen / (weakenTime / 1000);
  500.     return { hack: hackThreads, weaken1: weakenThreads1, grow: growthThreads, weaken2: weakenThreads2, hackPercent: hackPercent, totalThreads: totalThreads, income: incomePerSecond, totalHackPercent: hackPercent * hackThreads };
  501. }
  502. //Takes an array of actions
  503. //An action is defined as - [threadCount, command, timeToFinish, target, executionTime, scriptRam]
  504. let lastActionID = 0;
  505. /** @param {NS} ns */
  506. function batchSplit(ns, actions, servers, batchServers = [], deb = false) {
  507.  
  508.     let actionID = lastActionID;
  509.     for (let action of actions) {
  510.         let remainingThreads = action[0];
  511.         let command = action[1];
  512.         let timeToFinish = action[2];
  513.         let target = action[3];
  514.         let executionTime = action[4];
  515.         let scriptRam = action[5];
  516.         lastActionID++;
  517.         for (let tserver of servers) {
  518.             let server = tserver[0];
  519.             let freeThreads = Math.floor((ns.getServerMaxRam(server) - ns.getServerUsedRam(server)) / ns.getScriptRam(command));
  520.             for (let bServer of batchServers) {
  521.                 if (bServer[0] == server) {
  522.                     freeThreads -= bServer[1];
  523.                 }
  524.             }
  525.             if (deb) ns.tprint(server, " - ", freeThreads);
  526.             if (freeThreads > 0) {
  527.                 if (remainingThreads > freeThreads) {
  528.                     batchServers.push([server, freeThreads, command, target, timeToFinish, executionTime, actionID++]);
  529.                     remainingThreads -= freeThreads;
  530.                 } else {
  531.                     batchServers.push([server, remainingThreads, command, target, timeToFinish, executionTime, actionID++]);
  532.                     remainingThreads = 0;
  533.                     break;
  534.                 }
  535.             }
  536.  
  537.             if (remainingThreads == 0) {
  538.                 break;
  539.             }
  540.         }
  541.         if (remainingThreads > 0) {
  542.             //ns.tprint("Unable to batch - ", action, batchServers);
  543.             return [false, action, "Batch too large for the network", remainingThreads, batchServers];
  544.         }
  545.  
  546.     }
  547.     return [true, batchServers, "Batched Actions Successfully"];
  548. }
  549. //["n00dles",4,"/newserver/grow.js","joesguns",13529012.076642979,20249.87664293067,0]
  550. //target, timeToFinish, executionTime, actionID
  551. /** @param {NS} ns */
  552. async function executeBatch(ns, batch, batchDelay = 0) {
  553.     //ns.tprint(batch);
  554.     for (let batchOrder of batch[1]) {                       //target  ttf             execution time   id
  555.         //ns.tprint(batchOrder[0], " ordering - ",batchOrder[1] );
  556.         ns.exec(batchOrder[2], batchOrder[0], batchOrder[1], batchOrder[3], batchOrder[4], batchOrder[5], batchOrder[6]);
  557.     }
  558. }
  559.  
  560. export function autocomplete(data, args) {
  561.     return [...data.servers];
  562. }
  563.  
  564. /** @param {NS} ns */
  565. async function log(ns, s, level) {
  566.     if (doLog && level <= logLevel) ns.tprint(s);
  567. }
  568. /** @param {NS} ns */
  569. async function dropImmunity(ns, server) {
  570.     // If we have the BruteSSH.exe program, use it to open the SSH Port
  571.     // on the target server
  572.     let portLevel = 0;
  573.     if (ns.fileExists("BruteSSH.exe", "home") && !ns.hasRootAccess(server) && ns.getServerNumPortsRequired(server) > portLevel) {
  574.         log(ns, "Attempting BruteSSH on " + server, 2);
  575.         ns.brutessh(server);
  576.         portLevel++;
  577.     }
  578.     if (ns.fileExists("FTPCrack.exe", "home") && !ns.hasRootAccess(server) && ns.getServerNumPortsRequired(server) > portLevel) {
  579.         log(ns, "Attempting FTPCrack on " + server, 2);
  580.         ns.ftpcrack(server);
  581.         portLevel++;
  582.     }
  583.     if (ns.fileExists("relaySMTP.exe", "home") && !ns.hasRootAccess(server) && ns.getServerNumPortsRequired(server) > portLevel) {
  584.         log(ns, "Attempting relaySMTP on " + server, 2);
  585.         ns.relaysmtp(server);
  586.         portLevel++;
  587.     }
  588.     if (ns.fileExists("HTTPWorm.exe", "home") && !ns.hasRootAccess(server) && ns.getServerNumPortsRequired(server) > portLevel) {
  589.         log(ns, "Attempting HTTPWorm on " + server, 2);
  590.         ns.httpworm(server);
  591.         portLevel++;
  592.     }
  593.     if (ns.fileExists("SQLInject.exe", "home") && !ns.hasRootAccess(server) && ns.getServerNumPortsRequired(server) > portLevel) {
  594.         log(ns, "Attempting SQLInject on " + server, 2);
  595.         ns.sqlinject(server);
  596.         portLevel++;
  597.     }
  598.  
  599.  
  600.     // Get root access to target server
  601.     if (!ns.hasRootAccess(server)) {
  602.         if (ns.getServerNumPortsRequired(server) <= portLevel) {
  603.             ns.nuke(server);
  604.             if (ns.hasRootAccess(server)) {
  605.                 log(ns, "Gained root access to " + server, 1);
  606.             }
  607.         }
  608.         else log(ns, "Not enough open ports for " + server + " to run NUKE.exe", 2);
  609.     }
  610. }
Add Comment
Please, Sign In to add comment