Created
August 20, 2015 08:25
-
-
Save SET001/fa2672c75baff2eaf661 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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