Files
2025-02-22 03:37:47 -07:00

204 lines
5.5 KiB
JavaScript

import { crack } from "crack.js";
/** @param {NS} ns */
function printHelp(ns) {
ns.tprint(
"This is a core script which handles basic node (or server/host) operations.\n" +
"Some functions are available via an API, some are only available through\n" +
"the command line interface.\n\n" +
"API REFERENCE:\n" +
"isHackable(ns, node): boolean\n"
);
}
/** @param {NS} ns */
export async function totalAvailableThreads(ns, script) {
var nodes = await getNodes(ns);
var threads = 0;
nodes.forEach(function(node) {
threads += Math.floor(ns.getServerMaxRam(node) / ns.getScriptRam(script));
});
return threads;
}
/** @param {NS} ns */
export function isHackable(ns, node) {
if(node == "" || node == "\n" || node == "home" || node == "darkweb") {
return false;
}
if(node.slice(0, 6) == "server-") {
return true;
}
// Skip servers I cannot hack.
if(ns.getHackingLevel() < ns.getServerRequiredHackingLevel(node)) {
return false;
}
// Crack if I don't have root access.
if(!ns.hasRootAccess(node)) {
if(!crack(ns, node)) {
return false;
}
}
return true;
}
/** @param {NS} ns */
export async function getNodesByRam(ns) {
let nodes = (await ns.read("nodes.txt")).split("\n");
const n = nodes.length;
for (let i = 0; i < n - 1; i++) {
let swapped = false; // Flag to optimize: if no swaps occur, the array is sorted
for (let j = 0; j < n - i - 1; j++) {
if (ns.getServerMaxRam(nodes[j]) > ns.getServerMaxRam(nodes[j + 1])) {
// Swap arr[j] and arr[j+1]
[nodes[j], nodes[j + 1]] = [nodes[j + 1], nodes[j]]; // Array destructuring for swap
swapped = true;
}
}
// If no two elements were swapped in inner loop, the array is sorted
if (swapped === false) {
break;
}
}
nodes = nodes.reverse();
while(ns.getServerMaxRam(nodes[nodes.length - 1]) == 0) {
nodes.pop();
}
return nodes;
}
/** @param {NS} ns */
export async function getNodesByPriority(ns) {
const nodes = (await ns.read("nodes.txt")).split("\n");
const n = nodes.length;
for (let i = 0; i < n - 1; i++) {
let swapped = false; // Flag to optimize: if no swaps occur, the array is sorted
for (let j = 0; j < n - i - 1; j++) {
if (ns.getServerMaxMoney(nodes[j]) > ns.getServerMaxMoney(nodes[j + 1])) {
// Swap arr[j] and arr[j+1]
[nodes[j], nodes[j + 1]] = [nodes[j + 1], nodes[j]]; // Array destructuring for swap
swapped = true;
}
}
// If no two elements were swapped in inner loop, the array is sorted
if (swapped === false) {
break;
}
}
return nodes.reverse();
}
/** @param {NS} ns */
async function getNodesByHackable(ns) {
const nodes = (await ns.read("nodes.txt")).split("\n");
var hackableNodes = [];
for (let i = 0; i < nodes.length; i++) {
if(isHackable(ns, nodes[i])) {
hackableNodes.push(nodes[i]);
}
}
return hackableNodes;
}
/** @param {NS} ns */
export async function getNodes(ns) {
const nodes = await ns.read("nodes.txt");
return nodes.split("\n");
}
/** @param {NS} ns */
export function getIdealNode(ns) {
var nodes = ['home']
for (var i = 0; i < nodes.length; i++) {
var node = ns.scan(nodes[i]);
for (var j = 0; j < node.length; j++) {
if (nodes.indexOf(node[j]) === -1 && isHackable(ns, node[j])) {
nodes.push(node[j]);
}
}
}
var idealNode = "n00dles";
nodes.forEach(function(n) {
if(ns.getServerMaxMoney(n) > ns.getServerMaxMoney(idealNode)) {
idealNode = n;
}
});
return idealNode;
}
/** @param {NS} ns */
async function write(ns, nodes) {
await ns.write("nodes.txt", "", "w");
var hackableNodes = [];
for(var i = 0; i < nodes.length; i++) {
if(isHackable(ns, nodes[i])) {
hackableNodes.push(nodes[i]);
}
}
for(var i = 0; i < hackableNodes.length; i++) {
let text = hackableNodes[i];
if(i != hackableNodes.length - 1) {
text += "\n";
}
await ns.write("nodes.txt", text, "a");
}
}
/** @param {NS} ns */
export async function main(ns) {
var nodes = ['home']
for (var i = 0; i < nodes.length; i++) {
var node = ns.scan(nodes[i]);
for (var j = 0; j < node.length; j++) {
if (nodes.indexOf(node[j]) === -1) {
nodes.push(node[j]);
}
}
}
if(ns.args.length == 0) {
ns.tprint(nodes);
} else if(ns.args[0] == "--update" || ns.args[0] == "-u") {
await write(ns, nodes);
// Get the ideal node to target.
} else if(ns.args[0] == "--priority" || ns.args[0] == "-p") {
ns.tprint("nodes by priority: " + await getNodesByPriority(ns));
} else if(ns.args[0] == "--hackable" || ns.args[0] == "-ha") {
var hackableNodes = await getNodesByHackable(ns);
ns.tprint(hackableNodes.length + " hackable nodes: " + hackableNodes);
} else if(ns.args[0] == "--help" || ns.args[0] == "-h") {
printHelp(ns);
exit();
// Kill all scripts except on home.
} else if(ns.args[0] == "--killall" || ns.args[0] == "-k") {
var nodes = await getNodes(ns);
nodes.forEach(function(n) {
ns.killall(n);
});
}
return nodes;
}