kaiwa/clientapp/helpers/xmppEventHandlers.js

230 lines
6.1 KiB
JavaScript

/*global XMPP, me, app, client*/
"use strict";
var crypto = XMPP.crypto;
var _ = require('underscore');
var Contact = require('../models/contact');
var Resource = require('../models/resource');
var Message = require('../models/message');
function logScroll() {
window.scrollTo(0, document.body.scrollHeight);
}
function log(name, data) {
var container = document.getElementById('log');
var logEntry = document.createElement('div'),
header = document.createElement('h2'),
entry = document.createElement('p'),
altEntry = document.createElement('p');
header.textContent = name;
logEntry.appendChild(header);
if (data && data.toJSON) {
var codeJSON = document.createElement('code');
codeJSON.textContent = JSON.stringify(data.toJSON());
altEntry.appendChild(codeJSON);
logEntry.appendChild(altEntry);
logEntry.appendChild(document.createElement('hr'));
}
var codeData = document.createElement('code');
codeData.textContent = data;
entry.appendChild(codeData);
logEntry.appendChild(entry);
if (container) {
container.appendChild(logEntry);
_.throttle(logScroll, 300);
}
}
module.exports = function (client, app) {
client.on('*', function (name, data) {
log(name, data);
if (data && data.toJSON) {
var msg = data.toJSON();
window.postMessage(JSON.stringify(msg), '*');
}
});
//client.on('disconnected', function () {
// client.connect();
//});
client.on('session:started', function (jid) {
me.jid = jid;
client.getRoster(function (err, resp) {
resp = resp.toJSON();
localStorage.rosterVersion = resp.roster.ver;
_.each(resp.roster.items, function (item) {
console.log(item);
me.setContact(item, true);
});
client.updateCaps();
client.sendPresence({
caps: client.disco.caps
});
client.enableCarbons();
});
});
client.on('roster:update', function (iq) {
iq = iq.toJSON();
var items = iq.roster.items;
localStorage.rosterVersion = iq.roster.ver;
_.each(items, function (item) {
var contact = me.getContact(item.jid);
if (item.subscription === 'remove') {
if (contact) {
me.removeContact(contact);
}
return;
}
me.setContact(item, false);
});
});
client.on('available', function (pres) {
pres = pres.toJSON();
var contact = me.getContact(pres.from);
if (contact) {
delete pres.id;
pres.show = pres.show || '';
pres.status = pres.status || '';
pres.priority = pres.priority || 0;
var resource = contact.resources.get(pres.from);
if (resource) {
resource.set(pres);
} else {
resource = new Resource(pres);
resource.cid = pres.from;
contact.resources.add(resource);
}
}
});
client.on('unavailable', function (pres) {
pres = pres.toJSON();
var contact = me.getContact(pres.from);
if (contact) {
var resource = contact.resources.get(pres.from);
if (resource) {
contact.resources.remove(resource);
}
if (contact.resources.length === 0) {
contact.offlineStatus = pres.status;
}
}
});
client.on('avatar', function (info) {
var contact = me.getContact(info.jid);
if (contact) {
var id = '';
var type = 'image/png';
if (info.avatars.length > 0) {
id = info.avatars[0].id;
type = info.avatars[0].type || 'image/png';
}
contact.setAvatar(id, type);
}
});
client.on('chatState', function (info) {
var contact = me.getContact(info.from);
if (contact) {
contact.chatState = info.chatState;
if (info.chatState === 'gone') {
contact.lockedResource = undefined;
}
}
});
client.on('chat', function (msg) {
msg = msg.toJSON();
var contact = me.getContact(msg.from, msg.to);
if (contact && !msg.replace) {
var message = new Message();
message.cid = msg.id;
message.set(msg);
if (msg.archived) {
msg.archived.forEach(function (archived) {
if (me.isMe(archived.by)) {
message.id = archived.id;
}
});
}
contact.messages.add(message);
if (!contact.lockedResource) {
contact.lockedResource = msg.from;
} else if (msg.from !== contact.lockedResource) {
contact.lockedResource = undefined;
}
}
});
client.on('replace', function (msg) {
msg = msg.toJSON();
var contact = me.getContact(msg.from, msg.to);
if (!contact) return;
var id = msg.replace;
var original = contact.messages.get(id);
if (!original) return;
original.correct(msg);
});
client.on('carbon:received', function (carbon) {
if (!me.isMe(carbon.from)) return;
var msg = carbon.carbonReceived.forwarded.message;
var delay = carbon.carbonReceived.forwarded.delay;
if (!delay.stamp) {
delay.stamp = Date.now();
}
if (!msg._extensions.delay) {
msg.delay = delay;
}
client.emit('message', msg);
});
client.on('carbon:sent', function (carbon) {
if (!me.isMe(carbon.from)) return;
var msg = carbon.carbonSent.forwarded.message;
var delay = carbon.carbonSent.forwarded.delay;
if (!delay.stamp) {
delay.stamp = Date.now();
}
if (!msg._extensions.delay) {
msg.delay = delay;
}
client.emit('message', msg);
});
};