From 6666a176eebb9cdc56cb620a130424f7dea51491 Mon Sep 17 00:00:00 2001 From: G4mingJon4s <40526179+G4mingJon4s@users.noreply.github.com> Date: Mon, 10 Mar 2025 09:32:47 +0100 Subject: [PATCH] MISC: Add support for getting the save file through the RFA (#2004) --- src/RemoteFileAPI/MessageDefinitions.ts | 13 ++++++++- src/RemoteFileAPI/MessageHandlers.ts | 35 ++++++++++++++++++++++++- src/RemoteFileAPI/Remote.ts | 5 ++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/RemoteFileAPI/MessageDefinitions.ts b/src/RemoteFileAPI/MessageDefinitions.ts index abb7f5688..1a9e46fb3 100644 --- a/src/RemoteFileAPI/MessageDefinitions.ts +++ b/src/RemoteFileAPI/MessageDefinitions.ts @@ -1,3 +1,4 @@ +import { SaveData } from "../types"; import type { BaseServer } from "../Server/BaseServer"; export class RFAMessage { @@ -17,7 +18,17 @@ export class RFAMessage { } } -type ResultType = string | number | string[] | FileContent[] | RFAServerData[]; +type ResultType = + | string + | number + | string[] + | FileContent[] + | RFAServerData[] + | { + identifier: string; + binary: boolean; + save: SaveData; + }; type FileMetadata = FileData | FileContent | FileLocation | FileServer; export interface FileData { diff --git a/src/RemoteFileAPI/MessageHandlers.ts b/src/RemoteFileAPI/MessageHandlers.ts index f5af08889..4f8d3073c 100644 --- a/src/RemoteFileAPI/MessageHandlers.ts +++ b/src/RemoteFileAPI/MessageHandlers.ts @@ -13,12 +13,14 @@ import { } from "./MessageDefinitions"; import libSource from "../ScriptEditor/NetscriptDefinitions.d.ts?raw"; +import { saveObject } from "../SaveObject"; +import { Player } from "@player"; function error(errorMsg: string, { id }: RFAMessage): RFAMessage { return new RFAMessage({ error: errorMsg, id: id }); } -export const RFARequestHandler: Record RFAMessage> = { +export const RFARequestHandler: Record RFAMessage | Promise> = { pushFile: function (msg: RFAMessage): RFAMessage { if (!isFileData(msg.params)) return error("Misses parameters", msg); @@ -112,6 +114,37 @@ export const RFARequestHandler: Record RFAMessa return new RFAMessage({ result: libSource, id: msg.id }); }, + getSaveFile: async function (msg: RFAMessage): Promise { + const saveData = await saveObject.getSaveData(); + + if (typeof saveData === "string") { + return new RFAMessage({ + result: { + identifier: Player.identifier, + binary: false, + save: saveData, + }, + id: msg.id, + }); + } + + // We can't serialize the Uint8Array directly, so we convert every integer to a character and make a string out of the array + // The external editor can simply recreate the save by converting each char back to their char code + let converted = ""; + for (let i = 0; i < saveData.length; i++) { + converted += String.fromCharCode(saveData[i]); + } + + return new RFAMessage({ + result: { + identifier: Player.identifier, + binary: true, + save: converted, + }, + id: msg.id, + }); + }, + getAllServers: function (msg: RFAMessage): RFAMessage { const servers = GetAllServers().map(({ hostname, hasAdminRights, purchasedByPlayer }) => ({ hostname, diff --git a/src/RemoteFileAPI/Remote.ts b/src/RemoteFileAPI/Remote.ts index e94a74c38..0b5649b8c 100644 --- a/src/RemoteFileAPI/Remote.ts +++ b/src/RemoteFileAPI/Remote.ts @@ -60,5 +60,10 @@ function handleMessageEvent(this: WebSocket, e: MessageEvent): void { } const response = RFARequestHandler[msg.method](msg); if (!response) return; + + if (response instanceof Promise) { + void response.then((data) => this.send(JSON.stringify(data))); + return; + } this.send(JSON.stringify(response)); }