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

116 lines (101 loc) 3.9 kB
var _ = require('underscore'); var moment = require('moment'); var fs = require('fs'); var lcd = require('./helpers/lcd'); module.exports = function(variables) { var self = { log: function(msg, fileName) { return new Promise(function(resolve) { if (_.isEmpty(fileName)) { // resolve immediately if empty and do nothing resolve(msg); } else { fs.appendFile(fileName, self.message(msg) + '\n', function (err) { if (err) { // eslint-disable-next-line no-console console.error(err); } // resolve anyway, problem on logging should not stop the chatbot resolve(msg); }); } }); }, toString: function(msg) { var logString = null; if (_.isObject(msg.payload)) { switch (msg.payload.type) { case 'message': logString = msg.payload.content; break; case 'location': logString = 'latitude: ' + msg.payload.content.latitude + ' longitude: ' + msg.payload.content.latitude; break; case 'photo': logString = 'image: ' + (msg.payload.filename != null ? msg.payload.filename : '<buffer>'); break; case 'video': logString = 'video: ' + (msg.payload.filename != null ? msg.payload.filename : '<buffer>'); break; case 'document': logString = 'document: ' + (msg.payload.filename != null ? msg.payload.filename : '<buffer>'); break; case 'audio': logString = 'audio: ' + (msg.payload.filename != null ? msg.payload.filename : '<buffer>'); break; case 'inline-buttons': logString = msg.payload.content + ' ' + msg.payload.buttons.map(function (button) { return '[' + button.label + ']'; }).join(' '); break; case 'intent': logString = 'intent: ' + msg.payload.intent + ' vars: ' + JSON.stringify(msg.payload.variables); break; case 'event': logString = 'event: ' + msg.payload.eventType; break; case 'speech': logString = 'speech: ' + (!_.isEmpty(msg.payload.text) ? msg.payload.text : '') + (!_.isEmpty(msg.payload.ssml) ? msg.payload.ssml : ''); break; case 'directive': logString = 'directive: ' + msg.payload.directiveType; break; default: // eslint-disable-next-line no-console console.log(lcd.warn('Un-handled message type ' + msg.payload.type + ' in logs')); logString = msg.payload.content instanceof Buffer ? '<buffer>' : String(msg.payload.content); } } return logString; }, message: function(msg) { var chatId = variables.chatId || msg.originalMessage.chatId || msg.payload.chatId; var inbound = msg.payload != null && msg.payload.inbound === true; var firstName = variables.firstName; var lastName = variables.lastName; var transport = msg.originalMessage != null ? msg.originalMessage.transport : null; var logString = null; var name = []; if (firstName != null) { name.push(firstName); } if (lastName != null) { name.push(lastName); } if (_.isObject(msg.payload)) { var stringifiedMessage = this.toString(msg); if (!_.isEmpty(stringifiedMessage)) { logString = chatId + ' ' + (!_.isEmpty(name) ? '[' + name.join(' ') + '] ' : '') + (inbound ? '> ' : '< ') + (transport != null ? '[' + transport.toUpperCase() + '] ' : '') + moment().toString() + ' - ' + stringifiedMessage; } } return logString; } }; return self; };