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:
parent
ccf38f2df4
commit
880cc5be51
6 changed files with 63 additions and 20 deletions
|
@ -1,4 +1,5 @@
|
||||||
export class EventType {
|
export class EventType {
|
||||||
|
static ConnectionMade = "ConnectionMade";
|
||||||
static FileChanged = "FileChanged";
|
static FileChanged = "FileChanged";
|
||||||
static FileDeleted = "FileDeleted";
|
static FileDeleted = "FileDeleted";
|
||||||
static MessageReceived = "MessageReceived";
|
static MessageReceived = "MessageReceived";
|
||||||
|
|
|
@ -11,13 +11,13 @@ function fileFilter(file) {
|
||||||
return false;
|
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({
|
export async function setupWatch(signaller) {
|
||||||
dir: config.get("scriptsFolder"),
|
|
||||||
filter: fileFilter,
|
|
||||||
watch: !config.get("dry")
|
|
||||||
});
|
|
||||||
|
|
||||||
if(!config.get("quiet")) console.log("Watching folder", resolve(config.get("scriptsFolder")))
|
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")) {
|
if(config.get("dry")) {
|
||||||
console.log("Watch would've synchronised:\n", watch.paths)
|
console.log("Watch would've synchronised:\n", watch.paths)
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
return watch;
|
return watch;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function watchedFiles() {
|
||||||
|
return watch.paths;
|
||||||
}
|
}
|
19
src/index.js
19
src/index.js
|
@ -3,7 +3,7 @@ import { setupWatch } from "./fileWatch.js";
|
||||||
import { config, loadConfig } from "./config.js";
|
import { config, loadConfig } from "./config.js";
|
||||||
import { setupSocket } from "./networking/webSocket.js";
|
import { setupSocket } from "./networking/webSocket.js";
|
||||||
import signal from "signal-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 { EventType } from "./eventTypes.js";
|
||||||
import { messageHandler } from "./networking/messageHandler.js";
|
import { messageHandler } from "./networking/messageHandler.js";
|
||||||
|
|
||||||
|
@ -12,13 +12,28 @@ export async function start() {
|
||||||
const watch = await setupWatch(signal);
|
const watch = await setupWatch(signal);
|
||||||
const socket = setupSocket(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 => {
|
signal.on(EventType.FileChanged, fileEvent => {
|
||||||
if (!config.get("quiet")) console.log(fileEvent.path + " changed");
|
if (!config.get("quiet")) console.log(fileEvent.path + " changed");
|
||||||
signal.emit(EventType.MessageSend, fileChangeEventToMsg(fileEvent))
|
signal.emit(EventType.MessageSend, fileChangeEventToMsg(fileEvent))
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add a handler for removed files, if allowed.
|
||||||
if (config.get("allowDeletingFiles"))
|
if (config.get("allowDeletingFiles"))
|
||||||
signal.on(EventType.FileDeleted, fileEvent =>
|
signal.on(EventType.FileDeleted, fileEvent =>
|
||||||
signal.emit(EventType.MessageSend, fileRemovalEventToMsg(fileEvent)));
|
signal.emit(EventType.MessageSend, fileRemovalEventToMsg(fileEvent)));
|
||||||
|
|
|
@ -34,4 +34,15 @@ export function requestDefinitionFile(){
|
||||||
"method": "getDefinitionFile",
|
"method": "getDefinitionFile",
|
||||||
"id":messageCounter++
|
"id":messageCounter++
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function requestFilenames(){
|
||||||
|
return {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": "getFileNames",
|
||||||
|
"params": {
|
||||||
|
"server": "home",
|
||||||
|
},
|
||||||
|
"id":messageCounter++
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,26 +1,42 @@
|
||||||
import { messageTracker } from "./messageTracker.js";
|
import { messageTracker } from "./messageTracker.js";
|
||||||
import {writeFile} from "fs";
|
import { writeFile } from "fs";
|
||||||
import { config } from "../config.js";
|
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;
|
let incoming;
|
||||||
|
|
||||||
try {incoming = JSON.parse(msg.toString());}
|
try {incoming = JSON.parse(msg.toString());}
|
||||||
catch {return;}
|
catch (err) {return console.log(err);}
|
||||||
console.log(incoming)
|
console.log(incoming)
|
||||||
if (incoming.id == undefined) return;
|
if (incoming.id == undefined) return;
|
||||||
|
|
||||||
if (incoming.result) {
|
if (incoming.result) {
|
||||||
const request = messageTracker.get(incoming.id);
|
const request = messageTracker.get(incoming.id);
|
||||||
console.log(messageTracker.data);
|
|
||||||
console.log("REQUEST: ", request);
|
|
||||||
if (request.method &&
|
if (request.method &&
|
||||||
request.method == "getDefinitionFile"
|
request.method == "getDefinitionFile"
|
||||||
&& incoming.result) {
|
&& incoming.result) {
|
||||||
writeFile(config.get("definitionFile").location, incoming.result, (err) => {
|
writeFile(config.get("definitionFile").location, incoming.result, (err) => {
|
||||||
if (err) return console.log(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, "")
|
||||||
}
|
}
|
|
@ -23,11 +23,7 @@ export function setupSocket(signaller){
|
||||||
sendMessage(msg);
|
sendMessage(msg);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (config.get("definitionFile").update) {
|
signaller.trigger(EventType.ConnectionMade);
|
||||||
sendMessage(requestDefinitionFile());
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("Connection made!");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return wss;
|
return wss;
|
||||||
|
|
Loading…
Add table
Reference in a new issue