import {
array_make_servers,
clamp,
object_get_updated,
clone,
any_while,
} from "nicoty.lib.no.netscript.js";
import {
float_get_server_ram_free,
float_get_server_ram_total,
float_get_server_ram_used,
float_get_network_ram_trait,
array_get_servers_useable,
object_get_server_ram_free_biggest,
} from "nicoty.lib.ram.server.js";
export const object_get_server_used = ({ object_netscript: n, string_server: s }) => ({
string_server: s,
float_ram_used: float_get_server_ram_used({ object_netscript: n, string_server: s }),
});
export const boolean_can_run_job = ({
object_netscript: n,
float_ram_free: f,
string_script: s,
integer_threads: t,
}) => f >= n.getScriptRam(s) * t;
const integer_get_threads_max = ({
object_netscript: n,
object_server_used: u,
string_script: s,
}) => Math.floor(float_get_server_ram_free({
object_netscript: n,
string_server: u.string_server,
float_server_ram_used: u.float_ram_used,
}) / n.getScriptRam(s));
const object_get_server_used_job_applied = ({
object_netscript: n,
object_job: j,
object_server_used: s,
}) =>
object_get_updated({
object_original: s,
object_properties_new: {
float_ram_used:
s.float_ram_used + j.integer_threads * n.getScriptRam(j.string_script),
},
});
export const array_get_servers_used_updated = ({
object_netscript: n,
array_servers_used: a,
object_job: j,
}) =>
a.map((s) =>
s.string_server === j.string_server_used
? object_get_server_used_job_applied({
object_netscript: n,
object_job: j,
object_server_used: s,
})
: clone(s)
);
const boolean_conditions_array_get_schedule_script = ({
object_netscript: n,
array_servers_used: u,
integer_threads: t,
string_script: c,
}) => {
const object_server_ram_free_biggest = object_get_server_ram_free_biggest({
object_netscript: n,
array_servers_used: u,
});
return t > 0 &&
boolean_can_run_job({
object_netscript: n,
float_ram_free: float_get_server_ram_free({
object_netscript: n,
string_server: object_server_ram_free_biggest.string_server,
float_server_ram_used: object_server_ram_free_biggest.float_ram_used,
}),
string_script: c,
integer_threads: 1,
});
};
const object_get_schedule_script_updated = ({
object_netscript: n,
object_script: s,
any_output: o,
}) => {
const
object_server_ram_free_biggest = object_get_server_ram_free_biggest({
object_netscript: n,
array_servers_used: o.array_servers_used,
}),
object_job = {
string_script: s.string_script,
string_server_used: object_server_ram_free_biggest.string_server,
integer_threads: clamp({
value: o.integer_threads,
lower: 1,
upper: integer_get_threads_max({
object_netscript: n,
object_server_used: object_server_ram_free_biggest,
string_script: s.string_script,
}),
}),
array_arguments: s.array_arguments,
};
return {
object_netscript: n,
object_script: s,
any_output: {
integer_threads: o.integer_threads - object_job.integer_threads,
array_schedule: o.array_schedule.concat(object_job),
array_servers_used: array_get_servers_used_updated({
object_netscript: n,
array_servers_used: o.array_servers_used,
object_job: object_job,
}),
},
};
};
export const array_get_schedule_script = ({
object_netscript: n,
array_scripts: s,
}) =>
s.reduce(
(object_state, object_script) => {
const object_server_used_ram_free_biggest = object_get_server_ram_free_biggest({
object_netscript: n,
array_servers_used: object_state.array_servers_used,
});
if (
boolean_can_run_job({
object_netscript: n,
float_ram_free: float_get_server_ram_free({
object_netscript: n,
string_server: object_server_used_ram_free_biggest.string_server,
float_server_ram_used: object_server_used_ram_free_biggest.float_ram_used,
}),
string_script: object_script.string_script,
integer_threads: 1,
})
) {
const object_schedule_script_updated = any_while({
any_state: {
object_netscript: n,
object_script: object_script,
any_output: {
integer_threads:
object_script.float_threads_or_fraction_botnet >= 1
? object_script.float_threads_or_fraction_botnet
: Math.floor(
(float_get_network_ram_trait({
object_netscript: n,
float_get_ram_trait: float_get_server_ram_total,
}) *
object_script.float_threads_or_fraction_botnet) /
n.getScriptRam(object_script.string_script)
),
array_schedule: object_state.array_schedule,
array_servers_used: object_state.array_servers_used,
},
},
boolean_condition: (object_state) =>
boolean_conditions_array_get_schedule_script({
object_netscript: object_state.object_netscript,
array_servers_used: object_state.any_output.array_servers_used,
integer_threads: object_state.any_output.integer_threads,
string_script: object_state.object_script.string_script,
}),
any_function: object_get_schedule_script_updated,
}).any_output;
return (
object_schedule_script_updated.integer_threads > 0 &&
n.print(
`WARNING: Failed to run the remaining ${object_schedule_script_updated.integer_threads} threads of "${object_script.string_script}". Skipped.`
),
{
array_schedule: object_schedule_script_updated.array_schedule,
array_servers_used: object_schedule_script_updated.array_servers_used,
}
);
}
return (
n.print(
`WARNING: Unable to find a server to run "${object_script.string_script}". Skipped.`
),
object_state
);
},
{
array_schedule: [],
array_servers_used: array_make_servers({
object_netscript: n,
array_method_get_servers: array_get_servers_useable,
object_method_make_server: object_get_server_used
}),
}
).array_schedule;
export const boolean_copy_script_to = ({
object_netscript: n,
scripts: s,
string_server_destination: d,
}) => n.scp(s, n.getHostname(), d);
export const integer_exec = ({
object_netscript: n,
string_script: c,
string_server: e,
integer_threads: t = 1,
array_arguments: a,
}) => (void 0 === a ? n.exec(c, e, t) : n.exec(c, e, t, ...a));
export const void_schedule_script_runner = ({
object_netscript: n,
array_schedule: s,
}) => {
s.forEach((object_job, integer_index) => {
boolean_copy_script_to({
object_netscript: n,
scripts: object_job.string_script,
string_server_destination: object_job.string_server_used,
}),
integer_exec({
object_netscript: n,
string_script: object_job.string_script,
string_server: object_job.string_server_used,
integer_threads: object_job.integer_threads,
array_arguments: object_job.array_arguments.concat(integer_index),
});
});
};
export const boolean_can_server_run_script_threads = ({
object_netscript: n,
float_server_used_ram_free: f,
integer_threads: t,
string_script: c,
}) => f >= t * n.getScriptRam(c);
export const integer_get_threads_nop = ({
object_netscript: n,
string_script_first: a,
string_script_second: b,
string_nop: _,
}) =>
Math.ceil(
(n.getScriptRam(a) - n.getScriptRam(b)) /
n.getScriptRam(
_
)
);