adaptor-xmpp.js 2.37 KB
var xmpp = require('simple-xmpp');
var moment = require('moment');

var username;
var password;

var callbacks;
var matrix;

function onOnline(data) {
    logger.info('XMPP login successful', {data: data});
    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);
    }

    if (!matrix) {
        return;
    }

    if (!matrix.buddies) {
        matrix.buddies = {};
    }

    if (!matrix.buddies[sender]) {
        matrix.buddies[sender] = {};
    }

    matrix.buddies[sender].lastIncoming = {
        msg: msg,
        lastUpdate: moment().format('YYYYMMDD HH:mm:ss')
    }
}

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 onBuddy(jid, state, statusText, resource) {
    logger.verbose('Buddy state change', {jid: jid, state: state, statusText: statusText, resource: resource});

    if (!matrix) {
        return;
    }

    if (!matrix.buddies) {
        matrix.buddies = {};
    }

    if (!matrix.buddies[jid]) {
        matrix.buddies[jid] = {states: {}};
    }

    matrix.buddies[jid].states[resource] = {
        state: state,
        statusText: statusText,
        lastUpdate: moment().format('YYYYMMDD HH:mm:ss')
    }
}

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('buddy', onBuddy);

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

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

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

    xmpp.send(destination, msg);
}

exports.init = init;
exports.sendMessage = sendMessage;
exports.setOptions = setOptions;