UNPKG

node-red-contrib-tekosbot

Version:

Tekos bot based on matrix

90 lines (76 loc) 2.89 kB
var _ = require('underscore'); var utils = require('../lib/helpers/utils'); var MessageTemplate = require('../lib/message-template-async'); var emoji = require('node-emoji'); var mustache = require("mustache"); module.exports = function(RED) { function ChatBotMessage(config) { RED.nodes.createNode(this, config); var node = this; this.message = config.message; let listMessages = []; this.answer = config.answer; this.parse_mode = config.parse_mode; this.transports = ['telegram', 'slack', 'facebook', 'smooch']; this.pickOne = function(messages) { var luck = Math.floor(Math.random() * messages.length); return _.isString(messages[luck]) ? messages[luck] : messages[luck].message; }; this.emptyMessages = function(messages) { return _.isEmpty(messages) || _(messages).all(function(message) { // in node config elements are object, in payload are just strings return _.isObject(message) ? _.isEmpty(message.message) : _.isEmpty(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); for (var i = 0; i < this.message.length; i++) { if (this.message[i].message.includes("{{")){ listMessages[i] = mustache.render(this.message[i].message,msg.payload) }else{ listMessages[i] = this.message[i].message; } } // check transport compatibility if (!utils.matchTransport(node, msg)) { return; } if (_.isString(node.message) && !_.isEmpty(node.message)) { message = node.message; } else if (_.isArray(listMessages) && !this.emptyMessages(listMessages)) { message = node.pickOne(listMessages); } else if (_.isString(msg.payload) && !_.isEmpty(msg.payload)) { message = msg.payload; } else if (_.isArray(msg.payload) && !this.emptyMessages(msg.payload)) { message = node.pickOne(msg.payload); } else if (_.isNumber(msg.payload)) { message = String(msg.payload); } else { node.error('Empty message'); } template(message) .then(function(message) { // payload msg.payload = { type: 'message', content: emoji.emojify(message), chatId: chatId, messageId: messageId, inbound: false }; // reply flag msg.payload.options = {}; if (answer) { msg.payload.options.reply_to_message_id = messageId; } // send out reply node.send(msg); }); }); } RED.nodes.registerType('chatbot-message', ChatBotMessage); };