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"; const sPServScript = "purchaseServers.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); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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") && nMoney >= 5e+6 && !ns.scriptRunning(sPServScript, sThisRunner)) { //Purchased Servers ns.tprint("purchasing servers "); ns.exec("purchaseServers.js", sThisRunner); if (!ns.isRunning(sServerLister)) { ns.run(sServerLister, sThisRunner, 1, false, true); } if (!ns.isRunning(sBackdoorScript)) { ns.run(sBackdoorScript); } //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); } }