mirror of
https://github.com/UiO-Gaming/infoscreen3.git
synced 2026-11-05 13:56:52 +01:00
153 lines
4.5 KiB
JavaScript
153 lines
4.5 KiB
JavaScript
let availableDisplays = require(`../config.js`).displays;
|
|
let display = require(`./display.js`);
|
|
let admin = require(`./admin.js`);
|
|
let cli = require(`./cli.js`);
|
|
let _bundleManager = require(`./bundleManager.js`);
|
|
let chalk = require('chalk');
|
|
let fs = require('fs');
|
|
|
|
|
|
|
|
/**
|
|
* @param server
|
|
* @param app
|
|
* @param io
|
|
* @param dispatcher
|
|
* @return {{screenView: display[], adminView: admin[], bundleManager: bundleManager}}
|
|
*/
|
|
module.exports = function (server, app, io, dispatcher) {
|
|
/**
|
|
* @type {display[]}
|
|
*/
|
|
let screenView = [];
|
|
|
|
/** @type {admin[]} */
|
|
let adminView = [];
|
|
|
|
console.log(chalk.green(">> ") + "InfoScreen3" + chalk.green("<<"));
|
|
cli.log("Checking for write permissions...");
|
|
|
|
try {
|
|
fs.accessSync("./data", fs.W_OK);
|
|
cli.success("data directory (./data) is writable");
|
|
} catch (err) {
|
|
cli.error("data directory (./data) is not writable", err);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
fs.accessSync("./tmp", fs.W_OK);
|
|
cli.success("temp directory (./tmp) is writable ");
|
|
let tempFiles = fs.readdirSync("./tmp/", {
|
|
dotfiles: false
|
|
});
|
|
cli.info("removing temp-files...");
|
|
for (let file of tempFiles) {
|
|
if (file !== ".gitkeep") {
|
|
fs.unlinkSync("./tmp/" + file);
|
|
}
|
|
}
|
|
cli.info("done.");
|
|
|
|
} catch (err) {
|
|
cli.error("temp directory (./tmp) is not writable", err);
|
|
process.exit(1);
|
|
}
|
|
|
|
cli.info("Starting bundle manager...");
|
|
|
|
let bundleManager = new _bundleManager();
|
|
|
|
cli.info("Starting websocket backend...");
|
|
|
|
let screenId = 0;
|
|
|
|
// create screens and admin socket interfaces
|
|
for (let metadata of availableDisplays) {
|
|
let view = new display(io, dispatcher, metadata, screenId, bundleManager);
|
|
screenView.push(view);
|
|
adminView.push(new admin(io, dispatcher, view, screenId, bundleManager));
|
|
screenId += 1;
|
|
}
|
|
|
|
// create overview admin lobby
|
|
io.of("/admin").on("connection", function (socket) {
|
|
|
|
let arr = [];
|
|
for (let display of screenView) {
|
|
arr.push({displayId: display.serverOptions.displayId, serverOptions: display.serverOptions});
|
|
}
|
|
socket.emit("callback.serverOptions", arr);
|
|
|
|
|
|
// handle other events
|
|
cli.info("WS/" + socket.conn.remoteAddress + " connect");
|
|
socket.on('error', function (error) {
|
|
cli.error(error, "WS/ error");
|
|
});
|
|
socket.on('disconnect', function (reason) {
|
|
cli.info("WS/ " + reason + " " + socket.conn.remoteAddress);
|
|
});
|
|
|
|
socket.on('controls.previous', function (data) {
|
|
getAdminView(data.displayId).controls("previous");
|
|
});
|
|
|
|
socket.on('controls.play', function (data) {
|
|
getAdminView(data.displayId).controls("play");
|
|
});
|
|
|
|
socket.on('controls.next', function (data) {
|
|
getAdminView(data.displayId).controls("next");
|
|
});
|
|
|
|
socket.on('controls.pause', function (data) {
|
|
getAdminView(data.displayId).controls("pause");
|
|
});
|
|
|
|
dispatcher.on("dashboard.update", function (data) {
|
|
socket.emit("callback.serverOptions", [data]);
|
|
});
|
|
|
|
});
|
|
|
|
// create lobby
|
|
io.of("/lobby").on("connection", function (socket) {
|
|
cli.info("WS/" + socket.conn.remoteAddress + " connect");
|
|
|
|
socket.on('error', function (error) {
|
|
cli.error(error, "WS/ error");
|
|
});
|
|
|
|
socket.on('disconnect', function (reason) {
|
|
cli.info("WS/ " + reason + " " + socket.conn.remoteAddress);
|
|
});
|
|
|
|
socket.on('displays', function () {
|
|
let previewImages = [];
|
|
for (let display of screenView) {
|
|
if (display.serverOptions.currentMeta.type === "slide") {
|
|
previewImages.push("/render/" + display.serverOptions.currentBundle + "/" + display.serverOptions.currentFile + ".png");
|
|
} else {
|
|
previewImages.push("/img/nopreview.png");
|
|
}
|
|
}
|
|
socket.emit("callback.displays", {displays: availableDisplays, previewImages: previewImages});
|
|
});
|
|
});
|
|
|
|
/**
|
|
* @return admin
|
|
*/
|
|
function getAdminView(index) {
|
|
try {
|
|
return adminView[index];
|
|
} catch (err) {
|
|
cli.log(err);
|
|
}
|
|
}
|
|
|
|
return {screenView: screenView, adminView: adminView, bundleManager: bundleManager};
|
|
};
|
|
|