diff --git a/README.md b/README.md index a6ca02a..6d0402e 100644 --- a/README.md +++ b/README.md @@ -106,3 +106,11 @@ slack.send('chat.postMessage', message).then(data => { // respond to webhooks slack.send('https://hooks.slack.com/services/T0000/B000/XXXX', message); ``` +You can also respond to events directly without an API call using the callback method. This is useful if you need the `in_channel` response type to show the users slash command too. +```js +// Example for a command that takes a name eg: /greet Bob +slack.on('/greet', msg => slack.callback({ + response_type: 'in_channel', + text: `Hey there ${msg.text}!` +})) +``` diff --git a/src/client.js b/src/client.js index a3f6223..0ca08b0 100644 --- a/src/client.js +++ b/src/client.js @@ -127,7 +127,12 @@ class Client { message = Object.assign({ token: this.token, channel: this.channel }, message); // convert json except when passing in a url - if (!endPoint.match(/^http/i)) message = qs.stringify(message); + if (!endPoint.match(/^http/i)) { + if (message.attachments) { + message.attachments = JSON.stringify(message.attachments).replace(/^'(.*)'$/, '$1'); + } + message = qs.stringify(message); + } return this.api.post(endPoint, message).then(this.getData); } @@ -209,4 +214,4 @@ class Client { } -module.exports = Client; \ No newline at end of file +module.exports = Client; diff --git a/src/index.js b/src/index.js index bdf70b6..c501bfb 100644 --- a/src/index.js +++ b/src/index.js @@ -20,7 +20,8 @@ class Slack extends EventEmitter { * @param {Object} context - The Lambda context * @param {Function} callback - The Lambda callback */ - handler(event, context, callback) { + handler(event, context, callback) { + this.callbackFn = callback; switch(event.method) { case "GET": this.oauth(event, context, callback); break; case "POST": this.event(event, context, callback); break; @@ -28,6 +29,16 @@ class Slack extends EventEmitter { } + /** + * Allow event handlers to use the callback early + * + * @param {Object} response A response object or string + */ + callback(response) { + if (this.callbackFn) this.callbackFn(null, JSON.stringify(response)); + } + + /** * OAuth Lambda Handler * @@ -88,8 +99,6 @@ class Slack extends EventEmitter { // Events API challenge if (payload.challenge) return callback(null, payload.challenge); - else - callback(); // Ignore Bot Messages if (!this.ignoreBots || !(payload.event || payload).bot_id) { @@ -129,4 +138,4 @@ class Slack extends EventEmitter { } -module.exports = new Slack(); \ No newline at end of file +module.exports = new Slack();