freifunk-bot

Modular parser for the hackerspace door status with handlers for multiple services
git clone git://archive.git.mtrnord.blog/MTRNord/freifunk-bot.git
Log | Files | Refs | README | LICENSE

commit dee65a1d8755d31afe36a52d17feb0969b1e6658
parent 941ef2fe5575b30f0a744fb034523df7ac213aa2
Author: Marcel <MTRNord@users.noreply.github.com>
Date:   Sun, 11 Sep 2016 20:23:17 +0200

Merge pull request #12 from MTRNord/v0.0.2

Add function node
Diffstat:
Dhandlers/getNodes.js | 121-------------------------------------------------------------------------------
Mhandlers/irc.js | 33++++++++++++++++++++++++++-------
Ahandlers/parseNodes.js | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mhandlers/pushbullet.js | 2+-
Mhandlers/telegram.js | 29++++++++++++++++++++++++-----
Mmain.js | 5+++--
6 files changed, 252 insertions(+), 136 deletions(-)

diff --git a/handlers/getNodes.js b/handlers/getNodes.js @@ -1,121 +0,0 @@ -/** - * NodeHelper Module - * - * @module Main - * @class getNodes - * @submodule getNodes - * @author Marcel Radzio - */ -//Load needed Features -var request = require('request') -//require('request-debug')(request); -var fs = require('fs'); -var jsonfile = require('jsonfile') -var slack = require('./slack.js'); -var _ = require("lodash"); -/** - * Get Community Config at start - * - * @property communities - * @type String - */ -module.exports = { - saveNodes: function () { - request.get('https://cdn.rawgit.com/MTRNord/gluon-web-remote/5bd3a914b3c15af70b3ce46b3bfcc16bbc7b89b5/configs/communities.json', function (err, res, body) { - - if (!err && res.statusCode === 200) { - /** - * Content of communities - * - * @property communities - * @type String - */ - communities = body; - if (!fs.existsSync("handlers/tmp")){ - fs.mkdirSync("handlers/tmp"); - } - fs.writeFile("handlers/tmp/communities.json", communities, { flag: 'w' }, function(err) { - if(err) { - console.log(err); - return err - } - }); - }else{ - /** - * Fired when an error occurs... - * - * @property error - * @type String - */ - //TODO Add real Error Handler - console.log(err); - return err - } - }) - }, - countNodes: function (ccode_func, handler, TfromId, Tmsg, channel, bot, botan, IRCto) { - jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { - if (err) { - return console.log(err); - } - var communities = obj - _.find(communities.communities, function (key) { - var ccode = key["ccode"]; - if (ccode.toLowerCase() == ccode_func.toLowerCase()) { - var nodesFile_link = key["nodesURL"]; - var name = key["name"]; - request.get(nodesFile_link, function (err, res, body) { - if (!err && res.statusCode == 200) { - /** - * Content of communities - * - * @property communities - * @type String - */ - // console.log(body); - // onlineNodes = body.nodes.length - // onlineNodes = Object.keys(body.nodes).length; - var count = 0; - nodes = JSON.parse(body) - _.find(nodes.nodes, function (key) { - if (key.hasOwnProperty('flags')) { - if (key["flags"]["online"] == true) { - count++; - } - } - if (key.hasOwnProperty('status')) { - if (key["status"]["online"] == true) { - count++; - } - } - }); - var output = "Current nodes in " + name + ": " + count - if(handler == "telegram"){ - bot.sendMessage(TfromId, output) - botan.track(Tmsg, 'nodes ' + ccode_func) - }else { - if(handler == "irc"){ - bot.say(IRCto, output); - }else { - if(handler == "slack"){ - slack.slackSend(Schannel, output); - } - } - } - }else{ - /** - * Fired when an error occurs... - * - * @property error - * @type String - */ - //TODO Add real Error Handler - console.log(err); - return err - } - }) - } - }); - }); - } -} diff --git a/handlers/irc.js b/handlers/irc.js @@ -18,7 +18,7 @@ var rl = require("readline") var command_config = require("../configs/commands.json"); var params_config = require("../configs/ircServer.json"); -var getNodes = require('./getNodes.js'); +var getNodes = require('./parseNodes.js'); //Set Params /** @@ -80,7 +80,7 @@ _.find(params_config["servers"], function (key) { autoConnect: false, messageSplit: 1000000, floodProtection: true, - floodProtectionDelay: 1000 + floodProtectionDelay: 200 }); clients.push(bot[key]); } @@ -287,7 +287,7 @@ module.exports = { nodes: function (callback) { if (S(message).contains("!nodes")) { jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { - if (err) {console.log(err)} + if (err) {throw new Error(err);} var communities = obj _.find(communities.communities, function (key) { var ccode = key["ccode"]; @@ -300,10 +300,29 @@ module.exports = { }); } }, + node: function (callback) { + if (S(message).contains("!node") || !S(message).contains("!nodes")) { + jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { + if (err) {throw new Error(err);} + var communities = obj + _.find(communities.communities, function (key) { + var ccode = key["ccode"]; + if (ccode.toLowerCase() === channel[1]) { + clients.forEach(function(client) { + if (channel[2] == undefined) { + channel[2] = "NoArg" + } + getNodes.NodeInfo(channel[1], channel[2].toLowerCase(), "irc", "", "", "", client, "", from) + }); + } + }); + }); + } + }, communities: function (callback) { if (S(message).contains("!communities")) { jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { - if (err) {console.log(err)} + if (err) {throw new Error(err);} var communities = obj var communities_list = "" _.find(communities.communities, function (key) { @@ -334,7 +353,7 @@ module.exports = { * @type String */ door_status = error; - console.log(error); + throw new Error(err); } if (!error && response.statusCode === 200) { if (door_status === "geschlossen") { @@ -370,7 +389,7 @@ module.exports = { * @type String */ door_status = error; - console.log(error); + throw new Error(err); } if (!error && response.statusCode == 200) { if (door_status === "geschlossen") { @@ -431,7 +450,7 @@ module.exports = { }, function(err, result) { if (err) { - console.log(err) + throw new Error(err); } } ); diff --git a/handlers/parseNodes.js b/handlers/parseNodes.js @@ -0,0 +1,198 @@ +/** + * NodeHelper Module + * + * @module Main + * @class getNodes + * @submodule getNodes + * @author Marcel Radzio + */ +//Load needed Features +var request = require('request') +//require('request-debug')(request); +var fs = require('fs'); +var jsonfile = require('jsonfile') +var slack = require('./slack.js'); +var _ = require("lodash"); +/** + * Get Community Config at start + * + * @property communities + * @type String + */ +module.exports = { + saveNodes: function () { + request.get('https://cdn.rawgit.com/MTRNord/gluon-web-remote/5bd3a914b3c15af70b3ce46b3bfcc16bbc7b89b5/configs/communities.json', function (err, res, body) { + if (!err && res.statusCode === 200) { + /** + * Content of communities + * + * @property communities + * @type String + */ + communities = body; + if (!fs.existsSync("handlers/tmp")){ + fs.mkdirSync("handlers/tmp"); + } + fs.writeFile("handlers/tmp/communities.json", communities, { flag: 'w' }, function(err) { + if(err) { + console.log(err); + return err + } + }); + }else{ + /** + * Fired when an error occurs... + * + * @property error + * @type String + */ + //TODO Add real Error Handler + console.log(err); + return err + } + }) + }, + countNodes: function (ccode_func, handler, TfromId, Tmsg, channel, bot, botan, IRCto) { + jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { + if (err) { + return console.log(err); + } + var communities = obj + _.find(communities.communities, function (key) { + var ccode = key["ccode"]; + if (ccode.toLowerCase() == ccode_func.toLowerCase()) { + var nodesFile_link = key["nodesURL"]; + var name = key["name"]; + request.get(nodesFile_link, function (err, res, body) { + if (!err && res.statusCode == 200) { + /** + * Content of communities + * + * @property communities + * @type String + */ + var count = 0; + nodes = JSON.parse(body) + _.find(nodes.nodes, function (key) { + if (key.hasOwnProperty('flags')) { + if (key["flags"]["online"] == true) { + count++; + } + } + if (key.hasOwnProperty('status')) { + if (key["status"]["online"] == true) { + count++; + } + } + }); + var output = "Current nodes in " + name + ": " + count + if(handler == "telegram"){ + bot.sendMessage(TfromId, output) + botan.track(Tmsg, 'nodes ' + ccode_func) + }else { + if(handler == "irc"){ + bot.say(IRCto, output); + }else { + if(handler == "slack"){ + slack.slackSend(Schannel, output); + } + } + } + }else{ + /** + * Fired when an error occurs... + * + * @property error + * @type String + */ + //TODO Add real Error Handler + throw new Error(err); + } + }) + } + }); + }); + }, + NodeInfo: function (ccode_func, askedNode, handler, TfromId, Tmsg, channel, bot, botan, IRCto) { + jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { + if (err) { + throw new Error(err); + } + var communities = obj + _.find(communities.communities, function (key) { + var ccode = key["ccode"]; + if (ccode.toLowerCase() == ccode_func.toLowerCase()) { + var nodesFile_link = key["nodesURL"]; + request.get(nodesFile_link, function (err, res, body) { + if (!err && res.statusCode == 200) { + /** + * Content of communities + * + * @property communities + * @type String + */ + var count = 0; + nodes = JSON.parse(body) + var output = "Some error" + var name = "" + var router = "" + var version = "" + var autoupdate = "" + var autoupdateBranch = "" + var clients = "" + var status = "" + var since = "" + _.find(nodes.nodes, function (key) { + name = key["nodeinfo"]["hostname"] + if (name.toLowerCase() == askedNode.toLowerCase()){ + router = key["nodeinfo"]["hardware"]["model"] + version = key["nodeinfo"]["software"]["firmware"]["release"] + autoupdate = key["nodeinfo"]["software"]["autoupdater"]["enabled"] + if (autoupdate === true) { + autoupdate = "active" + }else{ + autoupdate = "unactive" + } + autoupdateBranch = key["nodeinfo"]["software"]["autoupdater"]["branch"] + clients = key["statistics"]["clients"] + status = key["flags"]["online"] + since = key["firstseen"] + if(handler == "telegram"){ + output = "<b>Name: </b>" + name + "\n<b>Router Model: </b>" + router + "\n<b>Firmware Version: </b>" + version + "\n<b>Autoupdater Status: </b>" + autoupdate + "\n<b>Autoupdater Branch: </b>" + autoupdateBranch + "\n<b>Clients Connected: </b>" + clients + "\n<b>Online Status: </b>" + status + "\n<b>First Seen: </b>" + since + } + if(handler == "irc"){ + output = "Name: " + name + "\nRouter Model: " + router + "\nFirmware Version: " + version + "\nAutoupdater Status: " + autoupdate + "\nAutoupdater Branch: " + autoupdateBranch + "\nClients Connected: " + clients + "\nOnline Status: " + status + "\nFirst Seen: " + since + } + if(handler == "slack"){ + output = "<b>Name: </b>" + name + "\n<b>Router Model: </b>" + router + "\n<b>Firmware Version: </b>" + version + "\n<b>Autoupdater Status: </b>" + autoupdate + "\n<b>Autoupdater Branch: </b>" + autoupdateBranch + "\n<b>Clients Connected: </b>" + clients + "\n<b>Online Status: </b>" + status + "\n<b>First Seen: </b>" + since + } + } + }); + if (askedNode.toLowerCase() !== "noarg") { + if(handler == "telegram"){ + bot.sendMessage(TfromId, output, {"parse_mode": "HTML"}) + botan.track(Tmsg, 'node ' + ccode_func) + } + if(handler == "irc"){ + bot.say(IRCto, output); + } + if(handler == "slack"){ + slack.slackSend(Schannel, output); + } + } + }else{ + /** + * Fired when an error occurs... + * + * @property error + * @type String + */ + //TODO Add real Error Handler + throw new Error(err); + } + }) + } + }); + }); + } +} diff --git a/handlers/pushbullet.js b/handlers/pushbullet.js @@ -28,7 +28,7 @@ module.exports = { * @property err * @type String */ - console.log(err); + throw new Error(err) } }); } diff --git a/handlers/telegram.js b/handlers/telegram.js @@ -8,7 +8,7 @@ if (typeof botan_token === 'undefined' && !botan_token) { } var TelegramBot = require('node-telegram-bot-api'); var jsonfile = require('jsonfile') -var getNodes = require('./getNodes.js'); +var getNodes = require('./parseNodes.js'); var botan = require('botanio')(botan_token); var util = require('util'); var async = require("async"); @@ -24,7 +24,7 @@ module.exports = { var resp = match[1]; bot.sendChatAction(fromId, "typing") jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { - if (err) {console.log(err)} + if (err) {throw new Error(err);} var communities = obj _.find(communities.communities, function (key) { var ccode = key["ccode"]; @@ -36,6 +36,25 @@ module.exports = { }); callback() }, + node: function (callback) { + bot.onText(/\/node (.+)/, function (msg, match) { + var fromId = msg.chat.id; + var resp = match[1]; + var args = _.split(resp, ' '); + bot.sendChatAction(fromId, "typing") + jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { + if (err) {throw new Error(err);} + var communities = obj + _.find(communities.communities, function (key) { + var ccode = key["ccode"]; + if (ccode.toLowerCase() === args[0].toLowerCase()) { + getNodes.NodeInfo(args[0].toLowerCase(), args[1].toLowerCase(), "telegram", fromId, msg, "", bot, botan) + } + }); + }); + }); + callback() + }, communities: function (callback) { bot.onText(/\/communities/, function (msg, match) { var fromId = msg.chat.id; @@ -43,7 +62,7 @@ module.exports = { bot.sendChatAction(fromId, "typing") jsonfile.readFile('handlers/tmp/communities.json', 'utf8', function (err,obj) { var communities = obj - var communities_list + var communities_list = "" _.find(communities.communities, function (key) { var ccode = key["ccode"] var name = key["name"] @@ -51,7 +70,7 @@ module.exports = { }); botan.track(msg, 'communities', function (err, res, body) { if (err) { - console.log("[BOTAN] ERR: " + err); + throw new Error("[BOTAN] ERR: " + err); } console.log("[BOTAN] RES: " + res.statusCode); console.log("[BOTAN] BODY: " + util.inspect(body, {showHidden: false, depth: null})); @@ -64,7 +83,7 @@ module.exports = { }, function(err, result) { if (err) { - console.log(err) + throw new Error(err) } } ); diff --git a/main.js b/main.js @@ -21,7 +21,7 @@ require('./helper/heroku.js'); var pushbullet = require('./handlers/pushbullet.js'); var irc = require('./handlers/irc.js'); var slack = require('./handlers/slack.js'); -var getNodes = require('./handlers/getNodes.js'); +var getNodes = require('./handlers/parseNodes.js'); var telegram = require('./handlers/telegram.js'); //Constants @@ -60,6 +60,7 @@ function GetData(){ */ //TODO Add real Error Handler door_status = error; + throw new Error(err) } //If no error -> go on if (!error && response.statusCode === 200) { @@ -119,7 +120,7 @@ process.on(SIGINT, function () { */ function update(){ git.pull("origin", "master", function(err, update) { - if (err) {console.log(err)} + if (err) {throw new Error(err)} if(update && update.summary.changes) { console.log('Start Update!'); restart();