Skip to content

Instantly share code, notes, and snippets.

@SET001
Created August 20, 2015 08:25
Show Gist options
  • Save SET001/fa2672c75baff2eaf661 to your computer and use it in GitHub Desktop.
Save SET001/fa2672c75baff2eaf661 to your computer and use it in GitHub Desktop.
// Generated by CoffeeScript 1.6.3
(function() {
app.service('XMPP', [
'$rootScope', 'Config', '$q', 'Account', 'User', 'Roster', function($rootScope, Config, $q, Account, User, Roster) {
var basicHandlers, connected, handler, name, xmpp;
xmpp = new JSJaCWebSocketConnection({
oDbg: null,
httpbase: Config.httpbase,
timerval: 500
});
xmpp.isConnected = false;
connected = $q.defer();
xmpp.__connected = connected.promise;
xmpp.customHandlers = {};
xmpp.roster = new Roster();
xmpp.search = function(username, success) {
var field, message, query, value, x,
_this = this;
message = new JSJaCIQ();
message.setTo("vjud." + Config.domain);
message.setType('set');
message.setFrom(Account.user.jid.toString());
query = message.setQuery(NS_SEARCH);
x = message.buildNode('x', {
xmlns: 'jabber:x:data',
type: 'submit'
});
field = message.buildNode('field', {
type: 'hidden',
"var": 'FORM_TYPE'
});
value = message.buildNode('value');
$(value).text('jabber:iq:search');
field.appendChild(value);
x.appendChild(field);
field = message.buildNode('field', {
"var": 'user'
});
value = message.buildNode('value');
$(value).text(username);
field.appendChild(value);
x.appendChild(field);
query.appendChild(x);
xmpp.sendIQ(message, {
result_handler: function(aIq) {
var item, items, user, users, _i, _j, _len, _len1, _ref;
users = [];
items = $(aIq.getDoc()).find('item');
for (_i = 0, _len = items.length; _i < _len; _i++) {
item = items[_i];
user = {};
_ref = $(item).children();
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
field = _ref[_j];
user[$(field).attr('var')] = $(field).first().text();
}
users.push(user);
}
return success(users);
},
error_handler: function(response, asd) {
return console.log("error while searching user", response.doc);
}
});
return xmpp.send(message, function(responce) {
return console.log(responce.getNode());
}, function(a, b, c) {
return console.log("2", a, b, c);
});
};
xmpp.sendInvite = function(user, muc) {
var inode, message, reason, xnode;
message = new JSJaCMessage();
message.setTo(user.jid.toString());
message.setFrom(Account.user.jid.toString());
xnode = message.buildNode('x', []);
xnode.setAttribute('xmlns', 'http://jabber.org/protocol/muc#user');
inode = message.buildNode('invite', []);
inode.setAttribute('to', muc.split('/').shift());
reason = message.buildNode('reason');
$(reason).text('blah blah');
inode.appendChild(reason);
xnode.appendChild(inode);
message.appendNode(xnode);
return this.send(message);
};
xmpp.leave_muc = function(room_jid) {
var request;
console.log("leaving muc channel...." + room_jid);
request = new JSJaCPresence();
request.setTo(room_jid);
request.setType('unavailable');
return this.send(request);
};
xmpp.isNewMUC = function(response) {
return $(response.getNode()).find('x status[code=201]').length;
};
xmpp.checkMUC = function(room_name) {
var d, request,
_this = this;
d = $q.defer();
request = new JSJaCIQ();
request.setTo("" + room_name + "@" + Config.muc_domain);
request.setType('get');
request.setQuery(NS_MUC_OWNER);
xmpp.send(request, function(response) {
if (response.isError()) {
switch ($(response.getNode()).find('error').attr('code')) {
case '403':
return d.reject();
case '404':
return d.resolve();
}
} else {
return d.reject();
}
});
return d.promise;
};
xmpp.createMUC = function(room_name, owner_name) {
var created, request, room_jid, xnode,
_this = this;
room_jid = "" + room_name + "@" + Config.muc_domain;
request = new JSJaCPresence();
console.log("creating " + room_jid);
request.setTo("" + room_jid + "/" + owner_name);
xnode = request.buildNode("x", []);
xnode.setAttribute("xmlns", "http://jabber.org/protocol/muc");
request.appendNode(xnode);
request.setStatus('available');
created = $q.defer();
this.send(request, function(response) {
if (xmpp.isNewMUC(response)) {
request = new JSJaCIQ();
request.setTo(room_jid);
request.setType('get');
request.setQuery(NS_MUC_OWNER);
return _this.send(request, function(response) {
var addFormField, key, query, value, x, _ref;
request = new JSJaCIQ();
request.setTo(room_jid);
request.setFrom(Account.room_jid);
request.setType('set');
query = request.setQuery('http://jabber.org/protocol/muc#owner');
query.setAttribute('xmlns', 'http://jabber.org/protocol/muc#owner');
x = query.appendChild(request.buildNode('x'));
x.setAttribute('xmlns', 'jabber:x:data');
x.setAttribute('type', 'submit');
addFormField = function(form, field, value) {
field = x.appendChild(form.buildNode('field', {
"var": field
}));
return $(field.appendChild(form.buildNode('value'))).text(value);
};
_ref = Config.xmpp.room_config;
for (key in _ref) {
value = _ref[key];
addFormField(request, key, value);
}
addFormField(request, 'muc#roomconfig_roomname', room_name);
return _this.send(request, function(response) {
return created.resolve();
});
});
} else {
return created.reject('Room alriedy exists!');
}
});
return created.promise;
};
xmpp.sendMsg = function(to, msg, type, success) {
var oMsg;
if (type == null) {
type = "";
}
oMsg = new JSJaCMessage();
oMsg.setTo(to);
oMsg.setBody(encodeURIComponent(msg));
if (type) {
oMsg.setType(type);
}
return this.send(oMsg, success);
};
xmpp._subscription = function(user, state) {
var message;
message = new JSJaCPresence();
message.setTo(user.toString());
message.setType(state);
console.log("sending ", message.getNode());
return this.send(message);
};
xmpp.request_subscription = function(to) {
var user;
user = xmpp.roster.findJID(to);
return xmpp._subscription(to, 'subscribe');
};
xmpp.accept_subscription = function(from) {
xmpp._subscription(from, 'subscribed');
return xmpp.request_subscription(from);
};
xmpp.reject_subscription = function(jid) {
var user;
xmpp._subscription(jid, 'unsubscribed');
user = this.roster.findJID(jid);
if (user) {
return xmpp.remove_user(user);
}
};
xmpp.remove_subscription = function(to) {
return xmpp._subscription(to, 'unsubscribe');
};
xmpp.remove_user = function(user) {
var message, query;
console.log("removing user");
message = new JSJaCIQ();
message.setType('set');
message.setFrom(Account.user.jid.toString());
query = message.setQuery(NS_ROSTER);
query.appendChild(message.buildNode('item', {
jid: user.jid.toString(),
subscription: 'remove'
}));
this.send(message);
return false;
};
xmpp.reject_invite = function(from) {
var message;
console.log("rejecting invite from " + (from.toString()));
message = new JSJaCPresence();
message.setTo(from.toString());
message.setType('unsubscribed');
return this.send(message);
};
xmpp.exit = function() {
var p;
this.isConnected = false;
this.roster.reset();
$rootScope.$broadcast('xmpp_roster_update');
if (xmpp.connected()) {
p = new JSJaCPresence();
p.setType("unavailable");
return this.send(p);
}
};
xmpp.registerCustomHandler = function(event, handler) {
if (!this.customHandlers[event]) {
this.customHandlers[event] = [];
}
return this.customHandlers[event].push(handler);
};
basicHandlers = {
'onconnect': function() {
var rosterRequest;
xmpp.roster_loaded = $q.defer();
rosterRequest = new JSJaCIQ();
rosterRequest.setType('get');
rosterRequest.setQuery(NS_ROSTER);
this.send(rosterRequest);
this.send(new JSJaCPresence());
connected.resolve();
return this.isConnected = true;
},
'ondisconnect': function() {
return this.exit();
},
'presence': function(response) {
var _this = this;
return xmpp.roster_loaded.promise.then(function() {
var from, show, type, user, username;
from = response.getFromJID();
if (from.getNode() !== Account.user.name) {
username = from.getNode();
user = _this.roster.find(username);
type = response.getType();
if (!type) {
if (user && !user.is_muc) {
if (show = response.getShow()) {
return user.set_status(show);
} else {
return user.set_status('online');
}
} else {
return console.log("can't find user");
}
} else {
switch (type) {
case 'subscribe':
if (user) {
if (user.awaiting_subscription || user.subscription !== 'none') {
console.log("accepting subscription");
_this.accept_subscription(user.jid);
return $rootScope.$broadcast('xmpp_invite_accepted', user);
}
} else {
_this.roster.add(new User(new JSJaCJID(from.toString())));
return $rootScope.$broadcast('xmpp_add_invite', from);
}
break;
case 'unsubscribed':
console.log('unsubscribed:', user);
if (user) {
$rootScope.$broadcast('xmpp_user_unsubscribed', user);
return _this.remove_user(user);
} else {
return console.log('no user');
}
break;
case 'unavailable':
if (user && !user.is_muc) {
return user.set_status('offline');
}
}
}
}
});
},
'iq': function(message) {
var ask, attr, contact, contacts, e, jid, node, subscription, user, _i, _len;
if (node = message.getQuery()) {
contacts = $(node).children();
for (_i = 0, _len = contacts.length; _i < _len; _i++) {
contact = contacts[_i];
attr = $(contact).attr('jid');
jid = null;
if (attr) {
try {
jid = new JSJaCJID(attr);
} catch (_error) {
e = _error;
console.error("IQ message with wrong JID: ", attr);
}
if (jid) {
subscription = $(contact).attr('subscription');
if (!subscription) {
console.log(message.getNode());
throw "IQ message with unknown subscription!";
}
ask = $(contact).attr('ask');
user = this.roster.findJID(jid);
if (user) {
if (subscription === 'remove') {
this.roster.remove(user);
} else {
user.subscription = subscription;
if (!user.status && (subscription === 'both' || subscription === 'to')) {
user.status = 'offline';
}
}
$rootScope.$broadcast('xmpp_roster_update');
} else {
user = new User(jid);
if (subscription === 'none' && !ask) {
this.remove_user(user);
$rootScope.$broadcast('xmpp_user_unsubscribed', user);
}
if (ask === 'subscribe') {
user.awaiting_subscription = true;
}
user.subscription = subscription;
if (subscription === 'both' || subscription === 'to') {
user.status = 'offline';
}
xmpp.roster.add(user);
$rootScope.$broadcast('xmpp_roster_update');
}
}
}
}
return xmpp.roster_loaded.resolve();
}
},
'message': function(response) {
return angular.noop;
},
'onerror': function(e) {
if (parseInt(e.getAttribute('code')) === 503) {
return xmpp.disconnect();
}
},
'packet_in': function(packet) {},
'onStatusChanged': function(status) {
console.log("XMPP status_changed to: ", status);
if (status === 'session-terminate-conflict') {
return xmpp.disconnect();
}
}
};
for (name in basicHandlers) {
handler = basicHandlers[name];
xmpp.registerHandler(name, (function(name, handler) {
return function() {
var custom_handler, _i, _len, _ref, _results;
handler.apply(xmpp, arguments);
if (xmpp.customHandlers[name]) {
_ref = xmpp.customHandlers[name];
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
custom_handler = _ref[_i];
_results.push(custom_handler.apply(xmpp, arguments));
}
return _results;
}
};
})(name, handler));
}
return xmpp;
}
]);
}).call(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment