UNPKG

botanalytics-ghome

Version:

Conversational analytics & engagement tool for chatbots

226 lines (159 loc) 4.74 kB
const util = require('util'); const objectPath = require('object-path'); const setIfAvailable = require('../util').setIfAvailable; const EVENTS_MESSAGE_RECEIVED = 'message'; const EVENTS_MESSAGE_SENT = 'message_sent'; const EVENTS_CONVERSATION_STARTED = 'conversation_started'; module.exports = function(token, userConfig) { // Check token if (!token) { throw new Error('You must provide a Botanalytics token!'); } // Create default config var config = { baseUrl: 'https://api.botanalytics.co/v1/', debug: false } // Merge user configuration into the default config Object.assign(config, userConfig); const log = new require('../util').Logger(config); log.debug('Logging enabled.'); log.debug('Configuration: ' + util.inspect(config)) require('request').debug = true; // Configure request defaults const request = require('request').defaults({ baseUrl: config.baseUrl, headers: { 'Authorization': 'Token ' + encodeURIComponent(token), 'Content-Type': 'application/json' } }); const _decideMessageType = (message) => { if (message.duration) return 'video'; else if (message.thumbnail) return 'picture'; else if (message.filename) return 'file'; else if(message.url) return 'url'; else if (message.text) return 'text'; else if (message.contactName) return 'contact'; else if (message.latitude) return 'location'; else if (message.stickerId) return 'sticker'; log.error('Failed to decide the type of message: ' + util.inspect(message) + ', falling back to text...'); return 'text'; }; return { attach: function(bot, callback) { // Check bot object if (!bot) { var err = new Error('You must provide a bot object!'); if (callback) return callback(err); else return err; } // Listen to conversation start event bot.on(EVENTS_CONVERSATION_STARTED, (data, isSubscribed) => { var userProfile = {}; Object.assign(userProfile, data.userProfile); log.debug('Logging user profile data: ' + util.inspect(userProfile)); // Send user data request({ url: '/viber/users/', method: 'POST', json: true, body: userProfile }, (err, resp, payload) => { if (err) { log.error('Failed to log user profile.', err); if (callback) callback(new Error('Failed to log user')); return; } err = log.checkResponse(resp, 'Successfully logged user profile.', 'Failed to log user profile.'); if (callback) callback(err); }); }); // Listen to message received event bot.on(EVENTS_MESSAGE_RECEIVED, (messageObj, response) => { var message = { sender: { id: response.userProfile.id, name: response.userProfile.name }, message: { type: _decideMessageType(messageObj), text: messageObj.text } }; Object.assign(message, messageObj); log.debug('Logging received message: ' + util.inspect(message)); message.message_token = messageObj.token; message.auth_token = bot.authToken; objectPath.del(message, 'token'); // Send user data request({ url: '/messages/viber/', method: 'POST', json: true, body: { message: message } }, (err, resp, payload) => { if (err) { log.error('Failed to log user profile.', err); if (callback) callback(new Error('Failed to log incoming message')); return; } err = log.checkResponse(resp, 'Successfully logged incoming message.', 'Failed to log incoming message.'); if (callback) callback(err); }); }); // Listen to message sent event bot.on(EVENTS_MESSAGE_SENT, (messageObj, userProfile) => { console.log('Bot: ' + util.inspect(bot)); var message = { receiver: { id: userProfile.id, name: userProfile.name }, type: _decideMessageType(messageObj) }; Object.assign(message, messageObj); log.debug('Logging sent message: ' + util.inspect(message)); message.message_token = messageObj.token; message.auth_token = bot.authToken; objectPath.del(message, 'token'); message.timestamp = new Date().getTime(); // Send user data request({ url: '/messages/viber/', method: 'POST', json: true, body: { message: message } }, (err, resp, payload) => { if (err) { log.error('Failed to log user profile.', err); if (callback) callback(new Error('Failed to log user')); return; } err = log.checkResponse(resp, 'Successfully logged outgoing message.', 'Failed to log outgoing message.'); if (callback) callback(err); }); }); } }; }