all files / botmaster-fulfill-actions/ greet.js

95.45% Statements 42/44
76.92% Branches 10/13
100% Functions 0/0
94.44% Lines 34/36
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 102 103                                                                                                                                         
/**
 * Greet users with a greeting that reflects the time of day
 *
 * ```xml
 * <greet />
 * <greet tz='America/New_York' lang='es' />
 * ```
 *
 * Outputs based on the detected system language
 *
 * **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
 */
 
const Moment = require('moment-timezone');
const R = require('ramda');
const debug = require('debug')('botmaster:actions:greet');
 
const DEFAULT_TIMEZONE ='Europe/London';
 
const 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']}
    ]
};
 
 
const controller = params => {
    return getTimezone(params).then( timezone => {
        const hour = getHour(timezone);
        const greetings = getGreetings(params);
        const greeting = getGreetingFromHour(greetings, hour);
        debug(`${timezone} - hour ${hour} = ${greeting}`);
        return greeting;
    });
};
 
const spec = {
    controller
};
 
const getTimezone = params => {
    const userId = getUserId(params);
    if (params.attributes.tz)
        return Promise.resolve(params.attributes.tz);
    else Eif (userId && params.bot && params.bot.getUserInfo)
        return params.bot.getUserInfo(userId)
            .then(R.view(R.lensProp('timezone')))
            .catch( err => {
                debug('Error getting user timezone from bot', err);
                return Promise.resolve(DEFAULT_TIMEZONE);
            });
    else
        return Promise.resolve(DEFAULT_TIMEZONE);
};
 
const getUserId = R.view(R.lensPath(['update', 'recipient', 'id']));
 
const getHour = timezone => new Moment().tz(timezone).hour();
 
const getGreetings = params => {
    const lang = params.attributes.lang ? params.attributes.lang : process.env.LANG.split('_').shift();
    return GREETINGS[lang] || GREETINGS['en'];
};
 
const getGreetingFromHour = (greetings, hour) => R.compose(
    randomGreeting,
    R.prop('greetings'),
    R.defaultTo({}),
    findGreetings(greetings)
)(hour);
 
const findGreetings = greetings => hour => R.find(R.allPass([gteStart(hour), ltEnd(hour)]), greetings);
const gteStart = hour => greeting => greeting.start <= hour;
const ltEnd = hour => greeting => {
    Eif (greeting.end - greeting.start > 0)
        return greeting.end > hour;
    else
        return greeting.end > hour - 24;
};
 
const randomGreeting = greetings => greetings[Math.floor(Math.random() * greetings.length)];
 
module.exports = spec;