auto hack improved grow
This commit is contained in:
1 parent
7b14e98658
commit
435add26de
18 files changed
+8289
-7480
No files matched your search
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');
|
|
||||||
}
|
|
||||||
+243
-96
@@ -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);
|
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) {
|
return {
|
||||||
if (!ns.fileExists(script, 'home')) {
|
name: server,
|
||||||
await writeLog('ERROR', `"Script '${script}' doesn't exist!"`);
|
rootAccess: ns.hasRootAccess(server),
|
||||||
// return -3;
|
requiredHacking: requiredHacking,
|
||||||
}
|
requiredPorts: requiredPorts,
|
||||||
ns.scp(script, server, 'home');
|
nukeAvailable: (currentHacking >= requiredHacking && maxPortsToHack() >= requiredPorts),
|
||||||
|
currentMoney: ns.getServerMoneyAvailable(server),
|
||||||
let serverMaxRam = ns.getServerMaxRam(server);
|
maxMoney: ns.getServerMaxMoney(server),
|
||||||
let serverUsedRam = ns.getServerUsedRam(server);
|
currentSecurity: ns.getServerSecurityLevel(server),
|
||||||
let serverFreeRam = serverMaxRam - serverUsedRam;
|
minSecurity: ns.getServerMinSecurityLevel(server),
|
||||||
let scriptRam = ns.getScriptRam(script, server);
|
RAM: ns.getServerMaxRam(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 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;
|
||||||
await ns.grow(ns.args.length > 0 ? ns.args[0] : '');
|
for (let loops = 0; loops < maxLoops; loops++) {
|
||||||
|
ns.print(`${ns.args[0]} ${maxLoops} ${loops}`)
|
||||||
|
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
+7839
-7327
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
eyJjdG9yIjoiQml0YnVybmVyU2F2ZU9iamVjdCIsImRhdGEiOnsiUGxheWVyU2F2ZSI6IntcImN0b3JcIjpcIlBsYXllck9iamVjdFwiLFwiZGF0YVwiOntcImhwXCI6e1wiY3VycmVudFwiOjExLFwibWF4XCI6MTF9LFwic2tpbGxzXCI6e1wiaGFja2luZ1wiOjI3NzcsXCJzdHJlbmd0aFwiOjksXCJkZWZlbnNlXCI6MTAsXCJkZXh0ZXJpdHlcIjo5LFwiYWdpbGl0eVwiOjUsXCJjaGFyaXNtYVwiOjYsXCJpbnRlbGxpZ2VuY2VcIjowfSxcImV4cFwiOntcImhhY2tpbmdcIjoyNzIzNTkxODIuMTU5MTAxNixcInN0cmVuZ3RoXCI6MzQuMjg4Nzc0NjIyNTg2MTc1LFwiZGVmZW5zZVwiOjM0LjI4ODc3NDYyMjU4NjE3NSxcImRleHRlcml0eVwiOjM0LjI4ODc3NDYyMjU4NjE3NSxcImFnaWxpdHlcIjozNC4yODg3NzQ2MjI1ODYxNzUsXCJjaGFyaXNtYVwiOjMwLjc5NDE3NzAwODk2NzU1NSxcImludGVsbGlnZW5jZVwiOjB9LFwibXVsdHNcIjp7XCJoYWNraW5nX2NoYW5jZVwiOjIuNTA2ODQ0MTQxODM3MjM0LFwiaGFja2luZ19zcGVlZFwiOjIuNDUyMzc0MjIyMjc4NzkwOCxcImhhY2tpbmdfbW9uZXlcIjo4LjEzMjg2ODczMDc5NDY1LFwiaGFja2luZ19ncm93XCI6My44MDA4ODY1MTQ5OTQ3ODkyLFwiaGFja2luZ1wiOjYuNTg5NDQ4OTg3MDcwOTg2LFwic3RyZW5ndGhcIjozLjAwNjg2MTc3NDU5NjAxNTYsXCJkZWZlbnNlXCI6My42NjA1MjczNzc3NjkwNjE1LFwiZGV4dGVyaXR5XCI6My4wNDY0MjU3NDUzMTQzODUsXCJhZ2lsaXR5XCI6MS44MjQ0MjU1MjcxOTc0OTkyLFwiY2hhcmlzbWFcIjoyLjQ3MTc3MzQwNTQwMjA3OTIsXCJoYWNraW5nX2V4cFwiOjkuNzE2ODE1NzM0NjM1Mzk1LFwic3RyZW5ndGhfZXhwXCI6Mi42Mzc1OTgwNDc4OTEyNDEzLFwiZGVmZW5zZV9leHBcIjoyLjYzNzU5ODA0Nzg5MTI0MTMsXCJkZXh0ZXJpdHlfZXhwXCI6Mi42Mzc1OTgwNDc4OTEyNDEzLFwiYWdpbGl0eV9leHBcIjoyLjYzNzU5ODA0Nzg5MTI0MTMsXCJjaGFyaXNtYV9leHBcIjoyLjM2ODc4Mjg0Njg0MzY1OTYsXCJjb21wYW55X3JlcFwiOjMuMTI2NzkzMzU3ODMzNjMwNCxcImZhY3Rpb25fcmVwXCI6Mi4zNjg3ODI4NDY4NDM2NTk2LFwiY3JpbWVfbW9uZXlcIjoyLjA1OTgxMTE3MTE2ODM5OTMsXCJjcmltZV9zdWNjZXNzXCI6Mi4zNDA2OTQ1MTI2OTEzNjMsXCJoYWNrbmV0X25vZGVfbW9uZXlcIjo0LjM4MjI1OTI1NjY1MjYzMyxcImhhY2tuZXRfbm9kZV9wdXJjaGFzZV9jb3N0XCI6MC40NDAyNzI5MzQ0MzIwODUzNyxcImhhY2tuZXRfbm9kZV9yYW1fY29zdFwiOjAuNTc1NTIwMTc1NzI4MjE2LFwiaGFja25ldF9ub2RlX2NvcmVfY29zdFwiOjAuNTc1NTIwMTc1NzI4MjE2LFwiaGFja25ldF9ub2RlX2xldmVsX2Nvc3RcIjowLjQ4OTE5MjE0OTM2ODk4MzYsXCJ3b3JrX21vbmV5XCI6My4zOTYzODUzMTIzOTMyODcyLFwiYmxhZGVidXJuZXJfbWF4X3N0YW1pbmFcIjoxLFwiYmxhZGVidXJuZXJfc3RhbWluYV9nYWluXCI6MSxcImJsYWRlYnVybmVyX2FuYWx5c2lzXCI6MSxcImJsYWRlYnVybmVyX3N1Y2Nlc3NfY2hhbmNlXCI6MX0sXCJhdWdtZW50YXRpb25zXCI6W3tcImxldmVsXCI6MSxcIm5hbWVcIjpcIkhhY2tuZXQgTm9kZSBOSUMgQXJjaGl0ZWN0dXJlIE5ldXJhbC1VcGxvYWRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIENvcmUgRGlyZWN0LU5ldXJhbCBJbnRlcmZhY2VcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIEtlcm5lbCBEaXJlY3QtTmV1cmFsIEludGVyZmFjZVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJIYWNrbmV0IE5vZGUgQ1BVIEFyY2hpdGVjdHVyZSBOZXVyYWwtVXBsb2FkXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkhhY2tuZXQgTm9kZSBDYWNoZSBBcmNoaXRlY3R1cmUgTmV1cmFsLVVwbG9hZFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJOZXVyb3RyYWluZXIgSUlcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQ2FzaFJvb3QgU3RhcnRlciBLaXRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQml0V2lyZVwifSx7XCJsZXZlbFwiOjQwLFwibmFtZVwiOlwiTmV1cm9GbHV4IEdvdmVybm9yXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIk5ldXJhbC1SZXRlbnRpb24gRW5oYW5jZW1lbnRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQ3JhbmlhbCBTaWduYWwgUHJvY2Vzc29ycyAtIEdlbiBJXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkNyYW5pYWwgU2lnbmFsIFByb2Nlc3NvcnMgLSBHZW4gSUlcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiRW1iZWRkZWQgTmV0YnVybmVyIE1vZHVsZVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJBcnRpZmljaWFsIFN5bmFwdGljIFBvdGVudGlhdGlvblwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJEYXRhSmFja1wifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJDcmFuaWFsIFNpZ25hbCBQcm9jZXNzb3JzIC0gR2VuIElJSVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJDUlRYNDItQUEgR2VuZSBNb2RpZmljYXRpb25cIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiU3luYXB0aWMgRW5oYW5jZW1lbnQgSW1wbGFudFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJOZXVyb3RyYWluZXIgSVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJFbWJlZGRlZCBOZXRidXJuZXIgTW9kdWxlIENvcmUgSW1wbGFudFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJOZXVyYWxzdGltdWxhdG9yXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkVuaGFuY2VkIE15ZWxpbiBTaGVhdGhpbmdcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQ3JhbmlhbCBTaWduYWwgUHJvY2Vzc29ycyAtIEdlbiBJVlwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJUaGUgQmxhY2sgSGFuZFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJQQ01hdHJpeFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJTcGVlY2ggUHJvY2Vzc29yIEltcGxhbnRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiV2lyZWQgUmVmbGV4ZXNcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiTmV1cm9yZWNlcHRvciBNYW5hZ2VtZW50IEltcGxhbnRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiTmV1cmVnZW4gR2VuZSBNb2RpZmljYXRpb25cIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiTmFub2ZpYmVyIFdlYXZlXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIlNvY2lhbCBOZWdvdGlhdGlvbiBBc3Npc3RhbnQgKFMuTi5BKVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJOdW9wdGltYWwgTm9vdHJvcGljIEluamVjdG9yIEltcGxhbnRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQURSLVYxIFBoZXJvbW9uZSBHZW5lXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIlNwZWVjaCBFbmhhbmNlbWVudFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJOdXRyaUdlbiBJbXBsYW50XCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIklORlJBUkVUIEVuaGFuY2VtZW50XCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkNvbWJhdCBSaWIgSVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJBdWdtZW50ZWQgVGFyZ2V0aW5nIElcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQ29tYmF0IFJpYiBJSVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJEZXJtYUZvcmNlIFBhcnRpY2xlIEJhcnJpZXJcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQXVnbWVudGVkIFRhcmdldGluZyBJSVwifSx7XCJsZXZLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
eyJjdG9yIjoiQml0YnVybmVyU2F2ZU9iamVjdCIsImRhdGEiOnsiUGxheWVyU2F2ZSI6IntcImN0b3JcIjpcIlBsYXllck9iamVjdFwiLFwiZGF0YVwiOntcImhwXCI6e1wiY3VycmVudFwiOjEwLFwibWF4XCI6MTB9LFwic2tpbGxzXCI6e1wiaGFja2luZ1wiOjMzNSxcInN0cmVuZ3RoXCI6MSxcImRlZmVuc2VcIjoxLFwiZGV4dGVyaXR5XCI6MSxcImFnaWxpdHlcIjoxLFwiY2hhcmlzbWFcIjoxLFwiaW50ZWxsaWdlbmNlXCI6MH0sXCJleHBcIjp7XCJoYWNraW5nXCI6MjI3OTc2MC43MjAwNDU3MzMsXCJzdHJlbmd0aFwiOjAsXCJkZWZlbnNlXCI6MCxcImRleHRlcml0eVwiOjAsXCJhZ2lsaXR5XCI6MCxcImNoYXJpc21hXCI6MCxcImludGVsbGlnZW5jZVwiOjB9LFwibXVsdHNcIjp7XCJoYWNraW5nX2NoYW5jZVwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiaGFja2luZ19zcGVlZFwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiaGFja2luZ19tb25leVwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiaGFja2luZ19ncm93XCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJoYWNraW5nXCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJzdHJlbmd0aFwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiZGVmZW5zZVwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiZGV4dGVyaXR5XCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJhZ2lsaXR5XCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJjaGFyaXNtYVwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiaGFja2luZ19leHBcIjoxLjI1MTIwNDc0NDMxNjM5NSxcInN0cmVuZ3RoX2V4cFwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiZGVmZW5zZV9leHBcIjoxLjI1MTIwNDc0NDMxNjM5NSxcImRleHRlcml0eV9leHBcIjoxLjI1MTIwNDc0NDMxNjM5NSxcImFnaWxpdHlfZXhwXCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJjaGFyaXNtYV9leHBcIjoxLjI1MTIwNDc0NDMxNjM5NSxcImNvbXBhbnlfcmVwXCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJmYWN0aW9uX3JlcFwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiY3JpbWVfbW9uZXlcIjoxLjI1MTIwNDc0NDMxNjM5NSxcImNyaW1lX3N1Y2Nlc3NcIjoxLjI1MTIwNDc0NDMxNjM5NSxcImhhY2tuZXRfbm9kZV9tb25leVwiOjEuMjUxMjA0NzQ0MzE2Mzk1LFwiaGFja25ldF9ub2RlX3B1cmNoYXNlX2Nvc3RcIjowLjc5OTIyMjUxMzAwNDczNzIsXCJoYWNrbmV0X25vZGVfcmFtX2Nvc3RcIjowLjc5OTIyMjUxMzAwNDczNzIsXCJoYWNrbmV0X25vZGVfY29yZV9jb3N0XCI6MC43OTkyMjI1MTMwMDQ3MzcyLFwiaGFja25ldF9ub2RlX2xldmVsX2Nvc3RcIjowLjc5OTIyMjUxMzAwNDczNzIsXCJ3b3JrX21vbmV5XCI6MS4yNTEyMDQ3NDQzMTYzOTUsXCJibGFkZWJ1cm5lcl9tYXhfc3RhbWluYVwiOjEsXCJibGFkZWJ1cm5lcl9zdGFtaW5hX2dhaW5cIjoxLFwiYmxhZGVidXJuZXJfYW5hbHlzaXNcIjoxLFwiYmxhZGVidXJuZXJfc3VjY2Vzc19jaGFuY2VcIjoxfSxcImF1Z21lbnRhdGlvbnNcIjpbXSxcInF1ZXVlZEF1Z21lbnRhdGlvbnNcIjpbe1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIENvcmUgRGlyZWN0LU5ldXJhbCBJbnRlcmZhY2VcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIEtlcm5lbCBEaXJlY3QtTmV1cmFsIEludGVyZmFjZVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJIYWNrbmV0IE5vZGUgQ1BVIEFyY2hpdGVjdHVyZSBOZXVyYWwtVXBsb2FkXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkhhY2tuZXQgTm9kZSBDYWNoZSBBcmNoaXRlY3R1cmUgTmV1cmFsLVVwbG9hZFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJIYWNrbmV0IE5vZGUgTklDIEFyY2hpdGVjdHVyZSBOZXVyYWwtVXBsb2FkXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIk5ldXJvRmx1eCBHb3Zlcm5vclwifSx7XCJsZXZlbFwiOjIsXCJuYW1lXCI6XCJOZXVyb0ZsdXggR292ZXJub3JcIn0se1wibGV2ZWxcIjozLFwibmFtZVwiOlwiTmV1cm9GbHV4IEdvdmVybm9yXCJ9LHtcImxldmVsXCI6NCxcIm5hbWVcIjpcIk5ldXJvRmx1eCBHb3Zlcm5vclwifV0sXCJjaXR5XCI6XCJBZXZ1bVwiLFwiYml0Tm9kZU5cIjoxLFwiY29ycG9yYXRpb25cIjpudWxsLFwiZ2FuZ1wiOm51bGwsXCJibGFkZWJ1cm5lclwiOm51bGwsXCJjdXJyZW50U2VydmVyXCI6XCJob21lXCIsXCJmYWN0aW9uc1wiOltcIk5pdGVTZWNcIixcIk5ldGJ1cm5lcnNcIixcIkN5YmVyU2VjXCJdLFwiZmFjdGlvbkludml0YXRpb25zXCI6W1wiQWV2dW1cIl0sXCJoYWNrbmV0Tm9kZXNcIjpbe1wiY3RvclwiOlwiSGFja25ldE5vZGVcIixcImRhdGFcIjp7XCJjb3Jlc1wiOjE2LFwibGV2ZWxcIjoyMDAsXCJtb25leUdhaW5SYXRlUGVyU2Vjb25kXCI6MTE0NzUuMTg1NTk4NDg4OTM1LFwib25saW5lVGltZVNlY29uZHNcIjo4MTI2OS4xOTk5OTkzNzg0MyxcInJhbVwiOjY0LFwidG90YWxNb25leUdlbmVyYXRlZFwiOjI2MDU0ODcxMS43OTU5Nzk3NyxcIm5hbWVcIjpcImhhY2tuZXQtbm9kZS0wXCJ9fSx7XCJjdG9yXCI6XCJIYWNrbmV0Tm9kZVwiLFwiZGF0YVwiOntcImNvcmVzXCI6MTYsXCJsZXZlbFwiOjIwMCxcIm1vbmV5R2FpblJhdGVQZXJTZWNvbmRcIjoxMTQ3NS4xODU1OTg0ODg5MzUsXCJvbmxpbmVUaW1lU2Vjb25kc1wiOjgxMDU4Ljc5OTk5OTM4MTQ5LFwicmFtXCI6NjQsXCJ0b3RhbE1vbmV5R2VuZXJhdGVkXCI6MjU5ODI4NTcwLjQ5MTY2NTk2LFwibmFtZVwiOlwiaGFja25ldC1ub2RlLTFcIn19LHtcImN0b3JcIjpcIkhhY2tuZXROb2RlXCIsXCJkYXRhXCI6e1wiY29yZXNcIjoxNixcImxldmVsXCI6MjAwLFwibW9uZXlHYWluUmF0ZVBlclNlY29uZFwiOjExNDc1LjE4NTU5ODQ4ODkzNSxcIm9ubGluZVRpbWVTZWNvbmRzXCI6ODA0NTEuMTk5OTk5MzkwMzQsXCJyYW1cIjo2NCxcInRvdGFsTW9uZXlHZW5lcmF0ZWRcIjoyNTg0NzAwNzcuMjA2NDM5LFwibmFtZVwiOlwiaGFja25ldC1ub2RlLTJcIn19LHtcImN0b3JcIjpcIkhhY2tuZXROb2RlXCIsXCJkYXRhXCI6e1wiY29yZXNcIjoxNixcImxldmVsXCI6MjAwLFwibW9uZXlHYWluUmF0ZVBlclNlY29uZFwiOjExNDc1LjE4NTU5ODQ4ODkzNSxcIm9ubGluZVRpbWVTZWNvbmRzXCI6ODA0NTAuMTk5OTk5MzkwMzYsXCJyYW1cIjo2NCxcInRvdGFsTW9uZXlHZW5lcmF0ZWRcIjoyNTc1NzQzNjIuMzcwNDI4NjUsXCJuYW1lXCI6XCJoYWNrbmV0LW5vZGUtM1wifX0se1wiY3RvclwiOlwiSGFja25ldE5vZGVcIixcImRhdGFcIjp7XCJjb3Jlc1wiOjE2LFwibGV2ZWxcIjoyMDAsXCJtb25leUdhaW5SYXRlUGVyU2Vjb25kXCI6MTE0NzUuMTg1NTk4NDg4OTM1LFwib25saW5lVGltZVNlY29uZHNcIjo3OTAwMS4zOTk5OTk0MTE0NCxcInJhbVwiOjY0LFwidG90YWxNb25leUdlbmVyYXRlZFwiOjI1NjY1NzE4OS40OTk3NjQ5NSxcIm5hbWVcIjpcImhhY2tuZXQtbm9kZS00XCJ9fSx7XCJjdG9yXCI6XCJIYWNrbmV0Tm9kZVwiLFwiZGF0YVwiOntcImNvcmVzXCI6MTYsXCJsZXZlbFwiOjIwMCxcIm1vbmV5R2FpblJhdGVQZXJTZWNvbmRcIjoxMTQ3NS4xODU1OTg0ODg5MzUsXCJvbmxpbmVUaW1lU2Vjb25kc1wiOjY5OTU0LjU5OTk5OTU0MzA4LFwicmFtXCI6NjQsXCJ0b3RhbE1vbmV5R2VuZXJhdGVkXCI6MjU1MDkxNDc2LjM3NTc0MTcyLFwibmFtZVwiOlwiaGFja25ldC1ub2RlLTVcIn19LHtcImN0b3JcIjpcIkhhY2tuZXROb2RlXCIsXCJkYXRhXCI6e1wiY29yZXNcIjoxNixcImxldmVsXCI6MjAwLFwibW9uZXlHYWluUmF0ZVBlclNlY29uZFwiOjExNDcLine truncated
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
eyJjdG9yIjoiQml0YnVybmVyU2F2ZU9iamVjdCIsImRhdGEiOnsiUGxheWVyU2F2ZSI6IntcImN0b3JcIjpcIlBsYXllck9iamVjdFwiLFwiZGF0YVwiOntcImhwXCI6e1wiY3VycmVudFwiOjEwLFwibWF4XCI6MTB9LFwic2tpbGxzXCI6e1wiaGFja2luZ1wiOjQ1OCxcInN0cmVuZ3RoXCI6MSxcImRlZmVuc2VcIjoxLFwiZGV4dGVyaXR5XCI6MSxcImFnaWxpdHlcIjoxLFwiY2hhcmlzbWFcIjoxLFwiaW50ZWxsaWdlbmNlXCI6MH0sXCJleHBcIjp7XCJoYWNraW5nXCI6NDQzOTEzNS43MTU0ODUzMDQsXCJzdHJlbmd0aFwiOjAsXCJkZWZlbnNlXCI6MCxcImRleHRlcml0eVwiOjAsXCJhZ2lsaXR5XCI6MCxcImNoYXJpc21hXCI6MCxcImludGVsbGlnZW5jZVwiOjB9LFwibXVsdHNcIjp7XCJoYWNraW5nX2NoYW5jZVwiOjEuNDA4NTQ0OTEyMjg5MDE0OCxcImhhY2tpbmdfc3BlZWRcIjoxLjQyMzQ0MzI5MzA0Njk5NzYsXCJoYWNraW5nX21vbmV5XCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiaGFja2luZ19ncm93XCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiaGFja2luZ1wiOjEuNTgyNTAwMjA4OTU2NzA4NCxcInN0cmVuZ3RoXCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiZGVmZW5zZVwiOjEuMzQxNDcxMzQ1MDM3MTU2NyxcImRleHRlcml0eVwiOjEuMzQxNDcxMzQ1MDM3MTU2NyxcImFnaWxpdHlcIjoxLjM0MTQ3MTM0NTAzNzE1NjcsXCJjaGFyaXNtYVwiOjEuMzQxNDcxMzQ1MDM3MTU2NyxcImhhY2tpbmdfZXhwXCI6MS40NzU2MTg0Nzk1NDA4NzI0LFwic3RyZW5ndGhfZXhwXCI6MS40NzU2MTg0Nzk1NDA4NzI0LFwiZGVmZW5zZV9leHBcIjoxLjQ3NTYxODQ3OTU0MDg3MjQsXCJkZXh0ZXJpdHlfZXhwXCI6MS40NzU2MTg0Nzk1NDA4NzI0LFwiYWdpbGl0eV9leHBcIjoxLjQ3NTYxODQ3OTU0MDg3MjQsXCJjaGFyaXNtYV9leHBcIjoxLjQ3NTYxODQ3OTU0MDg3MjQsXCJjb21wYW55X3JlcFwiOjEuMzQxNDcxMzQ1MDM3MTU2NyxcImZhY3Rpb25fcmVwXCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiY3JpbWVfbW9uZXlcIjoxLjM0MTQ3MTM0NTAzNzE1NjcsXCJjcmltZV9zdWNjZXNzXCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiaGFja25ldF9ub2RlX21vbmV5XCI6My4zODMzMTY0OTUxMjIzMDU2LFwiaGFja25ldF9ub2RlX3B1cmNoYXNlX2Nvc3RcIjowLjU3MDI2NDIyMzU3NjM1MjIsXCJoYWNrbmV0X25vZGVfcmFtX2Nvc3RcIjowLjc0NTQ0MzQyOTUxMTU3MTUsXCJoYWNrbmV0X25vZGVfY29yZV9jb3N0XCI6MC43NDU0NDM0Mjk1MTE1NzE1LFwiaGFja25ldF9ub2RlX2xldmVsX2Nvc3RcIjowLjYzMzYyNjkxNTA4NDgzNTcsXCJ3b3JrX21vbmV5XCI6MS4zNDE0NzEzNDUwMzcxNTY3LFwiYmxhZGVidXJuZXJfbWF4X3N0YW1pbmFcIjoxLFwiYmxhZGVidXJuZXJfc3RhbWluYV9nYWluXCI6MSxcImJsYWRlYnVybmVyX2FuYWx5c2lzXCI6MSxcImJsYWRlYnVybmVyX3N1Y2Nlc3NfY2hhbmNlXCI6MX0sXCJhdWdtZW50YXRpb25zXCI6W3tcImxldmVsXCI6MSxcIm5hbWVcIjpcIkhhY2tuZXQgTm9kZSBDb3JlIERpcmVjdC1OZXVyYWwgSW50ZXJmYWNlXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkhhY2tuZXQgTm9kZSBLZXJuZWwgRGlyZWN0LU5ldXJhbCBJbnRlcmZhY2VcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIENQVSBBcmNoaXRlY3R1cmUgTmV1cmFsLVVwbG9hZFwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJIYWNrbmV0IE5vZGUgQ2FjaGUgQXJjaGl0ZWN0dXJlIE5ldXJhbC1VcGxvYWRcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiSGFja25ldCBOb2RlIE5JQyBBcmNoaXRlY3R1cmUgTmV1cmFsLVVwbG9hZFwifSx7XCJsZXZlbFwiOjcsXCJuYW1lXCI6XCJOZXVyb0ZsdXggR292ZXJub3JcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQ3JhbmlhbCBTaWduYWwgUHJvY2Vzc29ycyAtIEdlbiBJXCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIkNyYW5pYWwgU2lnbmFsIFByb2Nlc3NvcnMgLSBHZW4gSUlcIn0se1wibGV2ZWxcIjoxLFwibmFtZVwiOlwiQml0V2lyZVwifSx7XCJsZXZlbFwiOjEsXCJuYW1lXCI6XCJTeW5hcHRpYyBFbmhhbmNlbWVudCBJbXBsYW50XCJ9LHtcImxldmVsXCI6MSxcIm5hbWVcIjpcIk5ldXJvdHJhaW5lciBJXCJ9XSxcInF1ZXVlZEF1Z21lbnRhdGlvbnNcIjpbXSxcImNpdHlcIjpcIkFldnVtXCIsXCJiaXROb2RlTlwiOjEsXCJjb3Jwb3JhdGlvblwiOm51bGwsXCJnYW5nXCI6bnVsbCxcImJsYWRlYnVybmVyXCI6bnVsbCxcImN1cnJlbnRTZXJ2ZXJcIjpcInJ1bjR0aGVoMTExelwiLFwiZmFjdGlvbnNcIjpbXCJOaXRlU2VjXCIsXCJOZXRidXJuZXJzXCIsXCJDeWJlclNlY1wiXSxcImZhY3Rpb25JbnZpdGF0aW9uc1wiOltcIkFldnVtXCIsXCJUaGUgQmxhY2sgSGFuZFwiXSxcImhhY2tuZXROb2Rlc1wiOlt7XCJjdG9yXCI6XCJIYWNrbmV0Tm9kZVwiLFwiZGF0YVwiOntcImNvcmVzXCI6MTYsXCJsZXZlbFwiOjIwMCxcIm1vbmV5R2FpblJhdGVQZXJTZWNvbmRcIjozMTAyOS40NDE3NDExMDMyMyxcIm9ubGluZVRpbWVTZWNvbmRzXCI6NjcwMDQuMzk5OTk5NTg1MjgsXCJyYW1cIjo2NCxcInRvdGFsTW9uZXlHZW5lcmF0ZWRcIjoxNTA4NDc1OTkyLjkxNTYyMTgsXCJuYW1lXCI6XCJoYWNrbmV0LW5vZGUtMFwifX0se1wiY3RvclwiOlwiSGFja25ldE5vZGVcIixcImRhdGFcIjp7XCJjb3Jlc1wiOjE2LFwibGV2ZWxcIjoyMDAsXCJtb25leUdhaW5SYXRlUGVyU2Vjb25kXCI6MzEwMjkuNDQxNzQxMTAzMjMsXCJvbmxpbmVUaW1lU2Vjb25kc1wiOjY3MDAzLjM5OTk5OTU4NTMsXCJyYW1cIjo2NCxcInRvdGFsTW9uZXlHZW5lcmF0ZWRcIjoxNTA1NzI4NDM1LjUxMzA0MzQsXCJuYW1lXCI6XCJoYWNrbmV0LW5vZGUtMVwifX0se1wiY3RvclwiOlwiSGFja25ldE5vZGVcIixcImRhdGFcIjp7XCJjb3Jlc1wiOjE2LFwibGV2ZWxcIjoyMDAsXCJtb25leUdhaW5SYXRlUGVyU2Vjb25kXCI6MzEwMjkuNDQxNzQxMTAzMjMsXCJvbmxpbmVUaW1lU2Vjb25kc1wiOjY2OTk2LjE5OTk5OTU4NTQsXCJyYW1cIjo2NCxcInRvdGFsTW9uZXlHZW5lcmF0ZWRcIjoxNTA1MDAyODUxLjUzNjQzNzUsXCJuYW1lXCI6XCJoYWNrbmV0LW5vZGUtMlwifX0se1wiY3RvclwiOlwiSGFja25ldE5vZGVcIixcImRhdGFcIjp7XCJjb3Jlc1wiOjE2LFwibGV2ZWxcIjoyMDAsXCJtb25leUdhaW5SYXRlUGVyU2Vjb25kXCI6MzEwMjkuNDQxNzQxMTAzMjMsXCJvbmxpbmVUaW1lU2Vjb25kc1wiOjY2OTk1LjE5OTk5OTU4NTQxLFwicmFtXCI6NjQsXCJ0b3RhbE1vbmV5R2VuZXJhdGVkXCI6MTUwNDA5MjQ3OC4zODYxMjc3LFwibmFtZVwiOlwiaGFja25ldC1ub2RlLTNcIn19LHtcImN0b3JcIjpcIkhhY2tuZXROb2RlXCIsXCJkYXRhXCI6e1wiY29yZXNcIjoxNixcImxldmVsXCI6MjAwLFwibW9uZXlHYWluUmF0ZVBlclNlY29uZFwiOjMxMDI5LjQ0MTc0MTEwMzIzLFwib25saW5lVGltZVNlY29uZHNcIjo2Njk5NC4xOTk5OTk1ODU0MyxcInJhbVwiOjY0LFwidG90YWxNb25leUdlbmVyYXRlZFwiOjE1MDMwNDQ5MTUuMzcyMDQxNyxcIm5hbWVcIjpcImhhY2tuZXQtbm9kZS00XCJ9fSx7XCJjdG9yXCI6XCJIYWNrbmV0Tm9kZVwiLFwiZGF0YVwiOntcImNvcmVzXCI6MTYsXCJsZXZlbFwiOjIwMCxcIm1vbmV5R2FpblJhdGVQZXJTZWNvbmRcIjozMTAyOS40NDE3NDExMDMyMyxcIm9ubGluZVRpbWVTZWNvbmRzXCI6NjY4NzUuNTk5OTk5NTg3MTUsXCJyYW1cIjo2NCxcInRvdGFLine truncated
|
||||||
+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
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
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