adaptor-xmpp.js 2.87 KB
var xmpp = require('simple-xmpp');
var moment = require('moment');
var MatrixUtil = require('./matrix-util');

var username;
var password;

var callbacks;
var matrix;
var matrixUtil;

function onOnline(data) {
    logger.info('XMPP login successful', {data: data});

    xmpp.getRoster();

    if (callbacks.onOnline) {
        callbacks.onOnline();
    }
}

function onPM(sender, msg) {
    if (sender.toLowerCase() == username.replace(/\/.*/, '').toLowerCase()) {
        return;
    }

    logger.verbose('Got a message', {from: sender, msg: msg});

    if (callbacks.onPM) {
        callbacks.onPM(sender, msg);
    }

    matrixUtil.updateLastIncoming(sender, msg);
}

function onError(err) {
    logger.warn('XMPP error, terminating in 3 secs', {err: err});
    setTimeout(process.exit, 3000, 1);
}

function onSubscribe(sender) {
    xmpp.acceptSubscription(sender);
}

function onUnsubscribe(sender) {
    xmpp.acceptUnsubscription(sender);
}

function onBuddy(jid, state, statusText, resource) {
    matrixUtil.updateBuddyState(jid, state, statusText, resource);
}

function isPartnerOffline(partner) {
    return matrixUtil.isPartnerOffline(partner);
}

function isPartnerHealthy(partner) {
    return matrixUtil.isPartnerHealthy(partner);
}

function init(_username, _password, _logger, _callbacks) {
    username = _username;
    password = _password;
    logger = _logger;
    callbacks = _callbacks;

    xmpp.on('online', onOnline);
    xmpp.on('chat', onPM);
    xmpp.on('error', onError);
    xmpp.on('subscribe', onSubscribe);
    xmpp.on('unsubscribe', onUnsubscribe);
    xmpp.on('buddy', onBuddy);

    xmpp.unsubscribe();

    xmpp.connect({
        jid: username,
        password: password
    });
}

function setOptions(options) {
    if (options.config) {
        config = options.config;
    }

    if (!options.matrix) {
        return;
    }

    matrix = options.matrix;
    matrixUtil = new MatrixUtil({matrix: matrix, logger: logger, config: config});
}

function sendMessage(destination, msg) {
    if (!destination) {
        logger.warn('adaptorXmpp.sendMessage: Undefined destination, send message aborted', {destination: destination, msg: msg});
    }

    if (!msg) {
        logger.warn('adaptorXmpp.sendMessage: Undefined message, send message aborted', {destination: destination, msg: msg});
    }


    if (destination.toLowerCase() != username.replace(/\/.*/, '').toLowerCase()) {
        logger.verbose('Sending message', {from: username, destination: destination, msg: msg});
    }

    xmpp.send(destination, msg);

    matrixUtil.updateLastOutgoing(destination, msg);
}

function addFriend(friend) {
    logger.verbose('Adding XMPP friend: ' + friend);
    xmpp.subscribe(friend);
}

exports.init = init;
exports.sendMessage = sendMessage;
exports.setOptions = setOptions;
exports.addFriend = addFriend;
exports.isPartnerOffline = isPartnerOffline;
exports.isPartnerHealthy = isPartnerHealthy;