From 880cc5be51c915653163ebc8338a56d16f61f0be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Hoekstra?= Date: Thu, 25 Aug 2022 23:46:43 +0200 Subject: [PATCH] Synchronize missing files on start (rq #4044) Synchronize files that the game doesn't have yet, skip any files it knows about already. Requires Bitburner PR #4044: https://github.com/danielyxie/bitburner/pull/4044 --- src/eventTypes.js | 1 + src/fileWatch.js | 18 +++++++++++------- src/index.js | 19 +++++++++++++++++-- src/networking/messageGenerators.js | 11 +++++++++++ src/networking/messageHandler.js | 28 ++++++++++++++++++++++------ src/networking/webSocket.js | 6 +----- 6 files changed, 63 insertions(+), 20 deletions(-) diff --git a/src/eventTypes.js b/src/eventTypes.js index 07e9ca0..6aad76b 100644 --- a/src/eventTypes.js +++ b/src/eventTypes.js @@ -1,4 +1,5 @@ export class EventType { + static ConnectionMade = "ConnectionMade"; static FileChanged = "FileChanged"; static FileDeleted = "FileDeleted"; static MessageReceived = "MessageReceived"; diff --git a/src/fileWatch.js b/src/fileWatch.js index 4ae6ea9..a7ab851 100644 --- a/src/fileWatch.js +++ b/src/fileWatch.js @@ -11,13 +11,13 @@ function fileFilter(file) { return false; } -export async function setupWatch(signaller) { +const watch = new CheapWatch({ + dir: config.get("scriptsFolder"), + filter: fileFilter, + watch: !config.get("dry") +}); - const watch = new CheapWatch({ - dir: config.get("scriptsFolder"), - filter: fileFilter, - watch: !config.get("dry") - }); +export async function setupWatch(signaller) { if(!config.get("quiet")) console.log("Watching folder", resolve(config.get("scriptsFolder"))) @@ -30,7 +30,11 @@ export async function setupWatch(signaller) { if(config.get("dry")) { console.log("Watch would've synchronised:\n", watch.paths) process.exit(); - } + } return watch; +} + +export function watchedFiles() { + return watch.paths; } \ No newline at end of file diff --git a/src/index.js b/src/index.js index c760657..ae64bdf 100644 --- a/src/index.js +++ b/src/index.js @@ -3,7 +3,7 @@ import { setupWatch } from "./fileWatch.js"; import { config, loadConfig } from "./config.js"; import { setupSocket } from "./networking/webSocket.js"; import signal from "signal-js"; -import { fileChangeEventToMsg, fileRemovalEventToMsg, requestDefinitionFile } from "./networking/messageGenerators.js"; +import { fileChangeEventToMsg, fileRemovalEventToMsg, requestFilenames } from "./networking/messageGenerators.js"; import { EventType } from "./eventTypes.js"; import { messageHandler } from "./networking/messageHandler.js"; @@ -12,13 +12,28 @@ export async function start() { const watch = await setupWatch(signal); const socket = setupSocket(signal); - signal.on(EventType.MessageReceived, msg => messageHandler(msg)); + // Add a handler for received messages. + signal.on(EventType.MessageReceived, msg => messageHandler(signal, msg)); + // Add a handler for when a connection to a game is made. + signal.on(EventType.ConnectionMade, () => { + console.log("Connection made!"); + + if (config.get("definitionFile").update) { + signal.emit(EventType.MessageSend, requestDefinitionFile()); + } + + // Upload missing files to the game. + signal.emit(EventType.MessageSend, requestFilenames()); + }) + + // Add a handler for changed files. signal.on(EventType.FileChanged, fileEvent => { if (!config.get("quiet")) console.log(fileEvent.path + " changed"); signal.emit(EventType.MessageSend, fileChangeEventToMsg(fileEvent)) }); + // Add a handler for removed files, if allowed. if (config.get("allowDeletingFiles")) signal.on(EventType.FileDeleted, fileEvent => signal.emit(EventType.MessageSend, fileRemovalEventToMsg(fileEvent))); diff --git a/src/networking/messageGenerators.js b/src/networking/messageGenerators.js index 9f270b4..7cc6188 100644 --- a/src/networking/messageGenerators.js +++ b/src/networking/messageGenerators.js @@ -34,4 +34,15 @@ export function requestDefinitionFile(){ "method": "getDefinitionFile", "id":messageCounter++ } +} + +export function requestFilenames(){ + return { + "jsonrpc": "2.0", + "method": "getFileNames", + "params": { + "server": "home", + }, + "id":messageCounter++ + } } \ No newline at end of file diff --git a/src/networking/messageHandler.js b/src/networking/messageHandler.js index 42cbd01..74eeda4 100644 --- a/src/networking/messageHandler.js +++ b/src/networking/messageHandler.js @@ -1,26 +1,42 @@ import { messageTracker } from "./messageTracker.js"; -import {writeFile} from "fs"; +import { writeFile } from "fs"; import { config } from "../config.js"; +import { watchedFiles } from "../fileWatch.js"; +import { EventType } from "../eventTypes.js"; +import { fileChangeEventToMsg } from "./messageGenerators.js"; -export function messageHandler(msg) { +export function messageHandler(signaller, msg) { let incoming; try {incoming = JSON.parse(msg.toString());} - catch {return;} + catch (err) {return console.log(err);} console.log(incoming) if (incoming.id == undefined) return; if (incoming.result) { const request = messageTracker.get(incoming.id); - console.log(messageTracker.data); - console.log("REQUEST: ", request); if (request.method && request.method == "getDefinitionFile" && incoming.result) { writeFile(config.get("definitionFile").location, incoming.result, (err) => { if (err) return console.log(err); - console.log("wrote definition") }); } + + if (request.method && + request.method == "getFileNames" + && incoming.result) { + const gameFiles = incoming.result.map(file => removeLeadingSlash(file)); + + watchedFiles().forEach((stats, fileName) => { + if(!stats.isDirectory() && !gameFiles.includes(fileName)) + signaller.emit(EventType.MessageSend, fileChangeEventToMsg({path:fileName})); + }) + } } +} + +function removeLeadingSlash(path){ + const reg = /^\//; + return path.replace(reg, "") } \ No newline at end of file diff --git a/src/networking/webSocket.js b/src/networking/webSocket.js index 66c8c2b..280cb82 100644 --- a/src/networking/webSocket.js +++ b/src/networking/webSocket.js @@ -23,11 +23,7 @@ export function setupSocket(signaller){ sendMessage(msg); }); - if (config.get("definitionFile").update) { - sendMessage(requestDefinitionFile()); - } - - console.log("Connection made!"); + signaller.trigger(EventType.ConnectionMade); }); return wss;