UNPKG

prisme-flow

Version:

prisme platform flow engine

134 lines (124 loc) 4.4 kB
/** * Created by prisme.io on 09/06/2017. */ var _ = require('underscore') var fs = require('fs') var Path = require('path') var utils = require('./lib/helpers/utils') var sanitize = require('sanitize-filename') var mime = require('mime') var BufferTransformers = require('./lib/buffer-transformers') var ValidExtensions = { 'facebook': ['.pdf', '.png', '.jpg', '.zip', '.gif'], 'telegram': ['.pdf', '.gif', '.zip'] } module.exports = function (RED) { function BotDocument (config) { RED.nodes.createNode(this, config) var node = this this.filename = config.filename this.name = config.name this.caption = config.caption this.transports = ['telegram', 'facebook'] this.on('input', function (msg) { // var path = node.filename; var name = node.name var chatId = utils.getChatId(msg) var messageId = utils.getMessageId(msg) var transport = utils.getTransport(msg) var validExtensions = ValidExtensions[transport] var file = null // check transport compatibility if (!utils.matchTransport(node, msg)) { return } var defaultFilename = null if (!_.isEmpty(msg.filename)) { defaultFilename = msg.filename } else if (!_.isEmpty(name)) { defaultFilename = sanitize(name) } else if (msg.payload != null && !_.isEmpty(msg.payload.filename)) { defaultFilename = msg.payload.filename } else if (msg.payload != null && !_.isEmpty(msg.filename)) { defaultFilename = msg.filename } var path = null if (!_.isEmpty(node.filename)) { path = node.filename } else if (!_.isEmpty(msg.filename)) { path = msg.filename } if (!_.isEmpty(path)) { if (!fs.existsSync(path)) { node.error('File doesn\'t exist: ' + path) return } file = { filename: Path.basename(path), buffer: fs.readFileSync(path), mimeType: mime.lookup(path), extension: Path.extname(path) } } else if (msg.payload instanceof Buffer) { // handle a file buffer passed through payload if (_.isEmpty(defaultFilename) || _.isEmpty(Path.extname(defaultFilename))) { node.error('Unknown file type, use the "name" parameter to specify the file name and extension as default') return } file = { filename: Path.basename(defaultFilename), extension: Path.extname(defaultFilename), mimeType: mime.lookup(defaultFilename), buffer: msg.payload } } else if (_.isObject(msg.payload) && msg.payload.file instanceof Buffer) { // handle a buffer passed by another document node if (_.isEmpty(defaultFilename) || _.isEmpty(Path.extname(defaultFilename))) { node.error('Unknown file type, use the "name" parameter to specify the file name and extension as default') return } file = { filename: Path.basename(defaultFilename), extension: Path.extname(defaultFilename), mimeType: mime.lookup(defaultFilename), buffer: msg.payload.file } } // exit if no file description if (file == null) { return } // get caption var caption = null if (!_.isEmpty(node.caption)) { caption = node.caption } else if (_.isObject(msg.payload) && _.isString(msg.payload.caption) && !_.isEmpty(msg.payload.caption)) { caption = msg.payload.caption } // if the file has a not accepted extension, then zip it var transform = BufferTransformers.identity if (!_(validExtensions).contains(file.extension)) { transform = BufferTransformers.zip } // zip the file if needed or leave it as is transform(file) .then(function (newFile) { // console.log('++++', newFile); // send out the message msg.payload = { type: 'document', content: newFile.buffer, filename: newFile.filename, caption: caption, chatId: chatId, messageId: messageId, inbound: false, mimeType: newFile.mimeType } // send out reply node.send(msg) }) }) } RED.nodes.registerType('bot-document', BotDocument) }