From 694dfd793638d1890731e9f6e67494abdfe176b9 Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Sun, 22 Mar 2009 03:12:40 +0100 Subject: [PATCH] Implement User Tune support and dependencies * Implement Disco * Implmemnt Caps * Implement User Tune --- index.html | 2 +- scripts/basic.js | 64 ++++++++++++++++++++++++++++++++++++++++++++-- scripts/buddy.js | 5 ---- scripts/classes.js | 17 ++++++++++++ 4 files changed, 80 insertions(+), 8 deletions(-) delete mode 100644 scripts/buddy.js create mode 100644 scripts/classes.js diff --git a/index.html b/index.html index a2a067e..d808d12 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ - + diff --git a/scripts/basic.js b/scripts/basic.js index 1246bfb..984b0cc 100644 --- a/scripts/basic.js +++ b/scripts/basic.js @@ -1,13 +1,19 @@ var NS_VCARD = 'vcard-temp'; +var NS_CAPS= 'http://jabber.org/protocol/caps'; +var NS_PEP = 'http://jabber.org/protocol/pubsub#event'; +var NS_TUNE = 'http://jabber.org/protocol/tune'; var BOSH_SERVICE = 'http://localhost:5280/http-bind/'; var connection = null; var show_log = true; +var features = new Array(NS_CAPS, NS_TUNE+'+notify', Strophe.NS.DISCO_INFO); +var appName = 'socialXMPP'; + var roster = new Array(); function log(msg) { - var entry = $('
').append(document.createTextNode(msg)); + var entry = $('
').append(Strophe.xmlTextNode(msg)); $('#log').append(entry); } @@ -20,6 +26,7 @@ function rawOutput(data) { } function jid2id(jid) { + jid = Strophe.getBareJidFromJid(jid); return jid.split('@').join('-').split('.').join('-'); } @@ -29,7 +36,7 @@ function populateVCard(e, jid) { var text = e.getElementsByTagName(easy_cases[i])[0]; if (text) { text = Strophe.getText(text); - $('#'+easy_cases[i]).append(document.createTextNode(text)); + $('#'+easy_cases[i]).append(Strophe.xmlTextNode(text)); } } var avatar = e.getElementsByTagName('PHOTO')[0]; @@ -104,6 +111,55 @@ function getRoster() { connection.send(rosteriq.tree()); } +function _cbDisco(e) { + var id = e.getAttribute('id'); + var jid = e.getAttribute('from'); + + var response = $iq({id: id, type: 'result', to: jid}); + var query = response.c('query', {xmlns: Strophe.NS.DISCO_INFO}) + query.c('identity', {category: 'client', type: 'web', name: appName}).up(); + for (var i = 0; i < features.length; i++) { + query.c('feature', {var: features[i]}).up(); + } + connection.send(response.tree()); + + return true; +} + +function genCaps() { + var S = ''; + S += 'client/web//' + appName + '<' + features.sort(); + for (var i = 0; i < features.length; i++) { + S += features[i] + '<'; + } + return b64_sha1(S); +} + +function _cbPEP(e) { + var from = e.getAttribute('from'); + var items = e.getElementsByTagName('items')[0]; + // Handle Tune + if (items.getAttribute('node') == NS_TUNE) { + var tune = new Tune(); + tune.artist = Strophe.getText(items.getElementsByTagName('artist')[0]); + tune.length= Strophe.getText(items.getElementsByTagName('length')[0]); + tune.rating= Strophe.getText(items.getElementsByTagName('rating')[0]); + tune.source= Strophe.getText(items.getElementsByTagName('source')[0]); + tune.title= Strophe.getText(items.getElementsByTagName('title')[0]); + tune.track= Strophe.getText(items.getElementsByTagName('track')[0]); + tune.uri= Strophe.getText(items.getElementsByTagName('uri')[0]); + roster[jid2id(from)].tune = tune; + if ( $('#'+jid2id(from)+' .tune').length > 0 ) { + $('#'+jid2id(from)+' .tune').empty(); + $('#'+jid2id(from)+' .tune').append(Strophe.xmlTextNode('Listening to '+ tune.title + ' by ' + tune.artist + ' from ' + tune.source)); + } else { + $('#'+jid2id(from)).append('
Listening to '+ tune.title + ' by ' + tune.artist + ' from ' + tune.source + ''); + } + } + return true; +} + function onConnect(status) { if (status == Strophe.Status.CONNECTING) { log('Strophe is connecting.'); @@ -120,6 +176,10 @@ function onConnect(status) { } else if (status == Strophe.Status.CONNECTED) { log('Strophe is connected.'); getRoster(); + connection.addHandler(_cbPEP, NS_PEP, 'message'); + connection.addHandler(_cbDisco, Strophe.NS.DISCO_INFO, 'iq', 'get'); + var initialPresence = $pres().c('c', {xmlns: NS_CAPS, hash: 'sha-1', node: 'http://jabber.babelmonkeys.de', ver: genCaps()}).up(); + connection.send(initialPresence.tree()); } } diff --git a/scripts/buddy.js b/scripts/buddy.js deleted file mode 100644 index 1382787..0000000 --- a/scripts/buddy.js +++ /dev/null @@ -1,5 +0,0 @@ -Buddy = function(name, jid) { - this.name = name; - this.jid = jid; - this.vCard = ""; -}; diff --git a/scripts/classes.js b/scripts/classes.js new file mode 100644 index 0000000..8ada8d8 --- /dev/null +++ b/scripts/classes.js @@ -0,0 +1,17 @@ +Tune = function() { + this.artist =''; + this.length = 0; + this.rating = 1; + this.source = ''; + this.title = ''; + this.track = 1; + this.uri = ''; +} + +Buddy = function(name, jid) { + this.name = name; + this.jid = jid; + this.vCard = ""; + this.tune = new Tune(); +}; + -- 2.39.2