all files / dist/ greet.js

89.13% Statements 41/46
75% Branches 9/12
86.67% Functions 13/15
92.68% Lines 38/41
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101                                                                                                                             
'use strict';
 
/**
 * Greet users with a greeting that reflects the time of day
 *
 * ```xml
 * <greet />
 * <greet tz='America/New_York' lang='es' />
 * ```
 *
 * Outputs based on the system language, or set attribute, default is english if none of these are found.
 * Timezone is based on the users timezone on bots that implement getUserInfo, the set attribute, default is UTC if noen of these are found.
 *
 * **English (en)**
 * * between 4 am and 12 pm say "Good morning"
 * * between 12 pm and 5pm  say "Good afternoon"
 * * between 5 pm and 4am  say "Good evening"
 *
 * **Spanish (es)**
 * * between 4 am and 12 pm say "Buenos dias"
 * * between 12 pm and 8pm  say "Buenas tardes"
 * * between 8 pm and 4am  say "Buenas noches"
 *
 * @param {String} tz Which timezone to use for the time-based greeting. Defaults to GMT. To see available options see http://momentjs.com/timezone/
 * @param {String} lang Which language to use. Defaults to system locale setting
 * @module greet
 */
 
var Moment = require('moment-timezone');
var R = require('ramda');
var debug = require('debug')('botmaster:actions:greet');
 
var DEFAULT_TIMEZONE = 'Europe/London';
 
var GREETINGS = {
    en: [{ start: 4, end: 12, greetings: ['Good morning'] }, { start: 12, end: 17, greetings: ['Good afternoon'] }, { start: 17, end: 4, greetings: ['Good evening'] }],
    es: [{ start: 4, end: 12, greetings: ['Buenos dias'] }, { start: 12, end: 20, greetings: ['Buenas tardes'] }, { start: 20, end: 4, greetings: ['Buenas noches'] }]
};
 
var controller = function controller(params) {
    return getTimezone(params).then(function (timezone) {
        var hour = getHour(timezone);
        var greetings = getGreetings(params);
        var greeting = getGreetingFromHour(greetings, hour);
        debug(timezone + ' - hour ' + hour + ' = ' + greeting);
        return greeting;
    });
};
 
var spec = {
    controller: controller
};
 
var lensImplementsTimezone = R.lensPath(['bot', 'implements', 'userInfo', 'timezone']);
 
var getTimezone = function getTimezone(params) {
    var userId = getUserId(params);
    if (params.attributes.tz) return Promise.resolve(params.attributes.tz);else Iif (userId && R.view(lensImplementsTimezone, params)) return params.bot.getUserInfo(userId).then(function (response) {
        return debug('got userinfo ' + response);
    }).then(R.compose(R.defaultTo(DEFAULT_TIMEZONE), R.view(R.lensProp('timezone')))).catch(function (err) {
        debug('Error getting user timezone from bot', err);
        return Promise.resolve(DEFAULT_TIMEZONE);
    });else return Promise.resolve(DEFAULT_TIMEZONE);
};
 
var getUserId = R.view(R.lensPath(['update', 'recipient', 'id']));
 
var getHour = function getHour(timezone) {
    return new Moment().tz(timezone).hour();
};
 
var getGreetings = function getGreetings(params) {
    var lang = params.attributes.lang ? params.attributes.lang : process.env.LANG.split('_').shift();
    return GREETINGS[lang] || GREETINGS['en'];
};
 
var getGreetingFromHour = function getGreetingFromHour(greetings, hour) {
    return R.compose(randomGreeting, R.prop('greetings'), R.defaultTo({}), findGreetings(greetings))(hour);
};
 
var findGreetings = function findGreetings(greetings) {
    return function (hour) {
        return R.find(R.allPass([gteStart(hour), ltEnd(hour)]), greetings);
    };
};
var gteStart = function gteStart(hour) {
    return function (greeting) {
        return greeting.start <= hour;
    };
};
var ltEnd = function ltEnd(hour) {
    return function (greeting) {
        Eif (greeting.end - greeting.start > 0) return greeting.end > hour;else return greeting.end > hour - 24;
    };
};
 
var randomGreeting = function randomGreeting(greetings) {
    return greetings[Math.floor(Math.random() * greetings.length)];
};
 
module.exports = spec;