UNPKG

prisme-flow

Version:

prisme platform flow engine

106 lines (96 loc) 3.6 kB
/** * Created by prisme.io on 09/06/2017. */ var _ = require('underscore') var nlp = require('nlp_compromise') var moment = require('moment') module.exports = function (RED) { var yesWords = ['yes', 'on', 'true', 'yeah', 'ya', 'si'] var noWords = ['no', 'off', 'false', 'nei', 'nein'] var extractEmail = function (sentence) { var re = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/ var matched = sentence.match(re) return matched != null ? matched[0] : null } function BotParse (config) { RED.nodes.createNode(this, config) var node = this this.parseType = config.parseType this.parseVariable = config.parseVariable this.on('input', function (msg) { msg = RED.util.cloneMessage(msg) var parseType = this.parseType var parseVariable = this.parseVariable var chatContext = msg.chat() var parsedSentence = null var parsedValue = null if (_.isObject(msg.payload)) { switch (parseType) { case 'string': parsedValue = msg.payload.content break case 'email': parsedValue = extractEmail(msg.payload.content) break case 'location': if (_.isObject(msg.payload.content) && msg.payload.content.latitude && msg.payload.content.longitude) { parsedValue = msg.payload.content } break case 'date': if (!_.isEmpty(msg.payload.content)) { var momented = moment(new Date(msg.payload.content)) if (momented.isValid()) { parsedValue = momented.toDate() } else { // todo literal } } break case 'number-integer': if (_.isNumber(msg.payload.content)) { parsedValue = Math.round(msg.payload.content) } else if (_.isString(msg.payload.content) && msg.payload.content.match(/^[0-9]+$/)) { parsedValue = parseInt(msg.payload.content, 10) } else { parsedSentence = nlp.text(msg.payload.content) var term = _(parsedSentence.terms()).find(function (term) { return term.pos.Value }) parsedValue = term != null ? term.number : null } break case 'boolean': if (_.isString(msg.payload.content) && _(yesWords).contains(msg.payload.content.toLowerCase())) { parsedValue = true } else if (_.isString(msg.payload.content) && _(noWords).contains(msg.payload.content.toLowerCase())) { parsedValue = false } break case 'photo': case 'audio': if (msg.payload.content instanceof Buffer) { parsedValue = msg.payload.content } break case 'contact': if (_.isObject(msg.payload.content) && msg.payload.content.phone_number != null) { parsedValue = msg.payload.content.phone_number } break } } // if parsing ok, then pass through and set variable in context flow if (parsedValue != null) { if (chatContext != null) { chatContext.set(parseVariable, parsedValue) } msg.payload = parsedValue node.send([msg, null]) } else { node.send([null, msg]) } }) } RED.nodes.registerType('bot-parse', BotParse) }