From 70da572dafe69027e2a2b09a19975bf303676c07 Mon Sep 17 00:00:00 2001 From: Jasper Mishrs Date: Sun, 5 Jul 2015 23:10:32 -0700 Subject: [PATCH] server configured to receive wolfram alpha api data --- README.md | 1 + apiServer.js | 34 ++++++++++++++++++++++++++ app.js | 5 ++++ config.js | 5 ++++ package.json | 22 +++++++++++++++++ wolframBot.js | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ wolframParser.js | 8 +++++++ 7 files changed, 137 insertions(+) create mode 100644 README.md create mode 100644 apiServer.js create mode 100644 app.js create mode 100644 config.js create mode 100644 package.json create mode 100644 wolframBot.js create mode 100644 wolframParser.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..a15576c --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Slack with Wolfram|Alpha integration \ No newline at end of file diff --git a/apiServer.js b/apiServer.js new file mode 100644 index 0000000..7ed948e --- /dev/null +++ b/apiServer.js @@ -0,0 +1,34 @@ +let express = require('express'); +let fs = require('fs'); +let config = require('./config'); +let bodyParser = require('body-parser'); +let morgan = require('morgan'); +let wolframBot = require('./wolframBot'); + +module.exports = function(){ + let app = express(); + let port = process.env.PORT || config.get('port'); + + // body parser middleware + app.use(bodyParser.urlencoded({ extended: true })); + app.use(morgan('dev')); + + app.use('/',router()); + + let server = app.listen(port, function () { + console.log('Slack-Wolfram|Alpha listening on port ' + port); + }); + + process.on('SIGINT', function() { + server.close(); + process.exit(); + }); + + function router(){ + var expressRouter = express.Router(); + expressRouter.post('/wolframBot', wolframBot); + return expressRouter; + + } + +}; \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..7988a16 --- /dev/null +++ b/app.js @@ -0,0 +1,5 @@ +require('babel/register')({ + optional: ['runtime', 'es7.asyncFunctions'] +}); +var apiServer = require('./apiServer'); +apiServer(); \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..3532731 --- /dev/null +++ b/config.js @@ -0,0 +1,5 @@ +let nconf = require('nconf'); +nconf.argv() + .env() + .file({ file: './config.json' }); +module.exports = nconf; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..6e6b85c --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "slack-wolfram-alpha", + "version": "1.0.0", + "description": "Slack with Wolfram|Alpha", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Jasper Mishra (https://www.linkedin.com/profile/view?id=168344449)", + "license": "ISC", + "dependencies": { + "babel": "^5.6.14", + "babel-runtime": "^5.6.15", + "bluebird": "^2.9.30", + "body-parser": "^1.13.1", + "express": "^4.13.0", + "lodash": "^3.10.0", + "morgan": "^1.6.0", + "nconf": "^0.7.1", + "xml2js": "^0.4.9" + } +} diff --git a/wolframBot.js b/wolframBot.js new file mode 100644 index 0000000..3073537 --- /dev/null +++ b/wolframBot.js @@ -0,0 +1,62 @@ +let config = require('./config'); +let _ = require('lodash'); +let Promise = require('bluebird'); +let http = require('http'); +let qs = require('querystring'); +let parseString = require('xml2js').parseString; +let wolframParser = require('./wolframParser'); + +module.exports = function(req, res, next){ + let triggerWord = req.body.trigger_word; + + if(config.get('username') !== req.body.user_name){ + return res.status(400).send('bad username').end(); + } + console.log('config triggerWords', config.get('triggerWords').length); + if(_.indexOf(config.get('triggerWords'), triggerWord) === -1){ + return res.status(400).send('bad triggerWord').end(); + } + + let text = req.body.text; + let equation = text.substr(text.indexOf(' ')+1); + let queryString = qs.stringify({ + input:equation, + appid:config.get('appid') + }); + + getWolframRest(queryString).then(response => { + parseString(response, (err, parsedJson) => { + res.status(200).send(parsedJson); + }); + }); + + function getWolframRest(queryString){ + return new Promise((resolve, reject) => { + let options = { + host:config.get('host'), + path:config.get('path')+queryString, + method:'GET' + }; + let wolframReq = http.request(options, wolframRes => { + let str = ''; + wolframRes.on('data', function (chunk) { + str += chunk; + }); + wolframRes.on('error', wolframError => { + reject(error); + }); + + wolframRes.on('end', () => { + resolve(str); + }); + + }); + wolframReq.on('error', function (e) { + reject(e); + }); + wolframReq.end(); + + }); + + } +} \ No newline at end of file diff --git a/wolframParser.js b/wolframParser.js new file mode 100644 index 0000000..f462f59 --- /dev/null +++ b/wolframParser.js @@ -0,0 +1,8 @@ +module.exports = function(req, res){ + // let json = req.apiResponse; + // console.log('json -->', json); + // res.status(200).send({a:'a'}); + // res.status(200).send({b:'b'}); + // res.status(200).send({c:'c'}); + // res.end(); +} \ No newline at end of file