diff --git a/modules/bundleManager.js b/modules/bundleManager.js index df6158f..bdeb21c 100644 --- a/modules/bundleManager.js +++ b/modules/bundleManager.js @@ -1,5 +1,3 @@ -"use strict"; - const bundle = require(`./bundle.js`); let fs = require("fs"); let cli = require(`./cli.js`); diff --git a/modules/display.js b/modules/display.js index 409cce7..4c83542 100644 --- a/modules/display.js +++ b/modules/display.js @@ -1,10 +1,6 @@ 'use strict' let fs = require("fs"); let cli = require(`./cli.js`); -let bundleManager = require(`./bundleManager.js`); -let config = require('../config.js'); -let plugins = {}; - /** * handles one display instance diff --git a/modules/plugin.js b/modules/plugin.js index bd576ce..6d35f36 100644 --- a/modules/plugin.js +++ b/modules/plugin.js @@ -1,12 +1,20 @@ let express = require('express'); let Twig = require('twig'); let fs = require('fs'); -let cli = require('./cli'); - +/** + * Base plugin class + * + * Strucure of plugin: + * D /public/ -- serves files statically at http path: /data/pluginName/ + * D /views/ -- directory for twig templates + * F /plugin.js -- pluginfile which will be loaded + * + * if you need external libs, just add `package.json` to the plugin dir, and call npm install :) + */ class plugin { - constructor(pluginName, app, io, dispatcher) { + constructor(pluginName, app, io, dispatcher) { this.pluginName = pluginName; this.subApp = express(); this.subApp.set('views', "plugins/" + pluginName + "/views"); @@ -27,10 +35,34 @@ class plugin { return Twig.twig({ data: fs.readFileSync("plugins/" + this.pluginName + "/views/" + template + ".twig").toString() }).render(data); } + /** + * Called at infoscreen init-phase + * + * the example will render a view from `pluginName/Views/test.twig` to route `/admin/test` + * @example + * let self = this; + * router.get("/test", function (req, res, next) { + * res.send(self.renderPluginView("test", { test: "hello!" })); + * // res.render(); will render from infoscreen/views/*.twig + * }); + * @param {express.Router} router + */ onAdminRouter(router) { } + /** + * Called at infoscreen init-phase + * + * the example will render a view from `pluginName/Views/test.twig` to route `/test` + * + * @example + * router.get("/test", function (req, res) { + * res.render("test", { test: "hello!" }); + * }); + * + * @param {express.Router} router + */ onPluginRouter(router) { } @@ -38,7 +70,11 @@ class plugin { onInit() { } - + /** + * Inserts html to display views + * + * @returns {string} HTML to be added to display View + */ setDisplayViewAdditions() { return ""; } diff --git a/modules/pluginManager.js b/modules/pluginManager.js index 40000ec..54f2aa9 100644 --- a/modules/pluginManager.js +++ b/modules/pluginManager.js @@ -12,15 +12,15 @@ class pluginManager { try { let pluginclass = require("../plugins/" + pluginName + "/plugin.js").default; let pluginInstance = new pluginclass(pluginName, app, io, eventDispatcher); - cli.info("Plugin: " + pluginName, 'plugin'); + cli.info("" + pluginName, 'plugin'); this.plugins[pluginName] = pluginInstance; } catch (err) { - cli.error("Plugin " + pluginName, err); + cli.error(err, pluginName); } } } - - callMethod(method, params) { + + callMethod(method, params) { this.dispatcher.emit("plugin." + method, params); } diff --git a/plugins/ping/plugin.js b/plugins/ping/plugin.js index b46b59e..3b3d526 100644 --- a/plugins/ping/plugin.js +++ b/plugins/ping/plugin.js @@ -1,32 +1,40 @@ let plugin = require("../../modules/plugin.js").default; let config = require(__dirname + "/config.json"); -var sys = require('util'); -var exec = require('child_process').exec; +let exec = require('child_process').exec; + +function ping_getTime() { + let d = new Date(); + return d.getTime(); +} + class myTestPlugin extends plugin { onInit() { - - } - - onAdminRouter(router) { - /* let self = this; - router.get("/test", function (req, res, next) { - res.send(self.renderPluginView("test", { test: "hello!" })); - }); */ + this.cache = 0; + this.lastStamp = ping_getTime()-30000; } onPluginRouter(router) { + let self = this; router.get("/ajax/ping", function (req, res) { + + if ((ping_getTime() - self.lastStamp) <= 5 * 1000) { + return res.json({ ping: self.cache }); + } + let cmd = "ping -c 1 "; let regex = /=([0-9.]+?) ms/; if (/^win/.test(process.platform)) { cmd = "ping -n 1 "; regex = /[><=]([0-9.]+?)ms/; } + exec(cmd + config.host, function (err, stdout, stdErr) { var ms = stdout.match(regex); ms = (ms && ms[1]) ? Number(ms[1]) : ms; + self.lastStamp = ping_getTime(); + self.cache = ms; res.json({ ping: ms }); }); }) diff --git a/public/js/dashboard.js b/public/js/dashboard.js index 51cc619..dd26972 100644 --- a/public/js/dashboard.js +++ b/public/js/dashboard.js @@ -35,7 +35,7 @@ socket.on("callback.dashboard.sync", function (data) { // update dropdown at menu with bundles var valueArray = []; for (var dir of bundleDirs) { - valueArray.push({name: dir.name, value: dir.dir}); + valueArray.push({ name: dir.name, value: dir.dir }); } $('#bundles') @@ -46,16 +46,16 @@ socket.on("callback.dashboard.sync", function (data) { $('#bundles') .dropdown("hide"); - emit("admin.setBundle", {bundle: _value}); + emit("admin.setBundle", { bundle: _value }); } - }).dropdown("set selected", {bundle: serverOptions.currentBundle}); + }).dropdown("set selected", { bundle: serverOptions.currentBundle }); $('#currentBundle').text(serverOptions.currentBundle); $('#statusMessageAdmin').val(serverOptions.statusMessage); // update dropdown at menu with bundles valueArray = []; var x = 0; for (var display of data.displays) { - valueArray.push({name: display.name, value: x}); + valueArray.push({ name: display.name, value: x }); x++; } @@ -77,9 +77,9 @@ socket.on("callback.dashboard.sync", function (data) { var transitionArray = []; var values = ["bars", "blinds", "blinds3d", "zip", "blocks", "blocks2", "concentric", "warp", "cube", "tiles3d", "tiles3dprev", "slide", "swipe", "dissolve"]; - transitionArray.push({name: "random", value: null}); + transitionArray.push({ name: "random", value: null }); for (var i in values) { - transitionArray.push({name: values[i], value: values[i]}); + transitionArray.push({ name: values[i], value: values[i] }); } $('#transitions') @@ -90,7 +90,7 @@ socket.on("callback.dashboard.sync", function (data) { $('#transitions').dropdown("hide"); $('#transitions').dropdown("set selected", value); - emit("admin.setTransition", {transition: value}); + emit("admin.setTransition", { transition: value }); $('#currentTransition').text(text); } @@ -111,6 +111,7 @@ socket.on("callback.dashboard.updateSlides", function (data) { }); socket.on("callback.dashboard.updateBundles", function (data) { + bundleSettings = data; // updateBundleData(data.bundleDirs); }); @@ -133,7 +134,7 @@ socket.on("callback.dashboard.update", function (data) { $('.editable').editable(function (value, settings) { var uuid = $(this).parent().parent().attr("id"); - emit("admin.renameSlide", {uuid: uuid, name: value, bundleName: serverOptions.currentBundle}); + emit("admin.renameSlide", { uuid: uuid, name: value, bundleName: serverOptions.currentBundle }); return (value); }, { submit: 'rename', @@ -150,7 +151,7 @@ $(function () { $(".sortable").sortable({ beforeStop: function (event, element) { var sortedIDs = $(".sortable").sortable("toArray"); - emit("admin.reorderSlides", {bundleName: serverOptions.currentBundle, sortedIDs: sortedIDs}); + emit("admin.reorderSlides", { bundleName: serverOptions.currentBundle, sortedIDs: sortedIDs }); } }).disableSelection(); }); @@ -224,7 +225,7 @@ function createNewBundle() { return false; }, onApprove: function () { - emit("admin.createBundle", {"dir": $("#newBundleDirName").val(), "bundle": $("#newBundleName").val()}); + emit("admin.createBundle", { "dir": $("#newBundleDirName").val(), "bundle": $("#newBundleName").val() }); $("#newBundleDirName").val(""); $("#newBundleName").val(""); $('#newBundle').modal("hide"); @@ -242,7 +243,7 @@ function emit(eventName, data) { if (data === undefined || data === null) { data = {}; } - Object.assign(data, {displayId: parseInt(displayId)}); + Object.assign(data, { displayId: parseInt(displayId) }); socket.emit(eventName, data); } @@ -323,7 +324,7 @@ function updateSlides(settings) { $('#' + serverOptions.currentFile).css("border", "1px solid #1ebc30"); $('.editable').editable(function (value, settings) { var uuid = $(this).parent().parent().attr("id"); - emit("admin.renameSlide", {uuid: uuid, name: value, bundleName: serverOptions.currentBundle}); + emit("admin.renameSlide", { uuid: uuid, name: value, bundleName: serverOptions.currentBundle }); return (value); }, { submit: 'rename', @@ -338,7 +339,7 @@ function updateSlides(settings) { function remove(uuid) { - var obj = {bundleName: serverOptions.currentBundle, uuid: uuid}; + var obj = { bundleName: serverOptions.currentBundle, uuid: uuid }; if (confirm("Really delete slide?")) { emit('admin.removeSlide', obj);