auto hack improved grow
This commit is contained in:
+243
-96
@@ -1,6 +1,4 @@
|
||||
/** @param {import(".").NS } ns */
|
||||
|
||||
|
||||
import { EXPLOITS, DARKWEB_EXPLOITS } from "./constants.js";
|
||||
|
||||
/**
|
||||
* remove write log ✓
|
||||
@@ -23,121 +21,270 @@
|
||||
* buy hack tools
|
||||
*/
|
||||
|
||||
|
||||
/** @param {import(".").NS } ns */
|
||||
export async function main(ns) {
|
||||
// ns.disableLog('ALL');
|
||||
ns.disableLog('ALL');
|
||||
const doc = eval('document');
|
||||
|
||||
async function writeLog(type, obj) {
|
||||
let timeNow = new Date();
|
||||
let year = timeNow.getFullYear().toString().substring(2);
|
||||
let month = (timeNow.getMonth() < 9 ? '0' : '') + (timeNow.getMonth() + 1);
|
||||
let day = (timeNow.getDate() < 10 ? '0' : '') + timeNow.getDate();
|
||||
let hour = (timeNow.getHours() < 10 ? '0' : '') + timeNow.getHours();
|
||||
let minute = (timeNow.getMinutes() < 10 ? '0' : '') + timeNow.getMinutes();
|
||||
let second = (timeNow.getSeconds() < 10 ? '0' : '') + timeNow.getSeconds();
|
||||
let timestamp = `${year}.${month}.${day}_${hour}:${minute}:${second}`;
|
||||
ns.print(`${type}_${timestamp} = ${obj};`);
|
||||
|
||||
if (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${type}_${timestamp} = ${obj};`);
|
||||
}
|
||||
|
||||
async function runNuke(server) {
|
||||
let serverStatus = analyzeServer(server);
|
||||
await writeLog('ANALYZE', `{server: "${server}", status: ${JSON.stringify(serverStatus)}}`);
|
||||
|
||||
if (!serverStatus.rootAccess) {
|
||||
if (serverStatus.nukeAvailable) {
|
||||
await writeLog('NUKE', `"Nuking ${server}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"`);
|
||||
for (let i = 0; i < maxPortsToHack(); ++i) { // TODO: change to try/catch
|
||||
switch (EXPLOITS[i]) {
|
||||
case 'BruteSSH.exe':
|
||||
ns.brutessh(server);
|
||||
break;
|
||||
|
||||
case 'FTPCrack.exe':
|
||||
ns.ftpcrack(server);
|
||||
break;
|
||||
|
||||
case 'relaySMTP.exe':
|
||||
ns.relaysmtp(server);
|
||||
break;
|
||||
|
||||
case 'HTTPWorm.exe':
|
||||
ns.httpworm(server);
|
||||
break;
|
||||
|
||||
case 'SQLInject.exe':
|
||||
ns.sqlinject(server);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
ns.nuke(server);
|
||||
}
|
||||
// TODO: if faction > backdoor
|
||||
function terminalCommand(command) {
|
||||
const terminalInput = doc.getElementById("terminal-input");
|
||||
if (terminalInput != null && terminalInput != undefined) {
|
||||
const handler = Object.keys(terminalInput)[1];
|
||||
terminalInput.value = command;
|
||||
terminalInput[handler].onChange({ target: terminalInput });
|
||||
terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });
|
||||
}
|
||||
}
|
||||
async function runHack(server) {
|
||||
let script = 'simple-hack.js';
|
||||
|
||||
let serverStatus = analyzeServer(server);
|
||||
function maxPortsToHack() {
|
||||
let maxPorts = 0;
|
||||
EXPLOITS.forEach(exploit => {
|
||||
if (ns.fileExists(exploit.name)) ++maxPorts;
|
||||
});
|
||||
// ns.tryWritePort(2, `Max ports for hacking ${maxPorts}`);
|
||||
return maxPorts;
|
||||
}
|
||||
function analyzeServer(server) {
|
||||
let requiredHacking = ns.getServerRequiredHackingLevel(server);
|
||||
let requiredPorts = ns.getServerNumPortsRequired(server);
|
||||
let currentHacking = ns.getHackingLevel();
|
||||
|
||||
if (serverStatus.rootAccess) {
|
||||
if (!ns.fileExists(script, 'home')) {
|
||||
await writeLog('ERROR', `"Script '${script}' doesn't exist!"`);
|
||||
// return -3;
|
||||
}
|
||||
ns.scp(script, server, 'home');
|
||||
|
||||
let serverMaxRam = ns.getServerMaxRam(server);
|
||||
let serverUsedRam = ns.getServerUsedRam(server);
|
||||
let serverFreeRam = serverMaxRam - serverUsedRam;
|
||||
let scriptRam = ns.getScriptRam(script, server);
|
||||
let maxThreads = Math.floor(serverFreeRam / scriptRam);
|
||||
|
||||
let a = ns.scriptRunning(script, server);
|
||||
if (!a) {
|
||||
if (maxThreads == 0) {
|
||||
// await writeLog('ERROR', `"Not enough ram to run '${script}' on '${server}', ${scriptRam}/${serverFreeRam}!"`);
|
||||
return -4;
|
||||
}
|
||||
|
||||
let execExitCode = ns.exec(script, server, maxThreads, server);
|
||||
|
||||
if (!execExitCode) {
|
||||
// await writeLog('ERROR', `"Exec error running script '${script} on '${server}!"`);
|
||||
return -5;
|
||||
}
|
||||
else {
|
||||
return execExitCode;
|
||||
}
|
||||
} else {
|
||||
// await writeLog('ERROR', `"Hack already running on ${server}"`);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -6;
|
||||
return {
|
||||
name: server,
|
||||
rootAccess: ns.hasRootAccess(server),
|
||||
requiredHacking: requiredHacking,
|
||||
requiredPorts: requiredPorts,
|
||||
nukeAvailable: (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts),
|
||||
currentMoney: ns.getServerMoneyAvailable(server),
|
||||
maxMoney: ns.getServerMaxMoney(server),
|
||||
currentSecurity: ns.getServerSecurityLevel(server),
|
||||
minSecurity: ns.getServerMinSecurityLevel(server),
|
||||
RAM: ns.getServerMaxRam(server),
|
||||
};
|
||||
}
|
||||
|
||||
function scanServer(currentServer, previousServer = currentServer) {
|
||||
function scanServer(currentServer, previousServer = currentServer, network = []) {
|
||||
let availableServers = ns.scan(currentServer);
|
||||
let result = [];
|
||||
network.push(analyzeServer(currentServer));
|
||||
|
||||
for (let i = 0; i < availableServers.length; ++i) {
|
||||
let nextServer = availableServers[i];
|
||||
|
||||
if (nextServer != currentServer && nextServer != previousServer) {
|
||||
result.concat(scanServer(nextServer, currentServer));
|
||||
scanServer(nextServer, currentServer, network);
|
||||
}
|
||||
}
|
||||
return network;
|
||||
}
|
||||
|
||||
// if new game, buy TOR router, start hack course
|
||||
if (ns.getHackingLevel() == 1) {
|
||||
let terminal;
|
||||
let city;
|
||||
let travel;
|
||||
for (const elem of doc.querySelectorAll('div.MuiDrawer-root.MuiDrawer-docked p')) {
|
||||
if (elem.textContent == 'Terminal') {
|
||||
terminal = elem;
|
||||
}
|
||||
if (elem.textContent == 'City') {
|
||||
city = elem;
|
||||
}
|
||||
if (elem.textContent == 'Travel') {
|
||||
travel = elem;
|
||||
}
|
||||
}
|
||||
|
||||
return [currentServer].concat(result);
|
||||
city.click(); await ns.sleep(200);
|
||||
|
||||
for (const alphaEnt of doc.querySelectorAll('div#root p')) {
|
||||
if (alphaEnt.textContent == ' o-----+---x----o 4 T [alpha ent.] o-------o /') {
|
||||
alphaEnt.querySelector('span').click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (const TOR of doc.querySelectorAll('div#root button')) {
|
||||
if (TOR.textContent == 'Purchase TOR router - $200.000k') {
|
||||
TOR.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
travel.click(); await ns.sleep(200);
|
||||
|
||||
for (const aevum of doc.querySelectorAll('div#root span')) {
|
||||
if (aevum.textContent == 'A') {
|
||||
aevum.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (const travelConfirm of doc.querySelectorAll('div[role="presentation"] p')) {
|
||||
if (travelConfirm.textContent == 'Travel') {
|
||||
travelConfirm.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
doc.querySelector('div[role="presentation"] button').click();
|
||||
} catch (error) {
|
||||
|
||||
}
|
||||
|
||||
city.click(); await ns.sleep(200);
|
||||
|
||||
for (const uni of doc.querySelectorAll('div#root span')) {
|
||||
if (uni.textContent == 'U') {
|
||||
uni.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (const course of doc.querySelectorAll('div#root button')) {
|
||||
if (course.textContent == 'Take Algorithms course ($-1.280k / sec)' || course.textContent == 'Take Algorithms course($ - 960.000 / sec)') {
|
||||
course.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (const closeCourse of doc.querySelectorAll('div#root button')) {
|
||||
if (closeCourse.textContent == 'Do something else simultaneously') {
|
||||
closeCourse.click(); await ns.sleep(200);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let buyCounter = 120;
|
||||
let prevMaxMoneyHost = '';
|
||||
|
||||
while (true) {
|
||||
// Buy all available exploits
|
||||
// if (buyCounter == 120) {
|
||||
// terminalCommand("buyAll");
|
||||
// buyCounter = 0;
|
||||
// }
|
||||
// ++buyCounter;
|
||||
|
||||
// Buy more servers
|
||||
let serverRAM = 8;
|
||||
if (ns.getPurchasedServerCost(serverRAM) < ns.getServerMoneyAvailable('home') * 0.2) {
|
||||
ns.purchaseServer('home', serverRAM);
|
||||
}
|
||||
|
||||
for (const server of ns.getPurchasedServers()) {
|
||||
const serverStats = analyzeServer(server);
|
||||
if (ns.getPurchasedServerUpgradeCost(serverStats.name, serverStats.RAM * 2) < ns.getServerMoneyAvailable('home') * 0.2) {
|
||||
ns.upgradePurchasedServer(serverStats.name, serverStats.RAM * 2);
|
||||
}
|
||||
}
|
||||
|
||||
// Analyze all available hosts
|
||||
let network = scanServer('home');
|
||||
|
||||
await ns.sleep(100);
|
||||
// NUKE if possible
|
||||
for (let host of network) {
|
||||
ns.scp(['grow.js', 'weaken.js', 'hack.js'], host.name, 'home');
|
||||
if (!host.rootAccess && host.nukeAvailable) {
|
||||
for (const exploit of EXPLOITS) {
|
||||
if (ns.fileExists(exploit.name)) eval(`${exploit.function}('${host.name}')`);
|
||||
}
|
||||
ns.nuke(host.name);
|
||||
host = analyzeServer(host.name);
|
||||
}
|
||||
}
|
||||
|
||||
// Find host with most money
|
||||
let maxMoneyHost = network[1];
|
||||
for (const host of network) {
|
||||
if (host.name != 'home' && host.rootAccess) {
|
||||
if (host.maxMoney > maxMoneyHost.maxMoney && host.currentMoney > 0 && host.requiredHacking < ns.getHackingLevel() / 3) {
|
||||
maxMoneyHost = host;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clear log file if max money host changed
|
||||
if (maxMoneyHost.name != prevMaxMoneyHost) {
|
||||
ns.write('autoHackMax.txt', '', 'w');
|
||||
prevMaxMoneyHost = maxMoneyHost.name;
|
||||
}
|
||||
|
||||
// TODO: convert to global RAM usage
|
||||
|
||||
// Hack servers
|
||||
for (const host of network) {
|
||||
if (!ns.scriptRunning('grow.js', host.name) && !ns.scriptRunning('weaken.js', host.name) && !ns.scriptRunning('hack.js', host.name) && host.rootAccess && host.RAM > 0) {
|
||||
// if (false) {//(host.name != 'home' && host.currentMoney > 0) {
|
||||
// const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name);
|
||||
// const hackRAM = ns.getScriptRam('hack.js', host.name);
|
||||
// const growRAM = ns.getScriptRam('grow.js', host.name);
|
||||
// const weakenRAM = ns.getScriptRam('weaken.js', host.name);
|
||||
// const hackTime = ns.getHackTime(host.name);
|
||||
// const growTime = ns.getGrowTime(host.name);
|
||||
// const weakenTime = ns.getWeakenTime(host.name);
|
||||
// const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;
|
||||
// const hackAnalyze = ns.hackAnalyze(host.name);
|
||||
// const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(host.name, 1 + hackAnalyze));
|
||||
|
||||
// let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));
|
||||
// hackThreads = hackThreads == 0 ? 1 : hackThreads;
|
||||
// const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);
|
||||
// const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);
|
||||
// const weakenThreads = Math.floor(freeRAM / weakenRAM);
|
||||
// const log = `host:${host.name} target:${maxMoneyHost.name} | security:${(maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity).toFixed(2)} | hThreads:${hackThreads} hTime:${(growTime * (growLoops - 1) + hackWait + hackTime / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m | wThreads:${weakenThreads} wTime:${(weakenTime / 60000).toFixed(2)}m`;
|
||||
// ns.print(log);
|
||||
// ns.write('autoHack.txt', log + '\n', 'a');
|
||||
|
||||
// if (host.currentSecurity / host.minSecurity > 2) {
|
||||
// if (weakenThreads > 0) {
|
||||
// ns.exec('weaken.js', host.name, weakenThreads, host.name);
|
||||
// }
|
||||
// } else {
|
||||
// ns.exec('grow.js', host.name, growThreads, host.name, growLoops);
|
||||
// ns.exec('hack.js', host.name, hackThreads, host.name, growTime * (growLoops - 1) + hackWait);
|
||||
// }
|
||||
// } else {
|
||||
const freeRAM = ns.getServerMaxRam(host.name) - ns.getServerUsedRam(host.name) - (host.name == 'home' ? 1.8 : 0);
|
||||
const hackRAM = ns.getScriptRam('hack.js', host.name);
|
||||
const growRAM = ns.getScriptRam('grow.js', host.name);
|
||||
const weakenRAM = ns.getScriptRam('weaken.js', host.name);
|
||||
const hackTime = ns.getHackTime(maxMoneyHost.name);
|
||||
const growTime = ns.getGrowTime(maxMoneyHost.name);
|
||||
const weakenTime = ns.getWeakenTime(maxMoneyHost.name);
|
||||
const hackWait = hackTime <= growTime ? growTime - hackTime + 50 : 0;
|
||||
const hackAnalyze = ns.hackAnalyze(maxMoneyHost.name);
|
||||
const growThreadsNeededPerHack = Math.ceil(ns.growthAnalyze(maxMoneyHost.name, 1 + hackAnalyze));
|
||||
|
||||
let hackThreads = Math.floor(freeRAM / (hackRAM + growRAM * growThreadsNeededPerHack));
|
||||
hackThreads = hackThreads == 0 ? 1 : hackThreads;
|
||||
const growThreads = Math.floor((freeRAM - hackThreads * hackRAM) / growRAM);
|
||||
// ns.tprint(`Math.floor((${freeRAM} - ${hackThreads} * ${hackRAM}) / ${growRAM}) = ${growThreads}`);
|
||||
const growLoops = Math.ceil(growThreadsNeededPerHack / growThreads);
|
||||
const weakenThreads = Math.floor(freeRAM / weakenRAM);
|
||||
const log = `host:${host.name} target:${maxMoneyHost.name} | security:${(maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity).toFixed(2)}% | money:${(maxMoneyHost.currentMoney / maxMoneyHost.maxMoney * 100).toFixed(0)}% | hThreads:${hackThreads} hTime:${((growTime * (growLoops - 1) + hackWait + hackTime) / 60000).toFixed(2)}m | gThreads:${growThreads} gLoops:${growLoops} gTime:${(growTime * growLoops / 60000).toFixed(2)}m`; // | wThreads:${weakenThreads} wTime:${(weakenTime / 60000).toFixed(2)}m`;
|
||||
ns.print(log);
|
||||
ns.write('autoHackMax.txt', log + '\n', 'a');
|
||||
|
||||
if (maxMoneyHost.currentSecurity / maxMoneyHost.minSecurity > 5) {
|
||||
if (weakenThreads > 0) {
|
||||
ns.exec('weaken.js', host.name, weakenThreads, maxMoneyHost.name);
|
||||
}
|
||||
} else {
|
||||
if (maxMoneyHost.currentMoney / maxMoneyHost.maxMoney < 0.2) {
|
||||
ns.exec('grow.js', host.name, Math.floor(freeRAM / growRAM), maxMoneyHost.name);
|
||||
} else {
|
||||
ns.exec('grow.js', host.name, growThreads, maxMoneyHost.name, growLoops);
|
||||
ns.exec('hack.js', host.name, hackThreads, maxMoneyHost.name, growTime * (growLoops - 1) + hackWait);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
// Sleep before next loop
|
||||
await ns.sleep(1000);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user