204 lines
5.5 KiB
JavaScript
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;
|
|
} |