auto hack improved grow
This commit is contained in:
Vendored
-1
@@ -29,7 +29,6 @@
|
|||||||
"prefix": "initmain",
|
"prefix": "initmain",
|
||||||
"body": [
|
"body": [
|
||||||
"/** @param {import(\".\").NS } ns */",
|
"/** @param {import(\".\").NS } ns */",
|
||||||
"",
|
|
||||||
"export async function main(ns) {",
|
"export async function main(ns) {",
|
||||||
" // ns.disableLog('ALL');",
|
" // ns.disableLog('ALL');",
|
||||||
" ",
|
" ",
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
/** @param {import(".").NS } ns */
|
|
||||||
|
|
||||||
export async function main(ns) {
|
|
||||||
// ns.disableLog('ALL');
|
|
||||||
|
|
||||||
ns.alterReality();
|
|
||||||
ns.rainbow('noodles');
|
|
||||||
}
|
|
||||||
+244
-97
@@ -1,6 +1,4 @@
|
|||||||
/** @param {import(".").NS } ns */
|
import { EXPLOITS, DARKWEB_EXPLOITS } from "./constants.js";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* remove write log ✓
|
* remove write log ✓
|
||||||
@@ -23,121 +21,270 @@
|
|||||||
* buy hack tools
|
* buy hack tools
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/** @param {import(".").NS } ns */
|
||||||
export async function main(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};`);
|
function terminalCommand(command) {
|
||||||
}
|
const terminalInput = doc.getElementById("terminal-input");
|
||||||
|
if (terminalInput != null && terminalInput != undefined) {
|
||||||
async function runNuke(server) {
|
const handler = Object.keys(terminalInput)[1];
|
||||||
let serverStatus = analyzeServer(server);
|
terminalInput.value = command;
|
||||||
await writeLog('ANALYZE', `{server: "${server}", status: ${JSON.stringify(serverStatus)}}`);
|
terminalInput[handler].onChange({ target: terminalInput });
|
||||||
|
terminalInput[handler].onKeyDown({ key: 'Enter', preventDefault: () => null });
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function runHack(server) {
|
|
||||||
let script = 'simple-hack.js';
|
|
||||||
|
|
||||||
let serverStatus = analyzeServer(server);
|
|
||||||
|
|
||||||
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;
|
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();
|
||||||
|
|
||||||
|
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 availableServers = ns.scan(currentServer);
|
||||||
let result = [];
|
network.push(analyzeServer(currentServer));
|
||||||
|
|
||||||
for (let i = 0; i < availableServers.length; ++i) {
|
for (let i = 0; i < availableServers.length; ++i) {
|
||||||
let nextServer = availableServers[i];
|
let nextServer = availableServers[i];
|
||||||
|
|
||||||
if (nextServer != currentServer && nextServer != previousServer) {
|
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) {
|
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');
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-2
@@ -1,6 +1,6 @@
|
|||||||
/** @param {import(".").NS } ns */
|
|
||||||
import { EXCLUDE_SERVERS } from "./constants.js";
|
import { EXCLUDE_SERVERS } from "./constants.js";
|
||||||
|
|
||||||
|
/** @param {import(".").NS} ns*/
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
ns.disableLog('ALL');
|
ns.disableLog('ALL');
|
||||||
|
|
||||||
@@ -17,7 +17,6 @@ export async function main(ns) {
|
|||||||
|
|
||||||
if (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${timestamp} ${type} = ${obj}`);
|
if (['ERROR', 'TERMINAL'].indexOf(type) != -1) ns.tprint(`${timestamp} ${type} = ${obj}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constant
|
* @constant
|
||||||
* @default
|
* @default
|
||||||
|
|||||||
+8
-2
@@ -1,5 +1,4 @@
|
|||||||
/** @param {import(".").NS } ns */
|
/** @param {import(".").NS } ns */
|
||||||
// import { EXCLUDE_SERVERS } from "./constants.js";
|
|
||||||
|
|
||||||
export const EXCLUDE_SERVERS = [
|
export const EXCLUDE_SERVERS = [
|
||||||
'home',
|
'home',
|
||||||
@@ -21,8 +20,15 @@ for (let index = 0; index < 1024; index++) {
|
|||||||
EXCLUDE_SERVERS.push(`home-${index}`);
|
EXCLUDE_SERVERS.push(`home-${index}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const EXPLOITS = [
|
||||||
|
{ name: 'BruteSSH.exe', function: 'ns.brutessh' },
|
||||||
|
{ name: 'FTPCrack.exe', function: 'ns.ftpcrack' },
|
||||||
|
{ name: 'relaySMTP.exe', function: 'ns.relaysmtp' },
|
||||||
|
{ name: 'HTTPWorm.exe', function: 'ns.httpworm' },
|
||||||
|
{ name: 'SQLInject.exe', function: 'ns.sqlinject' },
|
||||||
|
];
|
||||||
|
|
||||||
const DARKWEB_PROGRAMS = [
|
export const DARKWEB_EXPLOITS = [
|
||||||
{ name: 'BruteSSH.exe', cost: 0 },
|
{ name: 'BruteSSH.exe', cost: 0 },
|
||||||
{ name: 'FTPCrack.exe', cost: 1500000 },
|
{ name: 'FTPCrack.exe', cost: 1500000 },
|
||||||
{ name: 'relaySMTP.exe', cost: 5000000 },
|
{ name: 'relaySMTP.exe', cost: 5000000 },
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/** @param {import(".").NS } ns */
|
||||||
|
|
||||||
|
export async function main(ns) {
|
||||||
|
// ns.disableLog('ALL');
|
||||||
|
|
||||||
|
ns.exploit();
|
||||||
|
const doc = eval('document');
|
||||||
|
ns.alterReality(); // breakpoint and change value
|
||||||
|
ns.rainbow('noodles');
|
||||||
|
window.performance.now = function () { return 0; };
|
||||||
|
Number.prototype.toExponential = function () { return null; };
|
||||||
|
doc.achievements.push("UNACHIEVABLE");
|
||||||
|
doc.getElementById('unclickable').style = "display: block;position: absolute;top: 50%;left: 50%;width: 100px;height: 100px;z-index: 10000;background: red;";
|
||||||
|
doc.getElementById('unclickable').parentNode.addEventListener('click', () => {
|
||||||
|
doc.getElementById('unclickable').style = "display: none; visibility: hidden;";
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
// ns.disableLog('ALL');
|
// ns.disableLog('ALL');
|
||||||
|
const maxLoops = ns.args.length > 1 ? ns.args[1] : 1;
|
||||||
|
for (let loops = 0; loops < maxLoops; loops++) {
|
||||||
|
ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)
|
||||||
await ns.grow(ns.args.length > 0 ? ns.args[0] : '');
|
await ns.grow(ns.args.length > 0 ? ns.args[0] : '');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,5 +3,6 @@
|
|||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
// ns.disableLog('ALL');
|
// ns.disableLog('ALL');
|
||||||
|
|
||||||
|
await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);
|
||||||
await ns.hack(ns.args.length > 0 ? ns.args[0] : '');
|
await ns.hack(ns.args.length > 0 ? ns.args[0] : '');
|
||||||
}
|
}
|
||||||
+2
-29
@@ -1,18 +1,15 @@
|
|||||||
/** @param {import(".").NS } ns */
|
/** @param {import(".").NS } ns */
|
||||||
|
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
ns.disableLog('ALL');
|
ns.disableLog('ALL');
|
||||||
|
|
||||||
const nodeCostThreshold = ns.args.length > 0 ? ns.args[0] : 0.2;
|
const nodeCostThreshold = ns.args.length > 0 ? ns.args[0] : 0.2;
|
||||||
const upgradeCostThreshold = ns.args.length > 1 ? ns.args[1] : 0.1;
|
const upgradeCostThreshold = ns.args.length > 1 ? ns.args[1] : 0.1;
|
||||||
const upgradeCount = ns.args.length > 2 ? ns.args[2] : 1;
|
const upgradeCount = ns.args.length > 2 ? ns.args[2] : 1;
|
||||||
const helperBuyThreshold = ns.args.length > 3 ? ns.args[3] : 0.2;
|
|
||||||
const nodeCap = 24;
|
const nodeCap = 24;
|
||||||
const levelCap = 200;
|
const levelCap = 200;
|
||||||
const ramCap = 64;
|
const ramCap = 64;
|
||||||
const coreCap = 16;
|
const coreCap = 16;
|
||||||
const serverRAM = 32;
|
// ns.tprint(`Bot started {nodeCostThreshold: ${nodeCostThreshold}, upgradeCostThreshold: ${upgradeCostThreshold}, upgradeCount: ${upgradeCount}}`);
|
||||||
ns.tprint(`Bot started {nodeCostThreshold: ${nodeCostThreshold}, upgradeCostThreshold: ${upgradeCostThreshold}, upgradeCount: ${upgradeCount}}`);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +22,7 @@ export async function main(ns) {
|
|||||||
if (nodeCount < nodeCap && nodePurchaseCost / Math.abs(currentMoney) < nodeCostThreshold) {
|
if (nodeCount < nodeCap && nodePurchaseCost / Math.abs(currentMoney) < nodeCostThreshold) {
|
||||||
ns.hacknet.purchaseNode();
|
ns.hacknet.purchaseNode();
|
||||||
currentMoney = ns.getServerMoneyAvailable("home");
|
currentMoney = ns.getServerMoneyAvailable("home");
|
||||||
++nodeCount;
|
nodeCount = ns.hacknet.numNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let index = 0; index < nodeCount; ++index) {
|
for (let index = 0; index < nodeCount; ++index) {
|
||||||
@@ -47,30 +44,6 @@ export async function main(ns) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let serverCost = ns.getPurchasedServerCost(serverRAM);
|
|
||||||
|
|
||||||
if (serverCost < currentMoney * helperBuyThreshold) {
|
|
||||||
let newServer = ns.purchaseServer('home', serverRAM);
|
|
||||||
if (newServer != '') {
|
|
||||||
ns.tprint(`Bought a server`);
|
|
||||||
ns.scp('grow-helper.js', newServer);
|
|
||||||
ns.scp('constants.js', newServer);
|
|
||||||
let execExitCode = ns.exec('grow-helper.js', newServer, 10, 20);
|
|
||||||
ns.tprint(`Exec 'grow-helper.js' exit code: ${execExitCode}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// let logFiles = ['hack-log.js', 'nuke-log.js'];
|
|
||||||
|
|
||||||
// for (let index = 0; index < logFiles.length; index++) {
|
|
||||||
// const logFile = logFiles[index];
|
|
||||||
// let portData = ns.readPort(index + 1);
|
|
||||||
// if (portData != 'NULL PORT DATA') ns.write(logFile, portData, 'a');
|
|
||||||
// }
|
|
||||||
|
|
||||||
await ns.sleep(1000);
|
await ns.sleep(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Vendored
+2441
-1929
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
|||||||
|
/** @param {import(".").NS } ns */
|
||||||
|
export async function main(ns) {
|
||||||
|
// ns.disableLog('ALL');
|
||||||
|
const doc = eval('document');
|
||||||
|
|
||||||
|
function numberToUnits(number) {
|
||||||
|
let numberString = Math.floor(number);
|
||||||
|
if (Math.abs(number) / 1000 >= 1) {
|
||||||
|
numberString = Math.floor(number / 1000) + 'k';
|
||||||
|
}
|
||||||
|
if (Math.abs(number) / 1000000 >= 1) {
|
||||||
|
numberString = Math.floor(number / 1000000) + 'm';
|
||||||
|
}
|
||||||
|
if (Math.abs(number) / 1000000000 >= 1) {
|
||||||
|
numberString = Math.floor(number / 1000000000) + 'b';
|
||||||
|
}
|
||||||
|
if (Math.abs(number) / 1000000000000 >= 1) {
|
||||||
|
numberString = Math.floor(number / 1000000000000) + 't';
|
||||||
|
}
|
||||||
|
|
||||||
|
return numberString;
|
||||||
|
}
|
||||||
|
|
||||||
|
let lastMoney = ns.getServerMoneyAvailable('home');
|
||||||
|
let lastTime = Date.now();
|
||||||
|
const firstMoney = ns.getServerMoneyAvailable('home');
|
||||||
|
const firstTime = Date.now();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const currentMoney = ns.getServerMoneyAvailable('home');
|
||||||
|
const moneyDiff = currentMoney - lastMoney;
|
||||||
|
const currentTime = Date.now();
|
||||||
|
const timeDiff = (currentTime - lastTime) / 1000;
|
||||||
|
const moneyPerSecond = moneyDiff / timeDiff;
|
||||||
|
const moneyDiffLife = currentMoney - firstMoney;
|
||||||
|
const timeDiffLife = (currentTime - firstTime) / 1000;
|
||||||
|
const moneyPerSecondLife = moneyDiffLife / timeDiffLife;
|
||||||
|
const moneyString = `${numberToUnits(Math.floor(moneyPerSecond))} | ${numberToUnits(Math.floor(moneyPerSecondLife))} $/s`;
|
||||||
|
ns.print(`${lastMoney} ${currentMoney} ${moneyDiff} ${numberToUnits(Math.floor(moneyPerSecondLife)) }\n ${currentTime} ${currentTime} ${timeDiff}`);
|
||||||
|
doc.querySelector("#root > div.react-draggable > div.drag.MuiBox-root > div > p").innerText = moneyString;
|
||||||
|
ns.write('moneyStats.txt', moneyString+'\n', 'a');
|
||||||
|
lastMoney = currentMoney;
|
||||||
|
lastTime = currentTime;
|
||||||
|
await ns.sleep(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
let getProps = (obj) => Object.entries(obj).find(entry => entry[0].startsWith("__reactProps"))[1].children.props;
|
||||||
|
let hasPlayer = (obj) => {
|
||||||
|
try {
|
||||||
|
return getProps(obj).player ? true : false;
|
||||||
|
}
|
||||||
|
catch (ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @param {NS} ns **/
|
||||||
|
export async function main(ns) {
|
||||||
|
let boxes = Array.from(eval("document").querySelectorAll("[class*=MuiBox-root]"));
|
||||||
|
let box = boxes.find(x => hasPlayer(x));
|
||||||
|
|
||||||
|
if (box) {
|
||||||
|
ns.tprintf("INFO className: \"" + box.className + "\"");
|
||||||
|
|
||||||
|
let props = getProps(box);
|
||||||
|
|
||||||
|
// get a 10% cash bonus
|
||||||
|
props.player.money = props.player.money * 1.1;
|
||||||
|
|
||||||
|
// open dev menu
|
||||||
|
props.router.toDevMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+29
-12
@@ -1,6 +1,6 @@
|
|||||||
/** @param {import(".").NS } ns */
|
|
||||||
const doc = eval('document');
|
const doc = eval('document');
|
||||||
|
|
||||||
|
/** @param {import(".").NS } ns */
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
// ns.disableLog('ALL');
|
// ns.disableLog('ALL');
|
||||||
|
|
||||||
@@ -27,49 +27,66 @@ export async function main(ns) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
city.click(); await ns.sleep(200);
|
||||||
|
|
||||||
travel.click(); await ns.sleep(100);
|
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 == '') {
|
||||||
|
// TOR.click(); await ns.sleep(200);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
travel.click(); await ns.sleep(200);
|
||||||
|
|
||||||
for (const aevum of doc.querySelectorAll('div#root span')) {
|
for (const aevum of doc.querySelectorAll('div#root span')) {
|
||||||
if (aevum.textContent == 'A') {
|
if (aevum.textContent == 'A') {
|
||||||
aevum.click(); await ns.sleep(100);
|
aevum.click(); await ns.sleep(200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const travelConfirm of doc.querySelectorAll('div[role="presentation"] p')) {
|
for (const travelConfirm of doc.querySelectorAll('div[role="presentation"] p')) {
|
||||||
if (travelConfirm.textContent == 'Travel') {
|
if (travelConfirm.textContent == 'Travel') {
|
||||||
travelConfirm.click(); await ns.sleep(100);
|
travelConfirm.click(); await ns.sleep(200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const closeButton = doc.querySelector('div[role="presentation"] button');
|
try {
|
||||||
if(!closeButton == undefined) closeButton.click();
|
doc.querySelector('div[role="presentation"] button').click();
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
city.click(); await ns.sleep(100);
|
}
|
||||||
|
|
||||||
|
city.click(); await ns.sleep(200);
|
||||||
|
|
||||||
for (const uni of doc.querySelectorAll('div#root span')) {
|
for (const uni of doc.querySelectorAll('div#root span')) {
|
||||||
if (uni.textContent == 'U') {
|
if (uni.textContent == 'U') {
|
||||||
uni.click(); await ns.sleep(100);
|
uni.click(); await ns.sleep(200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const course of doc.querySelectorAll('div#root button')) {
|
for (const course of doc.querySelectorAll('div#root button')) {
|
||||||
if (course.textContent == 'Take Algorithms course ($-1.280k / sec)') {
|
if (course.textContent == 'Take Algorithms course ($-1.280k / sec)') {
|
||||||
course.click(); await ns.sleep(100);
|
course.click(); await ns.sleep(200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const closeCourse of doc.querySelectorAll('div#root button')) {
|
for (const closeCourse of doc.querySelectorAll('div#root button')) {
|
||||||
if (closeCourse.textContent == 'Do something else simultaneously') {
|
if (closeCourse.textContent == 'Do something else simultaneously') {
|
||||||
closeCourse.click(); await ns.sleep(100);
|
closeCourse.click(); await ns.sleep(200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await ns.sleep(1000);
|
await ns.sleep(1000);
|
||||||
console.log(terminal)
|
terminal.click();
|
||||||
terminal.click(); await ns.sleep(100);
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { EXPLOITS } from "./constants.js"
|
||||||
|
|
||||||
|
/** @param {import(".").NS } ns */
|
||||||
|
export async function main(ns) {
|
||||||
|
// ns.disableLog('ALL');
|
||||||
|
|
||||||
|
// function scanServer(currentServer, previousServer = currentServer) {
|
||||||
|
// let availableServers = ns.scan(currentServer);
|
||||||
|
// let result = [];
|
||||||
|
|
||||||
|
// for (let i = 0; i < availableServers.length; ++i) {
|
||||||
|
// let nextServer = availableServers[i];
|
||||||
|
|
||||||
|
// if (nextServer != currentServer && nextServer != previousServer) {
|
||||||
|
// result.concat(scanServer(nextServer, currentServer));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return [currentServer].concat(result);
|
||||||
|
// }
|
||||||
|
|
||||||
|
function maxPortsToHack() {
|
||||||
|
let maxPorts = 0;
|
||||||
|
for (const exploit of EXPLOITS) {
|
||||||
|
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();
|
||||||
|
|
||||||
|
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),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function scanServer(currentServer, previousServer = currentServer, network = []) {
|
||||||
|
let availableServers = ns.scan(currentServer);
|
||||||
|
network.push(analyzeServer(currentServer));
|
||||||
|
|
||||||
|
for (let i = 0; i < availableServers.length; ++i) {
|
||||||
|
let nextServer = availableServers[i];
|
||||||
|
|
||||||
|
if (nextServer != currentServer && nextServer != previousServer) {
|
||||||
|
scanServer(nextServer, currentServer, network);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return network;
|
||||||
|
}
|
||||||
|
|
||||||
|
let network = scanServer('home');
|
||||||
|
ns.tprint(network[0])
|
||||||
|
ns.as
|
||||||
|
}
|
||||||
@@ -3,5 +3,6 @@
|
|||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
// ns.disableLog('ALL');
|
// ns.disableLog('ALL');
|
||||||
|
|
||||||
|
await ns.sleep(ns.args.length > 1 ? ns.args[1] : 0);
|
||||||
await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')
|
await ns.weaken(ns.args.length > 0 ? ns.args[0] : '')
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user