bitburner-src/src/Terminal/commands/scp.ts

112 lines
3.5 KiB
TypeScript
Raw Normal View History

2021-09-16 01:50:44 +02:00
import { ITerminal } from "../ITerminal";
2021-09-17 08:58:02 +02:00
import { IRouter } from "../../ui/Router";
2021-09-16 01:50:44 +02:00
import { IPlayer } from "../../PersonObjects/IPlayer";
import { BaseServer } from "../../Server/BaseServer";
2021-10-07 22:56:01 +02:00
import { GetServer } from "../../Server/AllServers";
2021-09-24 22:34:21 +02:00
import { isScriptFilename } from "../../Script/isScriptFilename";
2021-09-16 01:50:44 +02:00
export function scp(
terminal: ITerminal,
2021-09-17 08:58:02 +02:00
router: IRouter,
2021-09-16 01:50:44 +02:00
player: IPlayer,
server: BaseServer,
2021-12-03 20:44:32 +01:00
args: (string | number | boolean)[],
2021-09-16 01:50:44 +02:00
): void {
try {
if (args.length !== 2) {
2021-12-16 18:14:48 +01:00
terminal.error("Incorrect usage of scp command. Usage: scp [file] [destination hostname]");
2021-09-16 01:50:44 +02:00
return;
}
const scriptname = terminal.getFilepath(args[0] + "");
if (!scriptname.endsWith(".lit") && !isScriptFilename(scriptname) && !scriptname.endsWith(".txt")) {
terminal.error("scp only works for scripts, text files (.txt), and literature files (.lit)");
return;
}
2021-10-07 22:56:01 +02:00
const destServer = GetServer(args[1] + "");
2021-09-16 01:50:44 +02:00
if (destServer == null) {
terminal.error(`Invalid destination. ${args[1]} not found`);
return;
}
// Scp for lit files
if (scriptname.endsWith(".lit")) {
let found = false;
for (let i = 0; i < server.messages.length; ++i) {
2021-10-14 08:07:05 +02:00
if (server.messages[i] == scriptname) {
2021-09-16 01:50:44 +02:00
found = true;
break;
}
}
if (!found) {
return terminal.error("No such file exists!");
}
for (let i = 0; i < destServer.messages.length; ++i) {
if (destServer.messages[i] === scriptname) {
terminal.print(scriptname + " copied over to " + destServer.hostname);
return; // Already exists
}
}
destServer.messages.push(scriptname);
return terminal.print(scriptname + " copied over to " + destServer.hostname);
}
// Scp for txt files
if (scriptname.endsWith(".txt")) {
let txtFile = null;
for (let i = 0; i < server.textFiles.length; ++i) {
if (server.textFiles[i].fn === scriptname) {
txtFile = server.textFiles[i];
break;
}
}
if (txtFile === null) {
return terminal.error("No such file exists!");
}
const tRes = destServer.writeToTextFile(txtFile.fn, txtFile.text);
if (!tRes.success) {
terminal.error("scp failed");
return;
}
if (tRes.overwritten) {
terminal.print(`WARNING: ${scriptname} already exists on ${destServer.hostname} and will be overwriten`);
terminal.print(`${scriptname} overwritten on ${destServer.hostname}`);
return;
}
terminal.print(`${scriptname} copied over to ${destServer.hostname}`);
return;
}
// Get the current script
let sourceScript = null;
for (let i = 0; i < server.scripts.length; ++i) {
if (scriptname == server.scripts[i].filename) {
sourceScript = server.scripts[i];
break;
}
}
if (sourceScript == null) {
terminal.error("scp failed. No such script exists");
2021-09-16 01:50:44 +02:00
return;
}
2022-01-05 01:09:34 +01:00
const sRes = destServer.writeToScriptFile(player, scriptname, sourceScript.code);
2021-09-16 01:50:44 +02:00
if (!sRes.success) {
terminal.error(`scp failed`);
return;
}
if (sRes.overwritten) {
terminal.print(`WARNING: ${scriptname} already exists on ${destServer.hostname} and will be overwritten`);
terminal.print(`${scriptname} overwritten on ${destServer.hostname}`);
return;
}
terminal.print(`${scriptname} copied over to ${destServer.hostname}`);
} catch (e) {
terminal.error(e + "");
}
}