2013-08-29 23:38:28 -04:00
|
|
|
/*global XMPP, me, app, client*/
|
|
|
|
"use strict";
|
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
var crypto = XMPP.crypto;
|
|
|
|
|
|
|
|
var _ = require('underscore');
|
2013-09-03 18:25:14 -04:00
|
|
|
var log = require('andlog');
|
2013-08-29 23:38:28 -04:00
|
|
|
var Contact = require('../models/contact');
|
|
|
|
var Resource = require('../models/resource');
|
|
|
|
var Message = require('../models/message');
|
2013-08-20 13:45:06 -04:00
|
|
|
|
|
|
|
|
|
|
|
module.exports = function (client, app) {
|
|
|
|
|
|
|
|
client.on('*', function (name, data) {
|
2013-09-03 18:25:14 -04:00
|
|
|
log.debug(name, data);
|
2013-08-20 13:45:06 -04:00
|
|
|
});
|
|
|
|
|
2013-09-05 19:53:23 -04:00
|
|
|
client.on('credentials:update', function (creds) {
|
|
|
|
client.config.credentials = creds;
|
|
|
|
|
|
|
|
if (creds.clientKey && creds.serverKey) {
|
|
|
|
delete creds.password;
|
|
|
|
delete creds.saltedPassword;
|
|
|
|
} else if (creds.saltedPassword) {
|
|
|
|
delete creds.password;
|
|
|
|
}
|
|
|
|
|
|
|
|
localStorage.config = JSON.stringify({
|
|
|
|
jid: client.config.jid,
|
|
|
|
server: client.config.server,
|
|
|
|
wsURL: client.config.wsURL,
|
|
|
|
credentials: creds
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
client.on('disconnected', function () {
|
|
|
|
me.connectionStatus = 'disconnected';
|
|
|
|
});
|
|
|
|
|
|
|
|
client.on('auth:failed', function () {
|
|
|
|
console.log('auth failed');
|
|
|
|
window.location = '/login';
|
|
|
|
});
|
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
client.on('session:started', function (jid) {
|
|
|
|
me.jid = jid;
|
|
|
|
|
2013-09-05 19:53:23 -04:00
|
|
|
me.connectionStatus = 'connected';
|
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
client.getRoster(function (err, resp) {
|
|
|
|
resp = resp.toJSON();
|
2013-08-29 23:38:28 -04:00
|
|
|
|
2013-09-05 19:53:23 -04:00
|
|
|
app.storage.rosterver.set(me.barejid, resp.roster.ver);
|
2013-08-29 23:38:28 -04:00
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
_.each(resp.roster.items, function (item) {
|
2013-08-29 23:38:28 -04:00
|
|
|
console.log(item);
|
|
|
|
me.setContact(item, true);
|
2013-08-20 13:45:06 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
client.updateCaps();
|
|
|
|
client.sendPresence({
|
|
|
|
caps: client.disco.caps
|
|
|
|
});
|
|
|
|
client.enableCarbons();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
client.on('roster:update', function (iq) {
|
2013-08-29 23:38:28 -04:00
|
|
|
iq = iq.toJSON();
|
|
|
|
var items = iq.roster.items;
|
|
|
|
|
2013-09-05 19:53:23 -04:00
|
|
|
app.storage.rosterver.set(me.barejid, iq.roster.ver);
|
2013-08-29 23:38:28 -04:00
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
_.each(items, function (item) {
|
|
|
|
var contact = me.getContact(item.jid);
|
|
|
|
|
|
|
|
if (item.subscription === 'remove') {
|
|
|
|
if (contact) {
|
2013-08-29 23:38:28 -04:00
|
|
|
me.removeContact(contact);
|
2013-08-20 13:45:06 -04:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-29 23:38:28 -04:00
|
|
|
me.setContact(item, false);
|
2013-08-20 13:45:06 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
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) {
|
2013-08-29 23:38:28 -04:00
|
|
|
var id = '';
|
|
|
|
var type = 'image/png';
|
2013-08-20 13:45:06 -04:00
|
|
|
if (info.avatars.length > 0) {
|
2013-08-29 23:38:28 -04:00
|
|
|
id = info.avatars[0].id;
|
|
|
|
type = info.avatars[0].type || 'image/png';
|
2013-08-20 13:45:06 -04:00
|
|
|
}
|
2013-08-29 23:38:28 -04:00
|
|
|
contact.setAvatar(id, type);
|
2013-08-20 13:45:06 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
2013-08-29 23:38:28 -04:00
|
|
|
|
2013-09-03 18:25:14 -04:00
|
|
|
//if (msg.archived) {
|
|
|
|
// msg.archived.forEach(function (archived) {
|
|
|
|
// if (me.isMe(archived.by)) {
|
|
|
|
// message.id = archived.id;
|
|
|
|
// message.cid = msg.id;
|
|
|
|
// }
|
|
|
|
// });
|
|
|
|
//}
|
2013-08-29 23:38:28 -04:00
|
|
|
|
2013-08-20 13:45:06 -04:00
|
|
|
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);
|
|
|
|
});
|
|
|
|
};
|