Skip to content
Snippets Groups Projects
Commit 92a6a8c3 authored by marudor's avatar marudor
Browse files

also work for EOL node 0.10 and 0.12...

parent a1239f14
No related branches found
No related tags found
1 merge request!4future! (as in not EOL) node, flex design
Showing
with 3 additions and 531 deletions
{
"presets": ["node6"]
"presets": ["es2015"]
}
*.swp
npm-debug.log
node_modules
modules
/* eslint no-console: 0 */
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
server.listen(8000);
app.use(express.static(`${__dirname }/public`));
const instanceClients = [];
io.on('connection', (socket) => {
socket.on('ident', (client) => {
if (instanceClients.indexOf(client) === -1) {
instanceClients.push(client);
socket.emit('meta', 'reload');
}
});
});
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
// for reasons
global.DOW = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
global.pad = function(n, width, z = '0') {
// eslint-disable-next-line
n = String(n);
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
};
const normalizedPath = require('path').join(__dirname, 'modules');
require('fs').readdirSync(normalizedPath).forEach((file) => {
if (endsWith(file, '.js')) {
try {
require(`./modules/${ file}`)(io);
console.log(`${file} loaded`);
} catch (e) {
console.log(`Error loading ${file}`);
console.log(e);
}
}
});
require('./modules/main.js');
'use strict';
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _httpreq = require('httpreq');
var _httpreq2 = _interopRequireDefault(_httpreq);
var _Mustache = require('Mustache');
var _Mustache2 = _interopRequireDefault(_Mustache);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const URL = 'https://stratum0.org/status/status.json';
const TEMPLATES = {
template: _fs2.default.readFileSync('modules/brand/template.mustache', 'utf-8'),
status: _fs2.default.readFileSync('modules/brand/status.mustache', 'utf-8')
};
let status = {};
function renderStatus(sock, everything) {
const sendInner = function () {
status.random = `${Math.random()}`;
sock.emit('brand.status', _Mustache2.default.render(TEMPLATES.status, status));
};
if (everything) {
sock.emit('brand', _Mustache2.default.render(TEMPLATES.template, {}));
setTimeout(sendInner, 3000);
} else {
sendInner();
}
}
function fetchStatus(cb) {
_httpreq2.default.get(URL, (err, res) => {
const state = JSON.parse(res.body).state;
cb(state);
});
}
module.exports = function (io) {
let firstTime = true;
function update() {
fetchStatus(state => {
if (status.lastchange !== state.lastchange) {
const d = new Date(state.lastchange * 1000);
state.since = `${DOW[d.getDay()]}, ${pad(d.getHours(), 2)}:${pad(d.getMinutes(), 2)}`;
status = state;
renderStatus(io);
}
if (firstTime && status) {
io.on('connection', sock => {
renderStatus(sock, true);
});
renderStatus(io, true);
firstTime = false;
} else {
renderStatus(io, false);
}
});
}
setInterval(update, 2 * 60 * 1000); //every 2 minutes
update();
};
//# sourceMappingURL=brand.js.map
\ No newline at end of file
{"version":3,"sources":["../src/brand.js"],"names":["URL","TEMPLATES","template","readFileSync","status","renderStatus","sock","everything","sendInner","random","Math","emit","render","setTimeout","fetchStatus","cb","get","err","res","state","JSON","parse","body","module","exports","io","firstTime","update","lastchange","d","Date","since","DOW","getDay","pad","getHours","getMinutes","on","setInterval"],"mappings":";;AAAA;;;;AACA;;;;AACA;;;;;;AAEA,MAAMA,MAAM,yCAAZ;AACA,MAAMC,YAAY;AAChBC,YAAU,aAAGC,YAAH,CAAgB,iCAAhB,EAAmD,OAAnD,CADM;AAEhBC,UAAQ,aAAGD,YAAH,CAAgB,+BAAhB,EAAiD,OAAjD;AAFQ,CAAlB;;AAKA,IAAIC,SAAS,EAAb;;AAEA,SAASC,YAAT,CAAsBC,IAAtB,EAA4BC,UAA5B,EAAwC;AACtC,QAAMC,YAAY,YAAW;AAC3BJ,WAAOK,MAAP,GAAiB,GAAEC,KAAKD,MAAL,EAAc,EAAjC;AACAH,SAAKK,IAAL,CAAU,cAAV,EAA0B,mBAASC,MAAT,CAAgBX,UAAUG,MAA1B,EAAkCA,MAAlC,CAA1B;AACD,GAHD;AAIA,MAAIG,UAAJ,EAAgB;AACdD,SAAKK,IAAL,CAAU,OAAV,EAAmB,mBAASC,MAAT,CAAgBX,UAAUC,QAA1B,EAAoC,EAApC,CAAnB;AACAW,eAAWL,SAAX,EAAsB,IAAtB;AACD,GAHD,MAGO;AACLA;AACD;AACF;;AAED,SAASM,WAAT,CAAqBC,EAArB,EAAyB;AACvB,oBAAQC,GAAR,CAAYhB,GAAZ,EAAiB,CAACiB,GAAD,EAAMC,GAAN,KAAc;AAC7B,UAAMC,QAAQC,KAAKC,KAAL,CAAWH,IAAII,IAAf,EAAqBH,KAAnC;AACAJ,OAAGI,KAAH;AACD,GAHD;AAID;;AAEDI,OAAOC,OAAP,GAAiB,UAASC,EAAT,EAAa;AAC5B,MAAIC,YAAY,IAAhB;AACA,WAASC,MAAT,GAAkB;AAChBb,gBAAaK,KAAD,IAAW;AACrB,UAAIf,OAAOwB,UAAP,KAAsBT,MAAMS,UAAhC,EAA4C;AAC1C,cAAMC,IAAI,IAAIC,IAAJ,CAASX,MAAMS,UAAN,GAAmB,IAA5B,CAAV;AACAT,cAAMY,KAAN,GAAe,GAAEC,IAAIH,EAAEI,MAAF,EAAJ,CAAgB,KAAIC,IAAIL,EAAEM,QAAF,EAAJ,EAAkB,CAAlB,CAAqB,IAC1DD,IAAIL,EAAEO,UAAF,EAAJ,EAAoB,CAApB,CAAuB,EADvB;AAEAhC,iBAASe,KAAT;AACAd,qBAAaoB,EAAb;AACD;AACD,UAAIC,aAAatB,MAAjB,EAAyB;AACvBqB,WAAGY,EAAH,CAAM,YAAN,EAAqB/B,IAAD,IAAU;AAC5BD,uBAAaC,IAAb,EAAmB,IAAnB;AACD,SAFD;AAGAD,qBAAaoB,EAAb,EAAiB,IAAjB;AACAC,oBAAY,KAAZ;AACD,OAND,MAMO;AACLrB,qBAAaoB,EAAb,EAAiB,KAAjB;AACD;AACF,KAjBD;AAkBD;AACDa,cAAYX,MAAZ,EAAoB,IAAI,EAAJ,GAAS,IAA7B,EAtB4B,CAsBQ;AACpCA;AACD,CAxBD","file":"brand.js","sourcesContent":["import fs from 'fs';\nimport httpreq from 'httpreq';\nimport Mustache from 'Mustache';\n\nconst URL = 'https://stratum0.org/status/status.json';\nconst TEMPLATES = {\n template: fs.readFileSync('modules/brand/template.mustache', 'utf-8'),\n status: fs.readFileSync('modules/brand/status.mustache', 'utf-8'),\n};\n\nlet status = {};\n\nfunction renderStatus(sock, everything) {\n const sendInner = function() {\n status.random = `${Math.random()}`;\n sock.emit('brand.status', Mustache.render(TEMPLATES.status, status));\n };\n if (everything) {\n sock.emit('brand', Mustache.render(TEMPLATES.template, {}));\n setTimeout(sendInner, 3000);\n } else {\n sendInner();\n }\n}\n\nfunction fetchStatus(cb) {\n httpreq.get(URL, (err, res) => {\n const state = JSON.parse(res.body).state;\n cb(state);\n });\n}\n\nmodule.exports = function(io) {\n let firstTime = true;\n function update() {\n fetchStatus((state) => {\n if (status.lastchange !== state.lastchange) {\n const d = new Date(state.lastchange * 1000);\n state.since = `${DOW[d.getDay()]}, ${pad(d.getHours(), 2)}:${\n pad(d.getMinutes(), 2)}`;\n status = state;\n renderStatus(io);\n }\n if (firstTime && status) {\n io.on('connection', (sock) => {\n renderStatus(sock, true);\n });\n renderStatus(io, true);\n firstTime = false;\n } else {\n renderStatus(io, false);\n }\n });\n }\n setInterval(update, 2 * 60 * 1000); //every 2 minutes\n update();\n};\n"]}
\ No newline at end of file
Space is {{#open}}<span class="open">open</span> on <span class="person">{{trigger_person}}</span>{{/open}}
{{^open}}<span class="closed">closed</span>{{/open}}
<br>since {{since}}
<br>
<img style="width: 470px; height: 310px" src="http://maurudor.de/?rasd={{random}}"></img>
<img src="/modules/brand/stratum0_logo.svg"><br>
<h3 data-infodisplay-outlet="status"></h3>
'use strict';
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _httpreq = require('httpreq');
var _httpreq2 = _interopRequireDefault(_httpreq);
var _mustache = require('mustache');
var _mustache2 = _interopRequireDefault(_mustache);
var _pixlXml = require('pixl-xml');
var _pixlXml2 = _interopRequireDefault(_pixlXml);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/// CONFIG
/* eslint no-mixed-operators: 0 */
const CITY = 'Braunschweig';
const STOPS = ['Ludwigstraße', 'Hamburger Straße'];
const ENTRIES = 6;
/// VARS
let CACHED = [];
const TEMPLATES = {
outer: _fs2.default.readFileSync('modules/bus/outer.mustache', 'utf-8'),
inner: _fs2.default.readFileSync('modules/bus/inner.mustache', 'utf-8')
};
function fetchData(stop, cb) {
const url = `http://62.154.206.87/efaws2/default/XML_DM_REQUEST?sessionID=0&requestID=0&language=de&useRealtime=1&coordOutputFormat=WGS84[DD.ddddd]&locationServerActive=1&mode=direct&dmLineSelectionAll=1&depType=STOPEVENTS&useAllStops=1&command=null&type_dm=stop&name_dm=${CITY} ${stop}&mId=efa_rc2`;
_httpreq2.default.get(url, { binary: true }, (err, res) => {
try {
cb(_pixlXml2.default.parse(res.body));
} catch (e) {
// Swallow
}
});
}
function renderLine(line) {
let image = '';
if (line.charAt(0) === 'M') {
image = 'metro.svg';
line = line.substr(1); // eslint-disable-line
} else if (line.length < 3) {
image = 'tram.svg';
} else {
image = 'bus.svg';
}
return `<img src="/modules/bus/${image}"> ${line}`;
}
function getData(stop, count, cb) {
fetchData(stop, data => {
const deps = data.itdDepartureMonitorRequest.itdDepartureList.itdDeparture;
cb(deps.slice(0, count).map(dep => ({
line: dep.itdServingLine.symbol,
renderedLine: renderLine(dep.itdServingLine.symbol),
dir: dep.itdServingLine.direction.replace(CITY, '').trim(),
platform: dep.platform,
mean: dep.itdServingLine.itdNoTrain.name,
day: pad(dep.itdDateTime.itdDate.day, 2),
month: pad(dep.itdDateTime.itdDate.month, 2),
hour: pad(dep.itdDateTime.itdTime.hour, 2),
minute: pad(dep.itdDateTime.itdTime.minute, 2)
})));
});
}
function update(io, allStopsDoneCb) {
const done = [];
const context = [];
const innerGetData = function (stop, i) {
const ns = normalizeStop(stop);
getData(stop, ENTRIES, deps => {
try {
context[i] = { stop, normalizedStop: ns, deps };
io.emit(`bus.${ns}`, _mustache2.default.render(TEMPLATES.inner, context[i]));
if (done.indexOf(stop) === -1) {
done.push(stop);
if (done.length === STOPS.length) {
allStopsDoneCb();
}
}
CACHED = context;
} catch (e) {
console.log(e); // eslint-disable-line
}
// calculate when to update next
const d = new Date();
const hour = d.getHours();
const minute = d.getMinutes();
const depHour = deps[0].hour < hour ? deps[0].hour + 24 : deps[0].hour;
const diff = (depHour - hour) * 60 + (deps[0].minute - minute);
setTimeout(() => {
innerGetData(stop, i);
}, (diff * 60 + (60 - d.getSeconds()) % 60) * 1000);
});
};
STOPS.forEach((stop, i) => {
innerGetData(stop, i);
});
}
function normalizeStop(stop) {
return stop.replace(/[^a-zA-Z0-9_]/g, '');
}
module.exports = function (io) {
update(io, () => {
const pushToClient = function (sock) {
sock.emit('bus', _mustache2.default.render(TEMPLATES.outer, CACHED));
setTimeout(() => {
for (const i in CACHED) {
// eslint-disable-line
sock.emit(`bus.${CACHED[i].normalizedStop}`, _mustache2.default.render(TEMPLATES.inner, CACHED[i]));
}
}, 3000); //wait a second to let the client process the outlets
};
io.on('connect', pushToClient);
pushToClient(io);
});
};
//# sourceMappingURL=bus.js.map
\ No newline at end of file
{"version":3,"sources":["../src/bus.js"],"names":["CITY","STOPS","ENTRIES","CACHED","TEMPLATES","outer","readFileSync","inner","fetchData","stop","cb","url","get","binary","err","res","parse","body","e","renderLine","line","image","charAt","substr","length","getData","count","data","deps","itdDepartureMonitorRequest","itdDepartureList","itdDeparture","slice","map","dep","itdServingLine","symbol","renderedLine","dir","direction","replace","trim","platform","mean","itdNoTrain","name","day","pad","itdDateTime","itdDate","month","hour","itdTime","minute","update","io","allStopsDoneCb","done","context","innerGetData","i","ns","normalizeStop","normalizedStop","emit","render","indexOf","push","console","log","d","Date","getHours","getMinutes","depHour","diff","setTimeout","getSeconds","forEach","module","exports","pushToClient","sock","on"],"mappings":"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","file":"bus.js","sourcesContent":["/* eslint no-mixed-operators: 0 */\nimport fs from 'fs';\nimport httpreq from 'httpreq';\nimport Mustache from 'mustache';\nimport XML from 'pixl-xml';\n\n/// CONFIG\nconst CITY = 'Braunschweig';\nconst STOPS = ['Ludwigstraße', 'Hamburger Straße'];\nconst ENTRIES = 6;\n\n/// VARS\nlet CACHED = [];\nconst TEMPLATES = {\n outer: fs.readFileSync('modules/bus/outer.mustache', 'utf-8'),\n inner: fs.readFileSync('modules/bus/inner.mustache', 'utf-8'),\n};\n\nfunction fetchData(stop, cb) {\n const url = `http://62.154.206.87/efaws2/default/XML_DM_REQUEST?sessionID=0&requestID=0&language=de&useRealtime=1&coordOutputFormat=WGS84[DD.ddddd]&locationServerActive=1&mode=direct&dmLineSelectionAll=1&depType=STOPEVENTS&useAllStops=1&command=null&type_dm=stop&name_dm=${ CITY } ${ stop }&mId=efa_rc2`;\n httpreq.get(url, { binary: true }, (err, res) => {\n try {\n cb(XML.parse(res.body));\n } catch (e) {\n // Swallow\n }\n });\n}\n\nfunction renderLine(line) {\n let image = '';\n if (line.charAt(0) === 'M') {\n image = 'metro.svg';\n line = line.substr(1); // eslint-disable-line\n } else if (line.length < 3) {\n image = 'tram.svg';\n } else {\n image = 'bus.svg';\n }\n return `<img src=\"/modules/bus/${image}\"> ${line}`;\n}\n\nfunction getData(stop, count, cb) {\n fetchData(stop, (data) => {\n const deps = data.itdDepartureMonitorRequest.itdDepartureList.itdDeparture;\n cb(deps.slice(0, count).map((dep) => ({\n line: dep.itdServingLine.symbol,\n renderedLine: renderLine(dep.itdServingLine.symbol),\n dir: dep.itdServingLine.direction.replace(CITY, '').trim(),\n platform: dep.platform,\n mean: dep.itdServingLine.itdNoTrain.name,\n day: pad(dep.itdDateTime.itdDate.day, 2),\n month: pad(dep.itdDateTime.itdDate.month, 2),\n hour: pad(dep.itdDateTime.itdTime.hour, 2),\n minute: pad(dep.itdDateTime.itdTime.minute, 2),\n })));\n });\n}\n\nfunction update(io, allStopsDoneCb) {\n const done = [];\n const context = [];\n const innerGetData = function(stop, i) {\n const ns = normalizeStop(stop);\n getData(stop, ENTRIES, (deps) => {\n try {\n context[i] = { stop, normalizedStop: ns, deps };\n io.emit(`bus.${ns}`, Mustache.render(TEMPLATES.inner, context[i]));\n if (done.indexOf(stop) === -1) {\n done.push(stop);\n if (done.length === STOPS.length) {\n allStopsDoneCb();\n }\n }\n CACHED = context;\n } catch (e) {\n console.log(e); // eslint-disable-line\n }\n // calculate when to update next\n const d = new Date();\n const hour = d.getHours();\n const minute = d.getMinutes();\n const depHour = deps[0].hour < hour ? deps[0].hour + 24 : deps[0].hour;\n const diff = (depHour - hour) * 60 + (deps[0].minute - minute);\n setTimeout(() => {\n innerGetData(stop, i);\n }, (diff * 60 + (60 - d.getSeconds()) % 60) * 1000);\n });\n };\n STOPS.forEach((stop, i) => {\n innerGetData(stop, i);\n });\n}\n\nfunction normalizeStop(stop) {\n return stop.replace(/[^a-zA-Z0-9_]/g, '');\n}\n\nmodule.exports = function(io) {\n update(io, () => {\n const pushToClient = function(sock) {\n sock.emit('bus', Mustache.render(TEMPLATES.outer, CACHED));\n setTimeout(() => {\n for (const i in CACHED) { // eslint-disable-line\n sock.emit(`bus.${CACHED[i].normalizedStop}`,\n Mustache.render(TEMPLATES.inner, CACHED[i]));\n }\n }, 3000); //wait a second to let the client process the outlets\n };\n io.on('connect', pushToClient);\n pushToClient(io);\n });\n };\n"]}
\ No newline at end of file
<tr>
<th class="title" colspan="4">
<h3><img src="/modules/bus/bsv.svg"> {{stop}}</h3>
</th>
</tr>
<tr>
<th>Time</th>
<th>Line</th>
<th>Pltf</th>
<th>Direction</th>
</tr>
{{#deps}}
<tr>
<td class="time">
<span>{{hour}}:{{minute}}</span>
(<font class="until"></font>)
</td>
<td>{{{renderedLine}}}</td>
<td>{{platform}}</td>
<td>{{dir}}</td>
</tr>
{{/deps}}
<link rel="stylesheet" href="/modules/bus/bus.css">
<script type="text/javascript" src="/modules/bus/bus.js"></script>
<table id="busTable">
<colgroup>
<col width="140px">
<col width="80px">
<col>
<col>
</colgroup>
{{#.}}
<tbody data-infodisplay-outlet="{{normalizedStop}}"></tbody>
{{/.}}
</table>
'use strict';
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _httpreq = require('httpreq');
var _httpreq2 = _interopRequireDefault(_httpreq);
var _ical = require('ical.js');
var _ical2 = _interopRequireDefault(_ical);
var _mustache = require('mustache');
var _mustache2 = _interopRequireDefault(_mustache);
var _time = require('time');
var _time2 = _interopRequireDefault(_time);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const URL = 'https://stratum0.org/kalender/termine.ics'; /* eslint no-mixed-operators: 0 */
const TEMPLATE = _fs2.default.readFileSync('modules/calendar/template.mustache', 'utf-8');
let CALENDAR;
const TZOFFSET = new _time2.default.Date().getTimezoneOffset() * 60;
function getData(count, cb) {
_httpreq2.default.get(URL, (err, res) => {
const ics = res.body.replace(/[0-9]{8}T[0-9]{6}/g, '$&Z');
const cal = new _ical2.default.Component(_ical2.default.parse(ics));
const rawEvents = cal.getAllSubcomponents('vevent').map(raw => new _ical2.default.Event(raw));
const events = [];
const p = function (p) {
return ev.component.getFirstPropertyValue(p);
};
let ev = p;
for (const i in rawEvents) {
// eslint-disable-line
ev = rawEvents[i];
if (ev.isRecurring()) {
const iter = ev.iterator();
const duration = p('dtend').toUnixTime() - p('dtstart').toUnixTime();
for (let i = 0; i < 100; i++) {
const next = iter.next();
if (next === undefined) {
break;
}
const start = next.toUnixTime() + TZOFFSET;
events.push({
title: p('summary'),
start,
end: start + duration
});
}
} else {
events.push({
title: p('summary'),
start: p('dtstart').toUnixTime() + TZOFFSET,
end: p('dtend').toUnixTime() + TZOFFSET
});
}
}
events.sort((a, b) => a.start - b.start);
const threshold = Date.now() / 1000 - 5 * 60 * 60; //show 5 hours ago
let i;
for (i in events) {
if (events[i].end > threshold) {
i = parseInt(i, 10);
break;
}
}
const now = new Date();
cb(events.slice(i, i + count).map(ev => {
const start = new Date(ev.start * 1000);
if (start.getMonth() === now.getMonth() && start.getDate() === now.getDate()) {
ev.startRendered = `${pad(start.getHours(), 2)}:${pad(start.getMinutes(), 2)}`;
} else {
ev.startRendered = `${DOW[start.getDay()]}, ${pad(start.getDate(), 2)}.${pad(start.getMonth() + 1, 2)}. ${pad(start.getHours(), 2)}:${pad(start.getMinutes(), 2)}`;
}
const end = new Date(ev.end * 1000);
if (ev.end - ev.start >= 60 * 60 * 24) {
ev.endRendered = `${DOW[end.getDay()]} ${pad(end.getHours(), 2)}:${pad(end.getMinutes(), 2)}`;
} else {
ev.endRendered = `${pad(end.getHours(), 2)}:${pad(end.getMinutes(), 2)}`;
}
const dur = Math.floor((ev.end - ev.start) / 60);
ev.duration = `${pad(Math.floor(dur / 60), 2)}:${pad(dur % 60, 2)}`;
if (start.getTime() < now.getTime()) {
if (end.getTime() < now.getTime()) {
ev.past = true;
} else {
ev.now = true;
}
}
return ev;
}));
});
}
module.exports = function (io) {
function update(firstRunCallback) {
getData(8, data => {
CALENDAR = data;
io.emit('calendar', _mustache2.default.render(TEMPLATE, CALENDAR));
if (firstRunCallback) {
firstRunCallback();
firstRunCallback = null; // eslint-disable-line
}
});
}
update(() => {
const pushToClients = function (sock) {
sock.emit('calendar', _mustache2.default.render(TEMPLATE, CALENDAR));
};
io.on('connect', pushToClients);
pushToClients(io);
});
setInterval(update, 600000);
};
//# sourceMappingURL=calendar.js.map
\ No newline at end of file
{"version":3,"sources":["../src/calendar.js"],"names":["URL","TEMPLATE","readFileSync","CALENDAR","TZOFFSET","Date","getTimezoneOffset","getData","count","cb","get","err","res","ics","body","replace","cal","Component","parse","rawEvents","getAllSubcomponents","map","raw","Event","events","p","ev","component","getFirstPropertyValue","i","isRecurring","iter","iterator","duration","toUnixTime","next","undefined","start","push","title","end","sort","a","b","threshold","now","parseInt","slice","getMonth","getDate","startRendered","pad","getHours","getMinutes","DOW","getDay","endRendered","dur","Math","floor","getTime","past","module","exports","io","update","firstRunCallback","data","emit","render","pushToClients","sock","on","setInterval"],"mappings":"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","file":"calendar.js","sourcesContent":["/* eslint no-mixed-operators: 0 */\nimport fs from 'fs';\nimport httpreq from 'httpreq';\nimport ical from 'ical.js';\nimport Mustache from 'mustache';\nimport time from 'time';\n\nconst URL = 'https://stratum0.org/kalender/termine.ics';\nconst TEMPLATE = fs.readFileSync('modules/calendar/template.mustache', 'utf-8');\nlet CALENDAR;\n\nconst TZOFFSET = new time.Date().getTimezoneOffset() * 60;\n\n\nfunction getData(count, cb) {\n httpreq.get(URL, (err, res) => {\n const ics = res.body.replace(/[0-9]{8}T[0-9]{6}/g, '$&Z');\n const cal = new ical.Component(ical.parse(ics));\n const rawEvents = cal.getAllSubcomponents('vevent').map((raw) => new ical.Event(raw));\n const events = [];\n const p = function(p) {\n return ev.component.getFirstPropertyValue(p);\n };\n let ev = p;\n for (const i in rawEvents) { // eslint-disable-line\n ev = rawEvents[i];\n if (ev.isRecurring()) {\n const iter = ev.iterator();\n const duration = p('dtend').toUnixTime() - p('dtstart').toUnixTime();\n for (let i = 0; i < 100; i++) {\n const next = iter.next();\n if (next === undefined) {\n break;\n }\n const start = next.toUnixTime() + TZOFFSET;\n events.push({\n title: p('summary'),\n start,\n end: start + duration,\n });\n }\n } else {\n events.push({\n title: p('summary'),\n start: p('dtstart').toUnixTime() + TZOFFSET,\n end: p('dtend').toUnixTime() + TZOFFSET,\n });\n }\n }\n events.sort((a, b) => a.start - b.start);\n const threshold = Date.now() / 1000 - 5 * 60 * 60; //show 5 hours ago\n let i;\n for (i in events) {\n if (events[i].end > threshold) {\n i = parseInt(i, 10);\n break;\n }\n }\n const now = new Date();\n cb(events.slice(i, i + count).map((ev) => {\n const start = new Date(ev.start * 1000);\n if (start.getMonth() === now.getMonth() && start.getDate() === now.getDate()) {\n ev.startRendered = `${pad(start.getHours(), 2)}:${pad(start.getMinutes(), 2)}`;\n } else {\n ev.startRendered = `${DOW[start.getDay()]}, ${pad(start.getDate(), 2)\n }.${pad(start.getMonth() + 1, 2)}. ${pad(start.getHours(), 2)\n }:${pad(start.getMinutes(), 2)}`;\n }\n const end = new Date(ev.end * 1000);\n if (ev.end - ev.start >= 60 * 60 * 24) {\n ev.endRendered = `${DOW[end.getDay()]} ${pad(end.getHours(), 2)\n }:${pad(end.getMinutes(), 2)}`;\n } else {\n ev.endRendered = `${pad(end.getHours(), 2)}:${pad(end.getMinutes(), 2)}`;\n }\n const dur = Math.floor((ev.end - ev.start) / 60);\n ev.duration = `${pad(Math.floor(dur / 60), 2) }:${ pad((dur % 60), 2)}`;\n if (start.getTime() < now.getTime()) {\n if (end.getTime() < now.getTime()) {\n ev.past = true;\n } else {\n ev.now = true;\n }\n }\n return ev;\n }));\n });\n}\n\nmodule.exports = function(io) {\n function update(firstRunCallback) {\n getData(8, (data) => {\n CALENDAR = data;\n io.emit('calendar', Mustache.render(TEMPLATE, CALENDAR));\n if (firstRunCallback) {\n firstRunCallback();\n firstRunCallback = null; // eslint-disable-line\n }\n });\n }\n update(() => {\n const pushToClients = function(sock) {\n sock.emit('calendar', Mustache.render(TEMPLATE, CALENDAR));\n };\n io.on('connect', pushToClients);\n pushToClients(io);\n });\n setInterval(update, 600000);\n};\n"]}
\ No newline at end of file
<h3>Next Events</h3>
{{#.}}
{{#now}}<font color="#2aa198">{{/now}}
{{#past}}<font color="#586e75">{{/past}}
<b>{{title}}{{#now}} (now){{/now}}{{#past}} (over){{/past}}</b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from {{startRendered}} until {{endRendered}} ({{duration}} h)<br>
{{#past}}</font>{{/past}}
{{#now}}</font>{{/now}}
{{/.}}
'use strict';
function date() {
const d = new Date();
return `${DOW[d.getDay()]}, ${pad(d.getDate(), 2)}.${pad(d.getMonth() + 1, 2)}.${d.getFullYear()} ${pad(d.getHours(), 2)}:${pad(d.getMinutes(), 2)}:${pad(d.getSeconds(), 2)}`;
}
module.exports = function (io) {
setInterval(() => {
io.emit('date', `<div align="right"><h2>${date()}&nbsp;</h2></div>`);
}, 1000);
};
//# sourceMappingURL=date.js.map
\ No newline at end of file
{"version":3,"sources":["../src/date.js"],"names":["date","d","Date","DOW","getDay","pad","getDate","getMonth","getFullYear","getHours","getMinutes","getSeconds","module","exports","io","setInterval","emit"],"mappings":";;AAAA,SAASA,IAAT,GAAgB;AACd,QAAMC,IAAI,IAAIC,IAAJ,EAAV;AACA,SAAQ,GAAEC,IAAIF,EAAEG,MAAF,EAAJ,CAAgB,KAAIC,IAAIJ,EAAEK,OAAF,EAAJ,EAAiB,CAAjB,CAAoB,IAAGD,IAAIJ,EAAEM,QAAF,KAAe,CAAnB,EAAsB,CAAtB,CAAyB,IAAGN,EAAEO,WAAF,EAAgB,IAAGH,IAAIJ,EAAEQ,QAAF,EAAJ,EAAkB,CAAlB,CAAqB,IAAGJ,IAAIJ,EAAES,UAAF,EAAJ,EAAoB,CAApB,CAAuB,IAAGL,IAAIJ,EAAEU,UAAF,EAAJ,EAAoB,CAApB,CAAuB,EAA7K;AACD;;AAGDC,OAAOC,OAAP,GAAiB,UAASC,EAAT,EAAa;AAC5BC,cAAY,MAAM;AAChBD,OAAGE,IAAH,CAAQ,MAAR,EAAiB,0BAAyBhB,MAAO,mBAAjD;AACD,GAFD,EAEG,IAFH;AAGD,CAJD","file":"date.js","sourcesContent":["function date() {\n const d = new Date();\n return `${DOW[d.getDay()]}, ${pad(d.getDate(), 2)}.${pad(d.getMonth() + 1, 2)}.${d.getFullYear()} ${pad(d.getHours(), 2)}:${pad(d.getMinutes(), 2)}:${pad(d.getSeconds(), 2)}`;\n}\n\n\nmodule.exports = function(io) {\n setInterval(() => {\n io.emit('date', `<div align=\"right\"><h2>${date()}&nbsp;</h2></div>`);\n }, 1000);\n};\n"]}
\ No newline at end of file
'use strict';
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _httpreq = require('httpreq');
var _httpreq2 = _interopRequireDefault(_httpreq);
var _mustache = require('mustache');
var _mustache2 = _interopRequireDefault(_mustache);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const TEMPLATES = {
main: _fs2.default.readFileSync('modules/diagrams/main.mustache', 'utf-8'),
data: _fs2.default.readFileSync('modules/diagrams/data.mustache', 'utf-8')
};
function fetchData(id, cb) {
const url = `http://shiny.tinyhost.de/php/getdata.php?time=1&id[]=${id}`;
_httpreq2.default.get(url, { binary: true }, (err, res) => {
try {
cb(res.body.toString().split('\n'));
} catch (e) {
// Swallow Error
}
});
}
const DATA = { power: '[]', devices: '[]' };
function handleData(prop, data) {
let line = [];
const out = [];
for (let i = 1; i < data.length - 1; i++) {
line = data[i].split(',');
if (line.length === 2) {
out.push([new Date(line[0]).getTime(), parseFloat(line[1])]);
}
}
DATA[prop] = JSON.stringify(out);
}
function update(cb) {
let counter = 0;
const next = function () {
counter += 1;
if (counter === 2) {
cb();
}
};
fetchData(1, data => {
handleData('power', data);
next();
}); //power
fetchData(4, data => {
handleData('devices', data);
next();
}); //devices
}
module.exports = function (io) {
setInterval(() => {
update(() => {
io.emit('diagrams.data', _mustache2.default.render(TEMPLATES.data, DATA));
});
}, 5000);
io.on('connect', sock => {
sock.emit('diagrams', _mustache2.default.render(TEMPLATES.main, {}));
});
};
//# sourceMappingURL=diagrams.js.map
\ No newline at end of file
{"version":3,"sources":["../src/diagrams.js"],"names":["TEMPLATES","main","readFileSync","data","fetchData","id","cb","url","get","binary","err","res","body","toString","split","e","DATA","power","devices","handleData","prop","line","out","i","length","push","Date","getTime","parseFloat","JSON","stringify","update","counter","next","module","exports","io","setInterval","emit","render","on","sock"],"mappings":";;AAAA;;;;AACA;;;;AACA;;;;;;AAEA,MAAMA,YAAY;AAChBC,QAAM,aAAGC,YAAH,CAAgB,gCAAhB,EAAkD,OAAlD,CADU;AAEhBC,QAAM,aAAGD,YAAH,CAAgB,gCAAhB,EAAkD,OAAlD;AAFU,CAAlB;;AAKA,SAASE,SAAT,CAAmBC,EAAnB,EAAuBC,EAAvB,EAA2B;AACzB,QAAMC,MAAO,wDAAuDF,EAAG,EAAvE;AACA,oBAAQG,GAAR,CAAYD,GAAZ,EAAiB,EAAEE,QAAQ,IAAV,EAAjB,EAAmC,CAACC,GAAD,EAAMC,GAAN,KAAc;AAC/C,QAAI;AACFL,SAAGK,IAAIC,IAAJ,CAASC,QAAT,GAAoBC,KAApB,CAA0B,IAA1B,CAAH;AACD,KAFD,CAEE,OAAOC,CAAP,EAAU;AACV;AACD;AACF,GAND;AAOD;;AAED,MAAMC,OAAO,EAAEC,OAAO,IAAT,EAAeC,SAAS,IAAxB,EAAb;;AAEA,SAASC,UAAT,CAAoBC,IAApB,EAA0BjB,IAA1B,EAAgC;AAC9B,MAAIkB,OAAO,EAAX;AACA,QAAMC,MAAM,EAAZ;AACA,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIpB,KAAKqB,MAAL,GAAc,CAAlC,EAAqCD,GAArC,EAA0C;AACxCF,WAAOlB,KAAKoB,CAAL,EAAQT,KAAR,CAAc,GAAd,CAAP;AACA,QAAIO,KAAKG,MAAL,KAAgB,CAApB,EAAuB;AACrBF,UAAIG,IAAJ,CAAS,CAAE,IAAIC,IAAJ,CAASL,KAAK,CAAL,CAAT,CAAD,CAAoBM,OAApB,EAAD,EAAgCC,WAAWP,KAAK,CAAL,CAAX,CAAhC,CAAT;AACD;AACF;AACDL,OAAKI,IAAL,IAAaS,KAAKC,SAAL,CAAeR,GAAf,CAAb;AACD;;AAED,SAASS,MAAT,CAAgBzB,EAAhB,EAAoB;AAClB,MAAI0B,UAAU,CAAd;AACA,QAAMC,OAAO,YAAW;AACtBD,eAAW,CAAX;AACA,QAAIA,YAAY,CAAhB,EAAmB;AACjB1B;AACD;AACF,GALD;AAMAF,YAAU,CAAV,EAAcD,IAAD,IAAU;AACrBgB,eAAW,OAAX,EAAoBhB,IAApB;AACA8B;AACD,GAHD,EARkB,CAWd;AACJ7B,YAAU,CAAV,EAAcD,IAAD,IAAU;AACrBgB,eAAW,SAAX,EAAsBhB,IAAtB;AACA8B;AACD,GAHD,EAZkB,CAed;AACL;;AAEDC,OAAOC,OAAP,GAAiB,UAASC,EAAT,EAAa;AAC5BC,cAAY,MAAM;AAChBN,WAAO,MAAM;AACXK,SAAGE,IAAH,CAAQ,eAAR,EAAyB,mBAASC,MAAT,CAAgBvC,UAAUG,IAA1B,EAAgCa,IAAhC,CAAzB;AACD,KAFD;AAGD,GAJD,EAIG,IAJH;AAKAoB,KAAGI,EAAH,CAAM,SAAN,EAAkBC,IAAD,IAAU;AACzBA,SAAKH,IAAL,CAAU,UAAV,EAAsB,mBAASC,MAAT,CAAgBvC,UAAUC,IAA1B,EAAgC,EAAhC,CAAtB;AACD,GAFD;AAGD,CATD","file":"diagrams.js","sourcesContent":["import fs from 'fs';\nimport httpreq from 'httpreq';\nimport Mustache from 'mustache';\n\nconst TEMPLATES = {\n main: fs.readFileSync('modules/diagrams/main.mustache', 'utf-8'),\n data: fs.readFileSync('modules/diagrams/data.mustache', 'utf-8'),\n};\n\nfunction fetchData(id, cb) {\n const url = `http://shiny.tinyhost.de/php/getdata.php?time=1&id[]=${id}`;\n httpreq.get(url, { binary: true }, (err, res) => {\n try {\n cb(res.body.toString().split('\\n'));\n } catch (e) {\n // Swallow Error\n }\n });\n}\n\nconst DATA = { power: '[]', devices: '[]' };\n\nfunction handleData(prop, data) {\n let line = [];\n const out = [];\n for (let i = 1; i < data.length - 1; i++) {\n line = data[i].split(',');\n if (line.length === 2) {\n out.push([(new Date(line[0])).getTime(), parseFloat(line[1])]);\n }\n }\n DATA[prop] = JSON.stringify(out);\n}\n\nfunction update(cb) {\n let counter = 0;\n const next = function() {\n counter += 1;\n if (counter === 2) {\n cb();\n }\n };\n fetchData(1, (data) => {\n handleData('power', data);\n next();\n }); //power\n fetchData(4, (data) => {\n handleData('devices', data);\n next();\n }); //devices\n}\n\nmodule.exports = function(io) {\n setInterval(() => {\n update(() => {\n io.emit('diagrams.data', Mustache.render(TEMPLATES.data, DATA));\n });\n }, 5000);\n io.on('connect', (sock) => {\n sock.emit('diagrams', Mustache.render(TEMPLATES.main, {}));\n });\n};\n"]}
\ No newline at end of file
<script>
var power = {{power}};
var devices = {{devices}};
$.plot("#diagrams-container", [
{ data: power, label: "Power consumption (W)", color: '#b58900' },
{ data: devices, label: "Network devices", yaxis: 2, color: '#268bd2' }
], {
xaxes: [ { mode: "time" } ],
yaxes: [ { min: 0 }, {
alignTicksWithAxis: 0,
position: 'right',
min: 0
} ],
legend: { position: "sw", backgroundColor: '#eee8d5' }
});
</script>
<h3>Power consumption<span style="float: right">Network devices&nbsp;&nbsp;</span></h3>
<span style="display: none" data-infodisplay-outlet="data"></span>
<div id="diagrams-container" style="height: 90%; width: 96%"></div>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment