299 lines
12 KiB
JavaScript
299 lines
12 KiB
JavaScript
|
|
import { purchaseAndUpgradeServers, listPurchasedServers, getSetting } from "Library.js";
|
|
|
|
|
|
/** @param {NS} ns */
|
|
export async function main(ns) {
|
|
|
|
ns.disableLog("ALL");
|
|
|
|
//host and script info
|
|
const sThisRunner = ns.getHostname();
|
|
const sThisScript = ns.getScriptName();
|
|
const nThisPID = ns.pid;
|
|
|
|
// Custom color coding.
|
|
const cCyan = "\u001b[36m";
|
|
const cGreen = "\u001b[32m";
|
|
const cRed = "\u001b[31m";
|
|
const cReset = "\u001b[0m";
|
|
|
|
//open log for this script
|
|
ns.tail(nThisPID, sThisRunner, ns.args);
|
|
|
|
//scripts
|
|
const sGangScript = "gang/auto-gang2.js";
|
|
const sServerLister = "Serverlist.js";
|
|
const sServerListFile = "serverList.txt";
|
|
const sBestServerFile = "bestTarget.txt";
|
|
const sBackdoorScript = "backdoor.js";
|
|
|
|
//settings
|
|
const nRefreshFrequency = 1000; //time in ms
|
|
|
|
//ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
|
|
await ns.sleep(100);
|
|
let oBestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
|
let sBestTarget;
|
|
while (true) {
|
|
ns.clearLog();
|
|
|
|
//Home Computer
|
|
let nHomeMaxRAM = ns.getServerMaxRam("home");
|
|
let nHomeUsedRAM = ns.getServerUsedRam("home");
|
|
let nHomeFreeRAM = nHomeMaxRAM - nHomeUsedRAM;
|
|
ns.print("Home Free RAM = " + cCyan + Math.floor(nHomeFreeRAM).toLocaleString() + cReset + " / " + cCyan + nHomeMaxRAM.toLocaleString() + cReset + " GB");
|
|
let oHome = ns.getServer("home");
|
|
let nCores = oHome.cpuCores;
|
|
ns.print("Home Cores = " + cCyan + Math.floor(nCores).toLocaleString() + cReset);
|
|
|
|
|
|
//Gang
|
|
ns.print("Karma = " + cCyan + Math.round(ns.heart.break()).toLocaleString() + cReset);
|
|
if (ns.gang.inGang()) {
|
|
ns.print("Gang found... running " + sGangScript);
|
|
if (!ns.getRunningScript(sGangScript)) {
|
|
ns.exec(sGangScript, sThisRunner, 1);
|
|
}
|
|
}
|
|
else {
|
|
ns.print("Gang: " + cRed + "none" + cReset);
|
|
}
|
|
|
|
//Best Target
|
|
|
|
oBestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
|
sBestTarget = oBestTarget.serverName;
|
|
ns.print("Best Target: " + cCyan + sBestTarget + cReset);
|
|
ns.print("Target Weakness: " + cCyan + Math.floor((ns.getServerMinSecurityLevel(sBestTarget) / ns.getServerSecurityLevel(sBestTarget)) * 100) + "%" + cReset);
|
|
ns.print("Target Money: " + cCyan + Math.floor((ns.getServerMoneyAvailable(sBestTarget) / ns.getServerMaxMoney(sBestTarget)) * 100) + "%" + cReset);
|
|
|
|
let nPServs = listPurchasedServers(ns).length;
|
|
let aPserv;
|
|
|
|
const oEXE = {
|
|
ssh: { name: "BruteSSH.exe", nHackingLevel: 50, cost: 500000 },
|
|
ftp: { name: "FTPCrack.exe", nHackingLevel: 100, cost: 1500000 },
|
|
smtp: { name: "relaySMTP.exe", nHackingLevel: 250, cost: 5000000 },
|
|
http: { name: "HTTPWorm.exe", nHackingLevel: 500, cost: 30000000 },
|
|
sql: { name: "SQLInject.exe", nHackingLevel: 750, cost: 250000000 },
|
|
ds1: { name: "DeepscanV1.exe", nHackingLevel: 75, cost: 500000 },
|
|
ds2: { name: "DeepscanV2.exe", nHackingLevel: 400, cost: 25000000 },
|
|
sp: { name: "ServerProfiler.exe", nHackingLevel: 75, cost: 500000 },
|
|
al: { name: "AutoLink.exe", nHackingLevel: 25, cost: 1000000 },
|
|
form: { name: "Formulas.exe", nHackingLevel: 25, cost: 1000000000 }
|
|
};
|
|
|
|
let bBusy = ns.singularity.isBusy();
|
|
let bBruteSSH = ns.fileExists(oEXE.ssh.name, "home");
|
|
let bFTPCrack = ns.fileExists(oEXE.ftp.name, "home");
|
|
let bRelaySMTP = ns.fileExists(oEXE.smtp.name, "home");
|
|
let bHttpWorm = ns.fileExists(oEXE.http.name, "home");
|
|
let bSqlInject = ns.fileExists(oEXE.sql.name, "home");
|
|
|
|
let bDeepscanV1 = ns.fileExists(oEXE.ds1.name, "home");
|
|
let bDeepscanV2 = ns.fileExists(oEXE.ds2.name, "home");
|
|
let bServerProfiler = ns.fileExists(oEXE.sp.name, "home");
|
|
let bAutoLink = ns.fileExists(oEXE.al.name, "home");
|
|
let bFormulas = ns.fileExists(oEXE.form.name, "home");
|
|
|
|
let nHackingLevel = ns.getHackingLevel();
|
|
let nMoney = ns.getPlayer().money;
|
|
|
|
//Home Upgrades
|
|
if (nMoney > ns.singularity.getUpgradeHomeRamCost()) {
|
|
let nHomeRAMUpgradeCost = ns.singularity.getUpgradeHomeRamCost();
|
|
ns.singularity.upgradeHomeRam();
|
|
ns.tprint(cCyan + "Upgraded home RAM to " + (nHomeMaxRAM*2) + " for " + nHomeRAMUpgradeCost + cReset);
|
|
}
|
|
else if (nCores < 8 && nMoney > ns.singularity.getUpgradeHomeCoresCost()) {
|
|
ns.singularity.upgradeHomeCores();
|
|
ns.tprint(cCyan + "Upgraded home Cores" + cReset);
|
|
}
|
|
|
|
|
|
ns.print("Number of pservers = " + cCyan + nPServs + cReset);
|
|
|
|
let sLowestPserv;
|
|
aPserv = listPurchasedServers(ns);
|
|
let nLowestRAM = 2 ** 21;
|
|
let nCurrentRAM = 0;
|
|
for (let i = 0; i < aPserv.length; i++) {
|
|
nCurrentRAM = ns.getServerMaxRam(aPserv[i]);
|
|
if (nCurrentRAM < nLowestRAM) {
|
|
nLowestRAM = nCurrentRAM
|
|
sLowestPserv = aPserv[i];
|
|
}
|
|
}
|
|
if (nLowestRAM < 2 ** 21) {
|
|
ns.print("Smallest psserv = " + cCyan + sLowestPserv + " " + nLowestRAM.toLocaleString() + " GB" + cReset);
|
|
}
|
|
else {
|
|
ns.print("Smallest psserv = " + cRed + "none" + cReset);
|
|
}
|
|
|
|
|
|
|
|
|
|
//TOR
|
|
let bHasTOR = ns.hasTorRouter();
|
|
if (bHasTOR === false && nMoney >= 2e+5) {
|
|
ns.singularity.purchaseTor();
|
|
ns.tprint(cCyan + "Purchased TOR" + cReset);
|
|
ns.toast("Purchased " + "TOR Router", "info", 10000);
|
|
}
|
|
await ns.sleep(1);
|
|
if (bBruteSSH === false && bHasTOR && nMoney >= oEXE.ssh.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.ssh.name);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.ssh.name + cReset);
|
|
ns.toast("Purchased " + oEXE.ssh.name, "info", 10000);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
ns.exec(sBackdoorScript, sThisRunner, 1);
|
|
}
|
|
else if (bAutoLink === false && bHasTOR && nMoney >= oEXE.al.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.al.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.al.name + cReset);
|
|
ns.toast("Purchased " + oEXE.al.name, "info", 10000);
|
|
}
|
|
else if (bFTPCrack === false && bHasTOR && nMoney >= oEXE.ftp.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.ftp.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.ftp.name + cReset);
|
|
ns.toast("Purchased " + oEXE.ftp.name, "info", 10000);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
ns.exec(sBackdoorScript, sThisRunner, 1);
|
|
}
|
|
else if (bDeepscanV1 === false && bHasTOR && nMoney >= oEXE.ds1.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.ds1.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.ds1.name + cReset);
|
|
ns.toast("Purchased " + oEXE.ds1.name, "info", 10000);
|
|
}
|
|
else if (bRelaySMTP === false && bHasTOR && nMoney >= oEXE.smtp.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.smtp.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.smtp.name + cReset);
|
|
ns.toast("Purchased " + oEXE.smtp.name, "info", 10000);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
ns.exec(sBackdoorScript, sThisRunner, 1);
|
|
}
|
|
else if (bHttpWorm === false && bHasTOR && nMoney >= oEXE.http.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.http.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.http.name + cReset);
|
|
ns.toast("Purchased " + oEXE.http.name, "info", 10000);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
ns.exec(sBackdoorScript, sThisRunner, 1);
|
|
}
|
|
else if (bSqlInject === false && bHasTOR && nMoney >= oEXE.sql.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.sql.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.sql.name + cReset);
|
|
ns.toast("Purchased " + oEXE.sql.name, "info", 10000);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
ns.exec(sBackdoorScript, sThisRunner, 1);
|
|
}
|
|
else if (bDeepscanV2 === false && bHasTOR && nMoney >= oEXE.ds2.cost) {
|
|
ns.singularity.purchaseProgram(oEXE.ds2.name, false);
|
|
ns.tprint(cCyan + "Purchased " + oEXE.ds2.name + cReset);
|
|
ns.toast("Purchased " + oEXE.ds2.name, "info", 10000);
|
|
}
|
|
else if (getSetting(ns, "autoPurchaseServers") && nPServs < 25 && nMoney >= 5e+6) { //Purchased Servers
|
|
ns.tprint("purchasing servers ");
|
|
//await purchaseServers(ns);
|
|
await purchaseAndUpgradeServers(ns);
|
|
ns.exec(sServerLister, sThisRunner, 1, false, true);
|
|
}
|
|
/*else if (getSetting(ns, "autoUpgrades") && nLowestRAM < (2 ** 20) && !ns.scriptRunning("upgrade.js", sThisRunner) && nPServs >= 25 && nMoney >= 1e+6) {
|
|
ns.tprint("upgrading servers ");
|
|
ns.exec("upgrade.js", sThisRunner, 1);
|
|
|
|
}*/
|
|
|
|
//ns.tprint("autoPurchaseServers = " + getSetting(ns, "autoPurchaseServers"));
|
|
//ns.tprint("autoUpgrades = " + getSetting(ns, "autoUpgrades"));
|
|
|
|
|
|
//work on something
|
|
if (bBusy === false) {
|
|
if (bHasTOR === false) {
|
|
if (bBruteSSH === false && nHackingLevel >= 50) {
|
|
ns.singularity.createProgram("BruteSSH.exe", false);
|
|
}
|
|
else if (bFTPCrack === false && nHackingLevel >= 100) {
|
|
ns.singularity.createProgram("FTPCrack.exe", false);
|
|
}
|
|
else if (bRelaySMTP === false && nHackingLevel >= 250) {
|
|
ns.singularity.createProgram("relaySMTP.exe", false);
|
|
}
|
|
else if (bDeepscanV1 === false && nHackingLevel >= 75) {
|
|
ns.singularity.createProgram("DeepscanV1.exe", false);
|
|
}
|
|
}
|
|
if (nHackingLevel < 500) {
|
|
ns.singularity.universityCourse("rothman university", "study computer science", false);
|
|
}
|
|
}
|
|
|
|
let nSharePower = Math.floor(ns.getSharePower() * 10000) / 100;
|
|
ns.print("Faction Reputation = " + cCyan + nSharePower + " %" + cReset);
|
|
|
|
|
|
if (bBusy) {
|
|
let oCurrentWork = ns.singularity.getCurrentWork();
|
|
//ns.print("oCurrentWork = " + JSON.stringify(oCurrentWork));
|
|
let bCanResume = false;
|
|
let nWorkCycles;
|
|
switch (oCurrentWork.type) {
|
|
case "CLASS": //Task = StudyTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Working at: " + cCyan + oCurrentWork.location + cReset);
|
|
ns.print("Working with: " + cCyan + oCurrentWork.classType + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = true;
|
|
break;
|
|
case "CREATE_PROGRAM": //Task = CreateProgramWorkTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Creating Program: " + cCyan + oCurrentWork.programName + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = true;
|
|
break;
|
|
case "FACTION": //Task = FactionWorkTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Working at: " + cCyan + oCurrentWork.factionName + cReset);
|
|
ns.print("Working with: " + cCyan + oCurrentWork.factionWorkType + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = true;
|
|
break;
|
|
case "CRIME": //Task = CrimeTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Comitting crime: " + cCyan + oCurrentWork.crimeType + cReset);
|
|
ns.print("Crime Chance: " + cCyan + Math.floor(10000 * ns.singularity.getCrimeChance(oCurrentWork.crimeType)) / 100 + "%" + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = true;
|
|
break;
|
|
case "COMPANY": //Task = CompanyWorkTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Working at: " + cCyan + oCurrentWork.companyName + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = true;
|
|
break;
|
|
case "GRAFTING": //Task = GraftingTask
|
|
nWorkCycles = oCurrentWork.cyclesWorked;
|
|
ns.print("Grafting: " + cCyan + oCurrentWork.augmentation + cReset);
|
|
ns.print("Task Cycle: " + cCyan + nWorkCycles.toLocaleString() + cReset)
|
|
bCanResume = false;
|
|
break;
|
|
|
|
}
|
|
/*
|
|
if (bBusy && bCanResume === true && nWorkCycles >= 100) {
|
|
ns.singularity.stopAction();
|
|
|
|
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
|
|
await ns.sleep(nRefreshFrequency);
|
|
}
|
|
} |