diff plugins.js @ 0:96898e3812a5

initial push
author Sonny Piers <sonny.piers@gmail.com>
date Sun, 18 Dec 2011 19:03:28 +0100
parents
children f31a75c3b6c8
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/plugins.js
@@ -0,0 +1,257 @@
+'use strict';
+
+//
+//Roster
+//
+Lighstring.NS.roster = 'jabber:iq:roster';
+Lighstring.stanza.roster = {
+	'get': function() {
+		return "<iq type='get'><query xmlns='"+Mango.NS.roster+"'/></iq>";
+	},
+	add: function(aAddress, aGroups, aCustomName) {
+		var iq = $iq({type: 'set'}).c('query', {xmlns: Mango.NS.roster}).c('item', {jid: aAddress}).tree();
+		if(aCustomName) iq.querySelector('item').setAttribute(aCustomName);
+		for (var i=0; i<aGroups.length; i++) {
+			if(i === 0) iq.querySelector('item').appendChild(document.createElement('group'));
+			iq.querySelector('group').appendChild(document.createElement(aGroups[i]));
+		}
+		return iq;
+	},
+	remove: function(aAddress) {
+		return $iq({type: 'set'}).c('query', {xmlns: Mango.NS.roster}).c('item', {jid: aAddress, subscription: 'remove'}).tree();
+	}
+};
+Lighstring.getRoster = function(connection, aCallback) {
+	connection.send(this.stanza.roster.get(), function(answer){
+		var contacts = [];
+		answer.querySelectorAll('item').forEach(function(item) {
+			var jid = item.getAttribute('jid');
+			var name = item.getAttribute('name');
+			var groups = item.querySelectorAll('group');
+			var subscription = item.getAttribute('subscription');
+			var contact = {};
+			if(name)
+				contact.name = name;
+			if(jid)
+				contact.jid = jid;
+			if(subscription)
+				contact.subscription = subscription;
+			if(groups.length > 0) {
+				contact.groups = [];
+				groups.forEach(function(group) {
+					contact.groups.push(group.textContent);
+				});
+			}
+
+			contacts.push(contact);
+		});
+		aCallback(contacts);
+	});
+}
+//
+//vCard
+//
+Lighstring.NS.vcard = 'vcard-temp';
+Lighstring.stanza.vcard = {
+	'get': function(aTo) {
+		if(aTo)
+			return "<iq type='get' to='"+aTo+"'><vCard xmlns='"+Mango.NS.vcard+"'/></iq>";
+		else
+			return "<iq type='get'><vCard xmlns='"+Mango.NS.vcard+"'/></iq>";
+	}
+};
+//FIXME we should return a proper vcard, not an XMPP one
+Lighstring.getVcard = function(aConnection, aTo, aCallback) {
+	aConnection.send(Mango.stanza.vcard.get(aTo), function(answer, err){
+		if(answer) {
+			var vcard = answer.querySelector('vCard');
+			if(vcard)
+				aCallback(vcard);
+		}		
+		else
+			aCallback(null);
+	});
+}
+//
+//Disco
+//
+Lighstring.NS['disco#info'] = "http://jabber.org/protocol/disco#info";
+Lighstring.NS['disco#items'] = "http://jabber.org/protocol/disco#items";
+Lighstring.stanza.disco = {
+	items: function(aTo, aNode) {
+		if(aTo)
+			var iq = "<iq type='get' to='"+aTo+"'>";
+		else
+			var iq = "<iq type='get'>";
+		
+		if(aNode)
+			var query = "<query xmlns='"+Mango.NS['disco#items']+"' node='"+aNode+"'/>";
+		else
+			var query = "<query xmlns='"+Mango.NS['disco#items']+"'/>";
+			
+		return iq+query+"</iq>";
+	},
+	info: function(aTo, aNode) {
+		if(aTo)
+			var iq = "<iq type='get' to='"+aTo+"'>";
+		else
+			var iq = "<iq type='get'>";
+		if(aNode)
+			var query = "<query xmlns='"+Mango.NS['disco#info']+"' node='"+aNode+"'/>";
+		else
+			var query = "<query xmlns='"+Mango.NS['disco#info']+"'/>";
+			
+		return iq+query+"</iq>";
+	}
+};
+Lighstring.discoItems = function(aConnection, aTo, aCallback) {
+	aConnection.send(Mango.stanza.disco.items(aTo), function(answer){
+		var items = [];
+		answer.querySelectorAll('item').forEach(function(node) {
+			var item = {
+				jid: node.getAttribute('jid'),
+				name: node.getAttribute('name'),
+				node: node.getAttribute('node')
+			}
+			items.push(item);
+		});
+		if(aCallback)
+			aCallback(items);
+	});
+};
+Lighstring.discoInfo = function(aConnection, aTo, aNode, aCallback) {
+	aConnection.send(Mango.stanza.disco.info(aTo, aNode), function(answer){
+		var field = answer.querySelector('field[var="pubsub#creator"] > value');
+		var creator = field ? field.textContent : '';
+		//FIXME callback the entire data
+		aCallback(creator);
+	});
+};
+//
+//PubSub
+//
+Lighstring.NS.x = "jabber:x:data";
+Lighstring.NS.pubsub = "http://jabber.org/protocol/pubsub";
+Lighstring.NS.pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
+Lighstring.stanza.pubsub = {
+	getConfig: function(aTo, aNode) {
+		return  "<iq type='get' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub_owner+"'><configure node='"+aNode+"'/></pubsub></iq>";
+	},
+	items: function(aTo, aNode) {
+		return  "<iq type='get' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub+"'><items node='"+aNode+"'/></pubsub></iq>";
+	},
+	affiliations: function(aTo, aNode) {
+		return "<iq type='get' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub_owner+"'><affiliations node='"+aNode+"'/></pubsub></iq>";
+	},
+	publish: function(aTo, aNode, aItem, aId) {
+		return  "<iq type='set' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub+"'><publish node='"+aNode+"'><item id='"+aId+"'>"+aItem+"</item></publish></pubsub></iq>";
+	},
+	retract: function(aTo, aNode, aItem) {
+		return  "<iq type='set' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub+"'><retract node='"+aNode+"'><item id='"+aItem+"'/></retract></pubsub></iq>";
+	},
+	'delete': function(aTo, aNode, aURI) {
+		return  "<iq type='set' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub_owner+"'><delete node='"+aNode+"'/></pubsub></iq>";
+	},
+	create: function(aTo, aNode, aFields) {
+		var iq = "<iq type='set' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub+"'><create node='"+aNode+"'/>";
+		if(aFields) {
+			iq += "<configure><x xmlns='"+Mango.NS.x+"' type='submit'>"
+			aFields.forEach(function(field) {
+				iq += field;
+			});
+			iq += "</x></configure>";
+		}
+		iq += "</pubsub></iq>";
+		return iq;
+	},
+	setAffiliations: function(aTo, aNode, aAffiliations) {
+		var iq = "<iq type='set' to='"+aTo+"'><pubsub xmlns='"+Mango.NS.pubsub_owner+"'><affiliations node='"+aNode+"'>";
+		for(var i = 0; i < aAffiliations.length; i++) {
+			iq += "<affiliation jid='"+aAffiliations[i][0]+"' affiliation='"+aAffiliations[i][1]+"'/>"
+		}
+		iq += "</affiliations></pubsub></iq>";
+		return iq;
+	},
+};
+Lighstring.pubsubItems = function(aConnection, aTo, aNode, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.items(aTo, aNode), function(answer){
+		var items = [];
+		answer.querySelectorAll('item').forEach(function(node) {
+			var item = {
+				id: node.getAttribute('id'),
+				name: node.querySelector('title').textContent,
+				src: node.querySelector('content').getAttribute('src'),
+				type: node.querySelector('content').getAttribute('type'),
+			}
+			var thumbnail = node.querySelector('link');
+			if(thumbnail)
+				item.thumbnail = thumbnail.getAttribute('href');
+			items.push(item);
+		})
+		if(aCallback)
+			aCallback(items);
+	});
+}
+Lighstring.pubsubCreate = function(aConnection, aTo, aNode, aFields, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.create(aTo, aNode, aFields), function(answer) {
+		if(answer.getAttribute('type') === 'result')
+			aCallback(null, answer);
+		else
+			aCallback(answer, null);
+	});
+};
+Lighstring.pubsubConfig = function(aConnection, aTo, aNode, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.getConfig(aTo, aNode), function(answer){
+		var accessmodel = answer.querySelector('field[var="pubsub#access_model"]').lastChild.textContent;
+		if(accessmodel)
+			aCallback(accessmodel);
+		else
+			aCallback(null);
+	});
+}
+Lighstring.pubsubRetract = function(aConnection, aTo, aNode, aItem, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.retract(aTo, aNode, aItem), function(answer){
+		if(aCallback)
+			aCallback(answer);
+	});
+}
+Lighstring.pubsubPublish = function(aConnection, aTo, aNode, aItem, aId, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.publish(aTo, aNode, aItem, aId), function(answer){
+		if(answer.getAttribute('type') === 'result')
+			aCallback(null, answer);
+		else
+			aCallback(answer, null);
+	});
+}
+Lighstring.pubsubDelete = function(aConnection, aTo, aNode, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.delete(aTo, aNode), function(answer){
+		if(aCallback)
+			aCallback(answer);
+	});
+}
+Lighstring.pubsubGetAffiliations = function(aConnection, aTo, aNode, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.affiliations(aTo, aNode), function(answer) {
+		if((answer.getAttribute('type') === 'result') && aCallback) {
+			var affiliations = {};
+			answer.querySelectorAll('affiliation').forEach(function(affiliation) {
+				affiliations[affiliation.getAttribute("jid")] = affiliation.getAttribute("affiliation");
+			})
+			aCallback(affiliations);
+		}
+	});
+};
+Lighstring.pubsubSetAffiliations = function(aConnection, aTo, aNode, aAffiliations, aCallback) {
+	aConnection.send(Mango.stanza.pubsub.setAffiliations(aTo, aNode, aAffiliations));
+};
+//
+//IM
+//
+Lighstring.stanza.message = {
+	normal: function(aTo, aSubject, aText) {
+		return "<message type='normal' to='"+aTo+"'><subject>"+aSubject+"</subject><body>"+aText+"</body></message>";
+	},
+	chat: function(aTo, aText) {
+		return "<message type='chat' to='"+aTo+"'><body>"+aText+"</body></message>";
+	}
+};
+