transport-xmpp.js 2.53 KB
"use strict";

const bot = require("simple-xmpp");
const config = require('komodo-sdk/config')
const logger = require('komodo-sdk/logger');

let _callback;
let _isReady = false;

bot.on('online', function(data) {
    logger.info('XMPP transport connected, JID: ' + data.jid.user);
    bot.getRoster();

    setTimeout(
        function() {
            _isReady = true;

            logger.verbose('Transport is ready');

            if (_callback && _callback.onOnline) {
                _callback.onOnline({
                    me: config.username,
                });
            };
        },

        config.warming_up_ms || (30 * 1000)
    )
});

bot.on('chat', function(partner, msg) {
    if (!msg || !msg.trim()) {
        return;
    }

    if (partner == config.username.replace(/\/.*$/, '')) {
        return;
    }

    if (!_isReady) {
        logger.warn('Warming up is not finished yet, ignoring message', {me: config.username, partner: partner, msg: msg});
        return;
    }

    logger.info('Incoming message via XMPP transport', {me: config.username, partner: partner, msg: msg});

    if (_callback && _callback.onIncomingMessage) {
        _callback.onIncomingMessage(
            {
                me: config.username,
                partner: partner,
                msg: msg.trim()
            }
            /*
            ,
            function(err, params) {
                if (params && params.msg) {
                    bot.send(partner, params.msg);
                }
            }
            */
        )
    }
})

bot.on('error', function(err) {
    logger.warn('Error on XMPP transport', {err: err})
    setTimeout(
        function() {
            process.exit(2);
        },
        2000
    )
})

bot.on('subscribe', function(from) {
    logger.verbose('Incoming subscribe request from ' + from);
    bot.acceptSubscription(from);
    bot.subscribe(from);
})

function init(cb) {
    if (!cb) {
        logger.warn('Callback is not defined');
        console.trace();
        process.exit(1);
        return;
    }

    _callback = cb;

    bot.connect({
        jid: config.username,
        password: config.password,
        host: config.xmpp_host
    });
}

function send(partner, msg) {
    logger.verbose('Sending message via XMPP transport', {transport: 'xmpp', me: config.username, partner: partner, msg: msg});
    bot.send(partner, msg);
}

function ping() {
    //logger.verbose('PING');
    bot.send(config.username, 'PING!');
}

setInterval(
    ping,
    config.ping_interval_ms || 60000
)

exports.init = init;
exports.send = send;