From f5fca88cd06c738744fe718748908139e57e5af1 Mon Sep 17 00:00:00 2001 From: Noah Prail Date: Fri, 8 Jun 2018 11:07:24 -0400 Subject: [PATCH] added slack event listener - #4 --- package-lock.json | 134 +++++++++++++++++++++++++++++---------- package.json | 2 + server/app.js | 3 + server/config/config.js | 5 +- server/config/express.js | 3 + server/config/slack.js | 21 ++++++ 6 files changed, 135 insertions(+), 33 deletions(-) create mode 100644 server/config/slack.js diff --git a/package-lock.json b/package-lock.json index 7872d9e..a4005bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -321,6 +321,18 @@ "envify": "^4.1.0" } }, + "@slack/events-api": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@slack/events-api/-/events-api-1.0.1.tgz", + "integrity": "sha1-vg0u0ux1JmZH8fg9T8AswOwygs8=", + "requires": { + "body-parser": "^1.4.3", + "debug": "^2.6.1", + "express": "^4.0.0", + "lodash.isstring": "^4.0.1", + "yargs": "^6.6.0" + } + }, "@types/async": { "version": "2.0.49", "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.49.tgz", @@ -846,20 +858,35 @@ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } } }, "boom": { @@ -2092,6 +2119,57 @@ "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -4675,36 +4753,23 @@ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" } } }, @@ -5094,6 +5159,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "scmp": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/scmp/-/scmp-0.0.3.tgz", diff --git a/package.json b/package.json index 5085505..69258c5 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "author": "Filiosoft Open Source ", "license": "MIT", "dependencies": { + "@slack/events-api": "^1.0.1", + "body-parser": "^1.18.3", "botkit": "^0.6.14", "cookie-session": "^2.0.0-beta.3", "dotenv": "^5.0.1", diff --git a/server/app.js b/server/app.js index 71fb300..a009816 100644 --- a/server/app.js +++ b/server/app.js @@ -14,6 +14,9 @@ require('./config/mongo')(config) // configure passport require('./config/passport')(app, config) +// configure slack +require('./config/slack')(app, config) + // configure routes require('./routes')(app, config) diff --git a/server/config/config.js b/server/config/config.js index fa6e509..6ead83f 100644 --- a/server/config/config.js +++ b/server/config/config.js @@ -6,7 +6,10 @@ const config = { gitlabAppId: process.env.GITLAB_APP_ID, gitlabAppSecret: process.env.GITLAB_APP_SECRET, baseUrl: process.env.BASE_URL || 'http://localhost:3000', - dbUri: process.env.MONGODB_URI || 'mongodb://localhost:27017/glib' + dbUri: process.env.MONGODB_URI || 'mongodb://localhost:27017/glib', + slack: { + verificationToken: process.env.SLACK_VERIFICATION_TOKEN + } } module.exports = config diff --git a/server/config/express.js b/server/config/express.js index 718e100..c247407 100644 --- a/server/config/express.js +++ b/server/config/express.js @@ -1,5 +1,6 @@ const cookieSession = require('cookie-session') const exphbs = require('express-handlebars') +const bodyParser = require('body-parser') module.exports = (app, config) => { app.engine( @@ -11,6 +12,8 @@ module.exports = (app, config) => { ) app.set('view engine', '.hbs') + // You must use a body parser for JSON before mounting the adapter + app.use(bodyParser.json()) // cookieSession config app.use( cookieSession({ diff --git a/server/config/slack.js b/server/config/slack.js new file mode 100644 index 0000000..76edace --- /dev/null +++ b/server/config/slack.js @@ -0,0 +1,21 @@ +const sea = require('@slack/events-api') + +module.exports = (app, config) => { + const slackEvents = sea.createSlackEventAdapter( + config.slack.verificationToken + ) + + app.use('/slack/events', slackEvents.expressMiddleware()) + + // Attach listeners to events by Slack Event "type". See: https://api.slack.com/events/message.im + slackEvents.on('message', event => { + console.log( + `Received a message event: user ${event.user} in channel ${ + event.channel + } says ${event.text}` + ) + }) + + // Handle errors (see `errorCodes` export) + slackEvents.on('error', console.error) +}