mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-16 07:24:53 +09:00
[big change] Added serverManager plugin
This commit is contained in:
1 parent
852311e84c
commit
e2566d2d1c
9 files changed
+498
No files matched your search
@@ -0,0 +1,158 @@
|
||||
const fs = require("fs-extra");
|
||||
const path = require("path");
|
||||
const Express = require("express");
|
||||
const ejs = require("ejs");
|
||||
const bcrypt = require("bcrypt-promise");
|
||||
const crypto = require('crypto');
|
||||
const base64url = require('base64url');
|
||||
const sanitizer = require('sanitizer');
|
||||
|
||||
|
||||
class masterPlugin {
|
||||
constructor({config, pluginConfig, pluginPath, socketio, express}){
|
||||
this.config = config;
|
||||
this.pluginConfig = pluginConfig;
|
||||
this.pluginPath = pluginPath;
|
||||
this.io = socketio;
|
||||
this.app = express;
|
||||
|
||||
// load databases
|
||||
// const database = getDatabaseSync("database/playerManager.json");
|
||||
// this.whitelist = getDatabaseSync("database/whitelist.json").whitelist || [];
|
||||
// this.banlist = getDatabaseSync("database/banlist.json").banlist || [];
|
||||
|
||||
// initialize web API
|
||||
require("./js/api-endpoints.js")(this);
|
||||
|
||||
// expose UI elements embedded in the master
|
||||
this.ui = require("./js/ui.js").injectThis(this).ui;
|
||||
|
||||
this.serverSockets = {};
|
||||
|
||||
this.io.on("connection", socket => {
|
||||
let instanceID = "unknown";
|
||||
let isServerManager = false;
|
||||
socket.on("registerSlave", data => {
|
||||
if(data.instanceID && !isNaN(Number(data.instanceID))){
|
||||
instanceID = data.instanceID;
|
||||
if(isServerManager){
|
||||
this.serverSockets[instanceID] = {socket};
|
||||
validServerManager({server: this.serverSockets[instanceID]});
|
||||
}
|
||||
}
|
||||
});
|
||||
socket.on("registerServerManager", () => {
|
||||
isServerManager = true;
|
||||
if(instanceID !== "unknown"){
|
||||
this.serverSockets[instanceID] = {socket};
|
||||
validServerManager({server: this.serverSockets[instanceID]});
|
||||
}
|
||||
console.log("Registered serverManager socket")
|
||||
|
||||
socket.on("disconnect", () => {
|
||||
if(this.serverSockets[instanceID]) delete this.serverSockets[instanceID];
|
||||
console.log(`serverManager ${instanceID} disconnected, ${(Object.keys(this.serverSockets).length)} left`);
|
||||
});
|
||||
});
|
||||
socket.on("gameChat", async data => {
|
||||
// let chatLine = data.data.replace(/(\r\n\t|\n|\r\t)/gm, "").replace("\r", "");
|
||||
// if(typeof chatLine == "string") this.handleChatLine(chatLine, instanceID);
|
||||
});
|
||||
});
|
||||
let validServerManager = ({server}) => {
|
||||
server.socket.emit("serverManagerGetPlugins", {}, data => {
|
||||
server.plugins = data;
|
||||
});
|
||||
server.socket.emit("serverManagerGetConfig", {}, data => {
|
||||
server.config = data;
|
||||
});
|
||||
}
|
||||
|
||||
// I can't seem to get express static pages + ejs rendering to work properly, so I write my own thing.
|
||||
let pages = [
|
||||
{
|
||||
addr: "/serverManager",
|
||||
path: path.join(__dirname,"static/index.html"),
|
||||
render: ejs
|
||||
},
|
||||
]
|
||||
pages.forEach(page => {
|
||||
this.app.get(page.addr, async (req,res) => {
|
||||
if(page.render){
|
||||
if((req.query.token || req.cookies.token) && this.playerManager){
|
||||
var permissions = await this.playerManager.main.getPermissions((req.query.token || req.cookies.token));
|
||||
} else {
|
||||
var permissions = {};
|
||||
}
|
||||
page.render.renderFile(page.path, {
|
||||
permissions,
|
||||
serverManager: this,
|
||||
req: req,
|
||||
}, async (err, prom) => {
|
||||
if(err) console.log(err);
|
||||
let str = await prom;
|
||||
res.send(str);
|
||||
});
|
||||
} else {
|
||||
res.send(await fs.readFile(page.path));
|
||||
}
|
||||
});
|
||||
});
|
||||
this.app.use('/serverManager', Express.static(path.join(__dirname, 'static')));
|
||||
}
|
||||
findInArray(key, value, array){
|
||||
let indexes = [];
|
||||
for(let i in array){
|
||||
if(array[i][key] && array[i][key] === value) indexes.push(i);
|
||||
}
|
||||
return indexes;
|
||||
}
|
||||
async onExit(){
|
||||
// await saveDatabase("database/banlist.json", {banlist: this.banlist});
|
||||
return;
|
||||
}
|
||||
async onLoadFinish({plugins}){
|
||||
this.masterPlugins = plugins;
|
||||
plugins.forEach(plugin => {
|
||||
if(plugin.pluginConfig.name == "playerManager"){
|
||||
this.playerManager = plugin;
|
||||
}
|
||||
});
|
||||
}
|
||||
async onPlayerManagerGetPermissions({permissions, user}){
|
||||
if(user
|
||||
&& user.admin){
|
||||
permissions.cluster.push("addPlugin");
|
||||
permissions.cluster.push("removePlugin");
|
||||
permissions.cluster.push("enablePlugin");
|
||||
permissions.cluster.push("disablePlugin");
|
||||
permissions.cluster.push("readConfig");
|
||||
permissions.cluster.push("writeConfig");
|
||||
}
|
||||
return permissions;
|
||||
}
|
||||
}
|
||||
module.exports = masterPlugin;
|
||||
|
||||
function getDatabaseSync(path){
|
||||
let db;
|
||||
try {
|
||||
db = JSON.parse(fs.readFileSync(path, "utf8"));
|
||||
} catch(e){
|
||||
db = {};
|
||||
}
|
||||
return db;
|
||||
}
|
||||
async function saveDatabase(path, database){
|
||||
if(!path){
|
||||
throw new Error("No path provided!");
|
||||
} else if(!database){
|
||||
throw new Error("No database provided!");
|
||||
} else {
|
||||
try {
|
||||
await fs.writeFile(path, JSON.stringify(database, null, 4));
|
||||
} catch(e){
|
||||
throw new Error("Unable to write to database! "+path);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user