2022-07-30 16:19:22 +02:00
|
|
|
import { isScriptFilename } from "../Script/isScriptFilename";
|
|
|
|
import { GetServer } from "../Server/AllServers";
|
|
|
|
import { isValidFilePath } from "../Terminal/DirectoryHelpers";
|
|
|
|
import { TextFile } from "../TextFile";
|
2022-08-10 23:22:03 +02:00
|
|
|
import {
|
|
|
|
RFAMessage,
|
|
|
|
FileData,
|
|
|
|
FileContent,
|
|
|
|
isFileServer,
|
|
|
|
isFileLocation,
|
|
|
|
FileLocation,
|
|
|
|
isFileData,
|
|
|
|
} from "./MessageDefinitions";
|
2022-08-23 23:50:31 +02:00
|
|
|
|
2022-07-30 16:19:22 +02:00
|
|
|
import libSource from "!!raw-loader!../ScriptEditor/NetscriptDefinitions.d.ts";
|
|
|
|
|
|
|
|
function error(errorMsg: string, { id }: RFAMessage): RFAMessage {
|
2022-08-10 23:22:03 +02:00
|
|
|
return new RFAMessage({ error: errorMsg, id: id });
|
2022-07-30 16:19:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export const RFARequestHandler: Record<string, (message: RFAMessage) => void | RFAMessage> = {
|
2022-08-10 23:22:03 +02:00
|
|
|
pushFile: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileData(msg.params)) return error("Misses parameters", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const fileData: FileData = msg.params;
|
|
|
|
if (!isValidFilePath(fileData.filename)) return error("Invalid filename", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(fileData.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-29 08:41:17 +02:00
|
|
|
if (isScriptFilename(fileData.filename)) server.writeToScriptFile(fileData.filename, fileData.content);
|
2022-08-10 23:22:03 +02:00
|
|
|
// Assume it's a text file
|
|
|
|
else server.writeToTextFile(fileData.filename, fileData.content);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
// If and only if the content is actually changed correctly, send back an OK.
|
|
|
|
const savedCorrectly =
|
|
|
|
server.getScript(fileData.filename)?.code === fileData.content ||
|
|
|
|
server.textFiles.filter((t: TextFile) => t.filename == fileData.filename).at(0)?.text === fileData.content;
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
if (!savedCorrectly) return error("File wasn't saved correctly", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
return new RFAMessage({ result: "OK", id: msg.id });
|
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
getFile: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileLocation(msg.params)) return error("Message misses parameters", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const fileData: FileLocation = msg.params;
|
|
|
|
if (!isValidFilePath(fileData.filename)) return error("Invalid filename", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(fileData.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
if (isScriptFilename(fileData.filename)) {
|
|
|
|
const scriptContent = server.getScript(fileData.filename);
|
|
|
|
if (!scriptContent) return error("File doesn't exist", msg);
|
|
|
|
return new RFAMessage({ result: scriptContent.code, id: msg.id });
|
|
|
|
} else {
|
|
|
|
// Assume it's a text file
|
|
|
|
const file = server.textFiles.filter((t: TextFile) => t.filename == fileData.filename).at(0);
|
|
|
|
if (!file) return error("File doesn't exist", msg);
|
|
|
|
return new RFAMessage({ result: file.text, id: msg.id });
|
|
|
|
}
|
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
deleteFile: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileLocation(msg.params)) return error("Message misses parameters", msg);
|
|
|
|
const fileData: FileLocation = msg.params;
|
|
|
|
if (!isValidFilePath(fileData.filename)) return error("Invalid filename", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(fileData.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const fileExists = (): boolean =>
|
|
|
|
!!server.getScript(fileData.filename) || server.textFiles.some((t: TextFile) => t.filename === fileData.filename);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
if (!fileExists()) return error("File doesn't exist", msg);
|
|
|
|
server.removeFile(fileData.filename);
|
|
|
|
if (fileExists()) return error("Failed to delete the file", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
return new RFAMessage({ result: "OK", id: msg.id });
|
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
getFileNames: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileServer(msg.params)) return error("Message misses parameters", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(msg.params.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2023-04-18 09:19:45 +02:00
|
|
|
const fileNameList: string[] = [...server.textFiles.map((txt): string => txt.filename), ...server.scripts.keys()];
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-25 23:34:29 +02:00
|
|
|
return new RFAMessage({ result: fileNameList, id: msg.id });
|
2022-08-10 23:22:03 +02:00
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
getAllFiles: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileServer(msg.params)) return error("Message misses parameters", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(msg.params.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const fileList: FileContent[] = [
|
|
|
|
...server.textFiles.map((txt): FileContent => {
|
|
|
|
return { filename: txt.filename, content: txt.text };
|
|
|
|
}),
|
|
|
|
];
|
2023-04-18 09:19:45 +02:00
|
|
|
for (const [filename, script] of server.scripts) fileList.push({ filename, content: script.code });
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-25 23:34:29 +02:00
|
|
|
return new RFAMessage({ result: fileList, id: msg.id });
|
2022-08-10 23:22:03 +02:00
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
calculateRam: function (msg: RFAMessage): RFAMessage {
|
|
|
|
if (!isFileLocation(msg.params)) return error("Message misses parameters", msg);
|
|
|
|
const fileData: FileLocation = msg.params;
|
|
|
|
if (!isValidFilePath(fileData.filename)) return error("Invalid filename", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
const server = GetServer(fileData.server);
|
|
|
|
if (!server) return error("Server hostname invalid", msg);
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
if (!isScriptFilename(fileData.filename)) return error("Filename isn't a script filename", msg);
|
|
|
|
const script = server.getScript(fileData.filename);
|
|
|
|
if (!script) return error("File doesn't exist", msg);
|
2023-03-06 04:39:42 +01:00
|
|
|
const ramUsage = script.getRamUsage(server.scripts);
|
|
|
|
if (!ramUsage) return error("Ram cost could not be calculated", msg);
|
2022-08-23 23:50:31 +02:00
|
|
|
return new RFAMessage({ result: ramUsage, id: msg.id });
|
2022-08-10 23:22:03 +02:00
|
|
|
},
|
2022-07-30 16:19:22 +02:00
|
|
|
|
2022-08-10 23:22:03 +02:00
|
|
|
getDefinitionFile: function (msg: RFAMessage): RFAMessage {
|
2022-08-28 22:39:01 +02:00
|
|
|
return new RFAMessage({ result: libSource + "", id: msg.id });
|
2022-08-10 23:22:03 +02:00
|
|
|
},
|
|
|
|
};
|