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

80 lines (69 loc) 2.78 kB
var _ = require('underscore'); var utils = require('../lib/helpers/utils'); var MessageTemplate = require('../lib/message-template-async'); var emoji = require('node-emoji'); var ChatExpress = require('../lib/chat-platform/chat-platform'); var append = utils.append; module.exports = function(RED) { function ChatBotMessage(config) { RED.nodes.createNode(this, config); var node = this; this.message = config.message; this.answer = config.answer; this.parse_mode = config.parse_mode; this.silent = config.silent; this.transports = ['telegram', 'slack', 'facebook', 'smooch', 'viber', 'twilio']; this.pickOne = function(messages) { var luck = Math.floor(Math.random() * messages.length); return _.isString(messages[luck]) ? messages[luck] : messages[luck].message; }; this.on('input', function(msg) { //var message = node.message; var answer = node.answer; var chatId = utils.getChatId(msg); var messageId = utils.getMessageId(msg); var template = MessageTemplate(msg, node); var transport = utils.getTransport(msg); // check if valid message if (!utils.isValidMessage(msg, node)) { return; } // check transport compatibility if (!ChatExpress.isSupported(transport, 'message') && !utils.matchTransport(node, msg)) { return; } // try to get a plain string or number from config or payload or "message" variable // also try to get message from the "answer" key in payload, that to try to get the answer directly from nodes // like dialogflow/recast // also try to get an array of messages from config and pick one randomly var messages = utils.extractValue(['string','messages', 'number'], 'message', node, msg) || utils.extractValue('string', 'answer', node, msg, false); var silent = utils.extractValue('boolean', 'silent', node, msg, false); var fallback = utils.extractValue('string', 'fallback', node, msg, false); var message = _.isArray(messages) ? node.pickOne(messages) : messages; template(message) .then(function(message) { // payload var payload = { type: 'message', content: emoji.emojify(message), chatId: chatId, messageId: messageId, inbound: false, silent: silent, fallback: fallback }; // reply flag payload.options = {}; if (answer) { payload.options.reply_to_message_id = messageId; } // append append(msg, payload); // send out reply node.send(msg); }); }); } RED.nodes.registerType('chatbot-message', ChatBotMessage); };