Files
factorio-clusterio/plugins/inventory_sync/master.js
T

79 lines
2.3 KiB
JavaScript

"use strict";
const fs = require("fs-extra");
const path = require("path");
const libPlugin = require("@clusterio/lib/plugin");
async function loadDatabase(config, logger) {
let itemsPath = path.resolve(config.get("master.database_directory"), "inventories.json");
logger.verbose(`Loading ${itemsPath}`);
try {
let content = await fs.readFile(itemsPath);
return JSON.parse(content);
} catch (err) {
if (err.code === "ENOENT") {
logger.verbose("Creating new inventory database");
return {};
}
throw err;
}
}
async function saveDatabase(masterConfig, inventories, logger) {
if (inventories) {
let file = path.resolve(masterConfig.get("master.database_directory"), "inventories.json");
logger.verbose(`writing ${file}`);
let content = JSON.stringify(inventories);
await fs.outputFile(file, content);
}
}
class MasterPlugin extends libPlugin.BaseMasterPlugin {
async init() {
this.inventories = await loadDatabase(this.master.config, this.logger);
this.autosaveId = setInterval(() => {
saveDatabase(this.master.config, this.inventories, this.logger).catch(err => {
this.logger.error(`Unexpected error autosaving inventories:\n${err.stack}`);
});
}, this.master.config.get("inventory_sync.autosave_interval") * 1000);
}
async uploadRequestHandler(message) {
console.log("Saving inventory for", message.data.player_name)
this.inventories[message.data.player_name] = message.data.inventory
return { success: true }
}
async downloadRequestHandler(message) {
console.log("Downloading inventory for", message.data.player_name)
return {
player_name: message.data.player_name,
inventory: this.inventories[message.data.player_name]
}
}
async onShutdown() {
clearInterval(this.autosaveId);
await saveDatabase(this.master.config, this.inventories, this.logger);
}
async databaseStatsRequestHandler(message) {
let inventories = Object.keys(this.inventories)
.map(name => ({
name,
length: this.inventories[name].length
}))
.sort((a, b) => a.stringified.length - b.stringified.length)
return {
database_size: inventories.map(x => x.length).reduce((a, b) => b - a, 0),
database_entries: inventories.length,
largest_entry: {
name: inventories[0].name,
size: inventories[0].length,
},
}
}
}
module.exports = {
MasterPlugin,
};