prisme-flow
Version:
prisme platform flow engine
208 lines (185 loc) • 5.58 kB
JavaScript
/**
* Created by prisme.io on 09/06/2017.
*/
var _ = require('underscore')
var SmoochCore = require('smooch-core')
var fs = require('fs')
var os = require('os')
var request = require('request').defaults({ encoding: null })
var https = require('https')
var http = require('http')
function SmoochBot (opts) {
var options = _.extend({
keyId: null,
secret: null
}, opts)
var _events = {}
// using app token
var smoochCore = new SmoochCore({
keyId: options.keyId,
secret: options.secret,
scope: 'app'
})
var api = {
on: function (eventName, callback) {
if (_events[eventName] == null) {
_events[eventName] = []
}
_events[eventName].push(callback)
},
emit: function (eventName, obj) {
if (_events[eventName] != null) {
_events[eventName].forEach(function (callback) {
callback(obj)
})
}
},
sendMessage: function (chatId, text, handleError) {
smoochCore.appUsers.sendMessage(chatId, {
text: text,
role: 'appMaker'
}).then(function (result) {
// do nothing
}).catch(function (err) {
handleError(err)
})
},
/**
* @method sendActions
* Send actions buttons
*/
sendActions: function (chatId, text, actions) {
return new Promise(function (resolve, reject) {
var objs = _(actions).map(function (action) {
var obj = null
if (!_.isEmpty(action.url)) {
obj = {
type: 'link',
text: action.label,
uri: action.url
}
} else {
obj = {
type: 'reply',
text: action.label,
payload: action.value
}
if (!_.isEmpty(action.image_url)) {
obj.iconUrl = action.image_url
}
}
return obj
})
smoochCore.appUsers.sendMessage(chatId, {
text: text,
actions: objs,
role: 'appMaker'
}).then(function () {
resolve()
}).catch(function () {
reject('Error sending inline buttons to Smooch. Only one URL button at a time can be sent to Smooch (Redirect URL).')
})
})
},
uploadBuffer: function (chatId, buffer, params) {
return new Promise(function (resolve, reject) {
params = _.extend({
recipient: null,
filename: 'tmp-file',
token: null,
buffer: null,
type: 'image'
}, params)
var tmpFile = os.tmpdir() + '/' + params.filename
// write to filesystem to use stream
fs.writeFile(tmpFile, buffer, function (err) {
if (err) {
reject(err)
} else {
// prepare payload
var filedata = null
var name = ''
switch (params.type) {
case 'image':
name = 'image.mp3'
filedata = {
value: fs.createReadStream(tmpFile),
options: {
filename: params.filename,
contentType: 'image/png' // fix extension
}
}
break
case 'audio':
name = 'audio.mp3'
filedata = {
value: fs.createReadStream(tmpFile),
options: {
filename: params.filename,
contentType: 'audio/mp3'
}
}
break
}
// upload and send
var formData = {
role: 'appMaker',
name: name,
source: filedata
}
request.post({
url: 'https://api.smooch.io/v1/appusers/' + chatId + '/images',
headers: {
'Authorization': smoochCore.authHeaders.Authorization,
'Content-Type': 'application/json'
},
formData: formData
}, function (err, response, body) {
if (err) {
reject(err)
} else {
resolve()
}
})
}
}) // end writeFile
})
},
addExpressMiddleware: function (express) {
express.post('/redbot/smooch', function (req, res) {
// todo should check for secret
if (req.body.trigger === 'message:appUser') {
req.body.messages.forEach(function (message) {
api.emit('message', message)
})
} else if (req.body.trigger === 'postback') {
req.body.postbacks.forEach(function (postback) {
// mimic a message on receiving a postback
api.emit('message', {
text: postback.action.payload,
role: 'appUser',
received: postback.message.received,
authorId: req.body.appUser._id,
_id: postback.message._id,
source: postback.message.source,
items: [],
actions: []
})
})
}
res.send({status: 'ok'})
})
},
removeExpressMiddleware: function (express) {
var endpoints = ['/smooch']
// remove middleware endpoints
express._router.stack.forEach(function (route, i, routes) {
if (route.route && _.contains(endpoints, route.route.path)) {
routes.splice(i, 1)
}
})
}
}
return api
};
module.exports = SmoochBot