UNPKG

node-red-contrib-chatbot

Version:

REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required

149 lines (131 loc) 3.86 kB
const _ = require('underscore'); const moment = require('moment'); const { ChatExpress, ChatLog } = require('chat-platform'); const { when, request } = require('../../../lib/helpers/utils'); const { fixNumber, params, fixSenderNumber } = require('./helpers'); /* Useful links Authenticate https://docs.routee.net/docs/get-authenticated Send SMS https://docs.routee.net/docs/send-a-single-sms-with-callback */ const Routee = new ChatExpress({ inboundMessageEvent: null, transport: 'routee', color: '#1d5bfe', transportDescription: 'Routee', tsKey: function() { return moment(); }, chatIdKey: function(payload) { return payload.from; }, userIdKey: function(payload) { return payload.from; }, onStart: function() { return when(true); }, onStop: function() { var options = this.getOptions(); options.connector = null; return when(true); }, routes: { '/redbot/routee': function(req, res) { /* { from: '+393473561058', to: '+447451277978', messageId: '5e6f83bf-83f2-4efc-8f21-6d07953ceb58', message: 'test inbound', parts: 1, receivedDate: '2019-11-12T20:41:25Z', direction: 'Inbound', originatingService: 'Sms', price: 0.006 } */ this.receive(req.body); res.send(''); } }, routesDescription: { '/redbot/routee': 'Routee endpoint for incoming messages' } }); Routee.out('message', function(message) { let { fromNumber, accessToken } = this.getOptions(); const context = message.chat(); const param = params(message); return request({ method: 'POST', headers : { authorization: `Bearer ${accessToken}`, 'content-type': 'application/json' }, json: { body: message.payload.content, to: fixNumber(message.payload.chatId), from: fixSenderNumber(param('fromNumber', fromNumber)) }, url: 'https://connect.routee.net/sms' }) .then(res => { if (_.isObject(res) && res.error != null) { throw `${res.error}: ${JSON.stringify(res)}`; } else if (res == null || res.trackingId == null) { throw `${res.developerMessage}: ${JSON.stringify(res.properties)}`; } else { return when(context.set('messageId', res.trackingId)) } }) .then(() => message); }); // log messages, these should be the last Routee.out(function(message) { const { logfile } = this.getOptions(); const chatContext = message.chat(); if (!_.isEmpty(logfile)) { return when(chatContext.all()) .then(variables => { const chatLog = new ChatLog(variables); return chatLog.log(message, logfile); }); } return message; }); Routee.in(function(message) { const chatContext = message.chat(); if (!_.isEmpty(message.originalMessage.message)) { message.payload.type = 'message'; message.payload.content = message.originalMessage.message; return when(chatContext.set('inboundNumber', message.originalMessage.to)) .then(() => message); } return message; }); Routee.in('*', function(message) { const { logfile } = this.getOptions(); const chatContext = message.chat(); if (!_.isEmpty(logfile)) { return when(chatContext.all()) .then(variables => { const chatLog = new ChatLog(variables); return chatLog.log(message, logfile); }); } return message; }); Routee.registerMessageType('message', 'Message', 'Send a plain text message'); Routee.registerParam( 'fromNumber', 'string', { label: 'Originator number', description: 'Override the "fromNumber" originator number defined in the chatbot configuration' } ); Routee.registerParam( 'anotherParam', 'string', { label: 'Another Param 1', description: 'This is description 2' } ); module.exports = Routee;