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
179 lines (171 loc) • 4.28 kB
JavaScript
const _ = require('underscore');
const parseButtons = require('./parse-buttons');
const PayloadTranslators = {
dynamicMessage: function(payload) {
if (payload.content.indexOf('{{first_name}}') !== -1 || payload.content.indexOf('{{last_name}}') !== -1) {
return {
dynamic_text: {
text: payload.content,
fallback_text: !_.isEmpty(payload.fallback) ? payload.fallback : payload.content
}
}
} else {
return PayloadTranslators.message(payload);
}
},
message: function(payload) {
return {
text: payload.content
};
},
inlineButtons: function(payload) {
return {
attachment: {
type: 'template',
payload: {
template_type: 'button',
text: payload.content,
buttons: parseButtons(payload.buttons)
}
}
};
},
receiptTemplate: function(json, param) {
return {
attachment: {
type: 'template',
payload: {
template_type: 'receipt',
sharable: param('sharable', false),
...json
}
}
};
},
customerFeedbackTemplate: function(json) {
return {
attachment: {
type: 'template',
payload: {
template_type: 'customer_feedback',
...json
}
}
};
},
productTemplate: function(payload) {
return {
attachment: {
type: 'template',
payload: {
template_type: 'product',
elements: payload.elements
}
}
}
},
mediaTemplate: function(payload, param) {
// translate elements into facebook format
const buttons = payload.elements.map(item => {
const element = {
title: item.title,
buttons: parseButtons(item.buttons)
};
if (!_.isEmpty(item.subtitle)) {
element.subtitle = item.subtitle;
}
if (!_.isEmpty(item.imageUrl)) {
element.image_url = item.imageUrl;
}
return element;
});
const mediaElement = {
media_type: payload.mediaType
};
if (!_.isEmpty(payload.attachmentId)) {
mediaElement.attachment_id = payload.attachmentId;
}
if (!_.isEmpty(payload.mediaUrl)) {
mediaElement.url = payload.mediaUrl;
}
if (!_.isEmpty(buttons)) {
mediaElement.buttons = buttons;
}
return {
attachment: {
type: 'template',
payload: {
template_type: 'media',
sharable: param('sharable', false),
elements: [mediaElement]
}
}
}
},
genericTemplate: function(payload, param) {
// translate elements into facebook format
const elements = payload.elements.map(item => {
var element = {
title: item.title,
buttons: parseButtons(item.buttons)
};
if (!_.isEmpty(item.subtitle)) {
element.subtitle = item.subtitle;
}
if (!_.isEmpty(item.imageUrl)) {
element.image_url = item.imageUrl;
}
return element;
});
return {
attachment: {
type: 'template',
payload: {
template_type: 'generic',
image_aspect_ratio: param('aspectRatio', 'horizontal'),
elements: elements
}
}
}
},
buttonTemplate: function(payload) {
return {
attachment: {
type: 'template',
payload: {
template_type: 'button',
text: payload.text,
buttons: parseButtons(payload.buttons)
}
}
}
},
listTemplate: function(payload) {
// translate elements into facebook format
var elements = payload.elements.map(function(item) {
var element = {
title: item.title,
buttons: parseButtons(item.buttons)
};
if (!_.isEmpty(item.subtitle)) {
element.subtitle = item.subtitle;
}
if (!_.isEmpty(item.imageUrl)) {
element.image_url = item.imageUrl;
}
return element;
});
return {
attachment: {
type: 'template',
payload: {
template_type: 'list',
top_element_style: payload.topElementStyle,
sharable: payload.sharable,
elements: elements
}
}
};
}
};
module.exports = PayloadTranslators;