1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.5 KiB

15 years ago
var sys = require('sys'),
xmpp = require('xmpp'),
events = require('events');
15 years ago
var Client = function(_jid, password, host) {
15 years ago
events.EventEmitter.call(this);
15 years ago
this.debug = true;
15 years ago
var jabber = this;
this.jid = new xmpp.JID(_jid);
15 years ago
this.host = (host == null) ? this.jid.domain : host;
15 years ago
this.rooms = {};
this._iq = 0;
this._iqCallback = {};
this.presences = {};
15 years ago
this.roster = {};
15 years ago
this.xmpp = new xmpp.Client({
host: this.host,
jid: '' + this.jid,
password: password });
this.xmpp.addListener('rawStanza', function(stanza) {
sys.debug("RAW: " + stanza);
});
this.xmpp.addListener('authFail', function() {
sys.error("[Error] Jabber : Authentication failure");
process.exit(1);
});
this.xmpp.addListener('error', function(e) {
sys.error(e);
process.exit(1);
});
this.xmpp.addListener('stanza', function(stanza) {
sys.debug('STANZA: ' + stanza);
if(stanza.name == 'iq') {
if(stanza.attrs.type == 'result') {
15 years ago
jabber._debug('IQ result: ' + stanza);
15 years ago
jabber.emit('iqResult', stanza.attrs.id, stanza);
} else {
this._debug('IQ: ' + stanza);
jabber.emit('iq', stanza);
}
}
if(stanza.name == 'presence') {
var fromm = stanza.attrs.from.split('/')[0].split('@');
15 years ago
if(fromm[1] == 'conference.' + this.jid.domain) {
15 years ago
jabber.rooms[fromm[0]].emit('presence', stanza);
} else {
jabber.emit('presence', stanza.attrs.from, stanza);
15 years ago
}
}
if(stanza.name == 'message') {
var from = stanza.attrs.from;
if(stanza.attrs.type == 'groupchat') {
jabber.emit('groupchat', from, stanza);
} else {
15 years ago
jabber._debug('MESSAGE: ' + stanza);
jabber.emit('message', from, stanza.getChild('body').getText(), stanza);
15 years ago
}
}
});
this.xmpp.addListener('online', function() {
jabber._debug("[Info] xmpp connection");
jabber.presence();
15 years ago
jabber.askForRoster();
15 years ago
jabber.emit('online');
});
this.addListener('groupchat', function(from, stanza) {
fromName = from.split('@')[0];
jabber.rooms[fromName].emit('message', stanza);
});
this.addListener('iqResult', function(id, stanza){
jabber._iqCallback[id].call(jabber, stanza);
});
this.addListener('presence', function(from, stanza) {
jabber.presences[from] = stanza.attrs.type;
});
15 years ago
};
sys.inherits(Client, events.EventEmitter);
15 years ago
exports.Client = Client;
Client.prototype._debug = function(txt) {
if(this.debug) {
sys.debug(txt);
}
};
15 years ago
Client.prototype.message = function(to, message) {
this.xmpp.send(new xmpp.Element('message', {
to: to,
type: 'chat'}).
c('body').
t(message));
};
15 years ago
Client.prototype.askForRoster = function() {
var jabber = this;
this.iq(new xmpp.Element('query', {xmlns: 'jabber:iq:roster'}), function(iq) {
iq.getChild('query', 'jabber:iq:roster').children.forEach(function(child) {
jabber.roster[child.attrs.jid] = {
name: child.attrs.name,
subscription: child.attrs.subscription};
});
jabber._debug("ROSTER : " + JSON.stringify(jabber.roster));
jabber.emit('roster', iq);
});
};
15 years ago
Client.prototype.iq = function(iq, callback) {
var n = this._iq++;
this._iqCallback[n] = callback;
this.xmpp.send(new xmpp.Element('iq', {type:"get", id: n}).cnode(iq).tree());
};
Client.prototype.presence = function() {
this.xmpp.send(new xmpp.Element('presence', {type: 'available'}).tree());
};
Client.prototype.disconnect = function() {
this.xmpp.send(new xmpp.Element('presence', {type: 'unavailable'})
.c('status')
.t('Logged out')
.tree());
var jabber = this;
/* Object.keys(this.rooms).forEach(function(room) {
jabber.rooms[room].leave();
});*/
this.xmpp.end();
sys.debug("disconnect from XMPP");
};