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
This commit is contained in:
Zoë Hoekstra 2022-08-25 23:46:43 +02:00
parent ccf38f2df4
commit 880cc5be51
No known key found for this signature in database
GPG key ID: F9B7B7D8130F3323
6 changed files with 63 additions and 20 deletions

View file

@ -1,4 +1,5 @@
export class EventType {
static ConnectionMade = "ConnectionMade";
static FileChanged = "FileChanged";
static FileDeleted = "FileDeleted";
static MessageReceived = "MessageReceived";

View file

@ -11,14 +11,14 @@ function fileFilter(file) {
return false;
}
export async function setupWatch(signaller) {
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")))
watch.on('+', fileEvent => {if (fileEvent.stats.isFile()) signaller.emit(EventType.FileChanged, fileEvent)});
@ -34,3 +34,7 @@ export async function setupWatch(signaller) {
return watch;
}
export function watchedFiles() {
return watch.paths;
}

View file

@ -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)));

View file

@ -35,3 +35,14 @@ export function requestDefinitionFile(){
"id":messageCounter++
}
}
export function requestFilenames(){
return {
"jsonrpc": "2.0",
"method": "getFileNames",
"params": {
"server": "home",
},
"id":messageCounter++
}
}

View file

@ -1,26 +1,42 @@
import { messageTracker } from "./messageTracker.js";
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, "")
}

View file

@ -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;