ouija_bh

Bedtime reading for anarchists

Dec 22nd, 2023
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.22 KB | Gaming | 0 0
  1. Below is a scheme for client and service to obtain server values. The service polls values and
  2. writes them to ports where clients read them. It could be modified to suit your needs. It could
  3. be something to help you fall asleep. :::<name>::: marks the start of a script.
  4.  
  5.  
  6. :::po-methods.js:::
  7.  
  8. /** Port size must be the same as in Options->System */
  9. export const portSize = 50;
  10.  
  11. /** Methods in the form []["method", intervalMin, intervalStart, intervalMax, valuePort, noticePort].
  12. * "method" is the name of an NS.get method taking one argument, "server", and returning (string | number).
  13. * Note: getHackTime is used by the service, so if not wanted, the service will need to be modified.
  14. * intervalMin and intervalMax are used as multipliers of hack time. (0, 1).
  15. * intervalStart is the starting interval between intervalMin and intervalMax. (0, 1).
  16. * valuePort is where service will write value. noticePort is where client will write notice.
  17. * [1 .. 20]. Unique across indexes.
  18. */
  19. export const methods = [["getServerMoneyAvailable", 1/250, 1/2, 3/2 * 1/250, 1, 2],
  20. ["getServerSecurityLevel", 3/2 * 1/250, 1/2, 5/2 * 1/250, 3, 4],
  21. ["getHackTime", 2 * 1/250, 1/2, 3 * 1/250, 5, 6] // only remove this method if you know what you are doing
  22. ];
  23.  
  24. /** getValue()
  25. * @param {NS} ns NS2 namespace
  26. * @param {number} indexM index of method
  27. * @param {number} numClients number of clients (threads)
  28. * @returns {string | number} value
  29. */
  30. function getValue(ns, indexM, numClients) {
  31. if (Math.random() < portSize / numClients) {
  32. ns.tryWritePort(methods[indexM][5], 0); // write notice
  33. }
  34. return ns.peek(methods[indexM][4]);
  35. }
  36.  
  37. /** getMoneyAvail()
  38. * @param {NS} ns NS2 namespace
  39. * @param {number} numClients number of clients (threads)
  40. * @returns {number} money available
  41. */
  42. export function getMoneyAvail(ns, numClients) {
  43. return getValue(ns, 0, numClients);
  44. }
  45.  
  46. /** getSecLevel()
  47. * @param {NS} ns NS2 namespace
  48. * @param {number} numClients number of clients (threads)
  49. * @returns {number} security level
  50. */
  51. export function getSecLevel(ns, numClients) {
  52. return getValue(ns, 1, numClients);
  53. }
  54.  
  55. /** getTimeHack()
  56. * @param {NS} ns NS2 namespace
  57. * @param {number} numClients number of clients (threads)
  58. * @returns {number} hack time (ms)
  59. */
  60. export function getTimeHack(ns, numClients) {
  61. return getValue(ns, 2, numClients);
  62. }
  63. /** @version 0.47.0 */
  64.  
  65.  
  66. :::po-service.js:::
  67.  
  68. import { portSize, methods } from "po-methods.js";
  69.  
  70. /** getWhenUpdate()
  71. * @param {number} intervalMin minimum interval (0, 1)
  72. * @param {number} interval interval (0, 1)
  73. * @param {number} intervalMax maximum interval (0, 1)
  74. * @param {number} lastUpdate time of last update (ms)
  75. * @param {number} timeHack hack time (ms)
  76. * @returns {number} when to update value (ms)
  77. */
  78. function getWhenUpdate(intervalMin, interval, intervalMax, lastUpdate, timeHack) {
  79. var delta = intervalMax - intervalMin;
  80. return lastUpdate + (intervalMin + delta * interval) * timeHack;
  81. }
  82.  
  83. /** @param {NS} ns NS2 namespace */
  84. export async function main(ns) {
  85. // Takes one argument: the server to get values for
  86. if (ns.args.length < 1) { ns.exit(); }
  87. var server = ns.args[0];
  88. // methodRefs should correspond to methods[][0]
  89. const methodRefs = [ns.getServerMoneyAvailable, ns.getServerSecurityLevel, ns.getHackTime];
  90.  
  91. ns.disableLog("ALL");
  92. // check methods
  93. if (methods.length != methodRefs.length) {
  94. ns.tprint("Method/ref count mismatch. Exiting.");
  95. ns.exit();
  96. }
  97. // swap intervalMin and intervalMax if needed
  98. for (var i = 0; i < methods.length; i++) {
  99. if (methods[i][1] > methods[i][3]) {
  100. var intervalMax = methods[i][1];
  101. methods[i][1] = methods[i][3];
  102. methods[i][3] = intervalMax;
  103. }
  104. }
  105. var values = []; // array with methods.length values (string | number)
  106. var lastUpdate = []; // array with methods.length times (ms)
  107. var whenUpdate = []; // array with methods.length times (ms)
  108. var intervals = []; // array with methods.length intervals (0, 1)
  109. var indexTH = -1; // index of getHackTime method
  110. // initialize method values
  111. for (var i = 0; i < methods.length; i++) {
  112. if (methods[i][0] == 'getHackTime') { indexTH = i; }
  113. values[i] = methodRefs[i](server);
  114. lastUpdate[i] = Date.now();
  115. ns.writePort(methods[i][4], values[i]);
  116. intervals[i] = methods[i][2];
  117. whenUpdate[i] = getWhenUpdate(methods[i][1], intervals[i], methods[i][3], lastUpdate[i], values[indexTH]);
  118. }
  119. if (indexTH == -1) {
  120. ns.tprint("getHackTime method not found. Exiting.");
  121. ns.exit();
  122. }
  123. // Loop interval is (shortest intervalMin) / 2
  124. var intervalL = methods[0][1];
  125. for (var i = 1; i < methods.length; i++) {
  126. if (methods[i][1] < intervalL) { intervalL = methods[i][1]; }
  127. }
  128. intervalL /= 2;
  129. var cntLoop = 0, cost = 0;
  130. for (var i = 0; i < methods.length; i++) {
  131. cost += ns.getFunctionRamCost(methods[i][0]);
  132. }
  133. ns.tprint("Polling " + methods.length + " methods with " + ns.formatRam(cost) + " RAM cost.");
  134.  
  135. while (true) {
  136. await ns.sleep(values[indexTH] * intervalL);
  137.  
  138. if (cntLoop % 2 == 1) {
  139. // read up to (portSize / 4) notices for each method
  140. for (var i = 0; i < methods.length; i++) {
  141. var notice, cntNotice = 0;
  142. do {
  143. notice = ns.readPort(methods[i][5]);
  144. if (notice != "NULL PORT DATA") { cntNotice++; }
  145. } while ((notice != "NULL PORT DATA") && (cntNotice < portSize / 4));
  146. // adjust method interval
  147. if (cntNotice == 0) {
  148. intervals[i] += (1 - intervals[i]) / 4;
  149. } else {
  150. for (var j = 0; j < cntNotice; j++) {
  151. intervals[i] -= intervals[i] / 2;
  152. }
  153. }
  154. whenUpdate[i] = getWhenUpdate(methods[i][1], intervals[i], methods[i][3], lastUpdate[i], values[indexTH]);
  155. //if (cntNotice > 2) { ns.tprint("debug: cntNotice=" + cntNotice); }
  156. }
  157. }
  158. if (cntLoop < Number.MAX_SAFE_INTEGER) {
  159. cntLoop++;
  160. } else {
  161. cntLoop = 0;
  162. }
  163.  
  164. // update method values as needed
  165. var bTHChanged = false;
  166. for (var i = 0; i < methods.length; i++) {
  167. var curTime = Date.now();
  168. if (curTime >= whenUpdate[i]) {
  169. var valuePrev = values[i];
  170. values[i] = methodRefs[i](server);
  171. lastUpdate[i] = curTime;
  172. if (values[i] != valuePrev) {
  173. // value changed, so write new value then read old value
  174. ns.writePort(methods[i][4], values[i]);
  175. ns.readPort(methods[i][4]);
  176. if (i == indexTH) { bTHChanged = true; }
  177. }
  178. }
  179. }
  180. if (bTHChanged) {
  181. // hack time changed, so recalculate whenUpdate for all methods
  182. for (var i = 0; i < methods.length; i++) {
  183. whenUpdate[i] = getWhenUpdate(methods[i][1], intervals[i], methods[i][3], lastUpdate[i], values[indexTH]);
  184. }
  185. }
  186. }
  187. }
  188. /** @version 0.47.0 */
  189.  
  190.  
  191. :::po-example-client.js:::
  192.  
  193. import { getMoneyAvail, getSecLevel, getTimeHack } from "po-methods.js";
  194. // This is a minimal client demonstrating method calls. Your client should not be a monitor.
  195.  
  196. /** @param {NS} ns NS2 namespace */
  197. export async function main(ns) {
  198. if (ns.args.length < 1) { ns.exit(); }
  199. var server = ns.args[0]; // server being polled by service
  200. ns.disableLog("ALL");
  201.  
  202. while (true) {
  203. var timeHack = getTimeHack(ns, 1);
  204. ns.tprint(server + ": moneyAvail=$" + Math.round(getMoneyAvail(ns, 1))
  205. + " secLevel=" + ns.formatNumber(getSecLevel(ns, 1))
  206. + " timeHack=" + ns.formatNumber(timeHack / 1000) + "s");
  207. await ns.sleep(timeHack / 25);
  208. }
  209. }
  210. /** @version 0.47.0 */
  211.  
  212.  
  213. :::po-example.js:::
  214.  
  215. // This runs the service and monitor client. Your client should have more than one thread.
  216.  
  217. /** @param {NS} ns NS2 namespace */
  218. export async function main(ns) {
  219. if (ns.args.length < 1) {
  220. ns.tprint("Usage: " + ns.getScriptName() + " <server>");
  221. ns.exit();
  222. }
  223. var server = ns.args[0]; // server to poll values for
  224.  
  225. // run service
  226. ns.run("po-service.js", 1, server);
  227. await ns.sleep(50); // wait for service to come up
  228.  
  229. // run client
  230. ns.run("po-example-client.js", 1, server);
  231. }
  232. /** @version 0.47.0 */
Tags: Bitburner
Advertisement
Add Comment
Please, Sign In to add comment