Mercurial > psgxs
diff notifs.js @ 24:b80ab94da447
Add new modules files.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Mon, 01 Nov 2010 00:02:27 +0100 |
parents | |
children | 023f767662d3 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/notifs.js @@ -0,0 +1,166 @@ +var xmpp = require('xmpp'); +var storage = require('./storage'); +var config = require('./configuration'); +var conn; + +function _(obj, color) { + var str = require('sys').inspect(obj, false, null); + if (color) + console.log('\033['+c+';1m' + str + '\033[0m'); + else + console.log(str); +}; + +exports.send = function(notifs, type, nodeID, a1, a2) { + var ev = xmpp.stanza('event', {xmlns: 'http://jabber.org/protocol/pubsub#event'}); + + if (type == 'affiliations') { + ev.attr.xmlns = 'http://jabber.org/protocol/pubsub'; + + var args = {}; + for (i in a1) { + var attr = a1[i]; + if (i == 'affiliation') + args.affiliation = attr; + else if (i == 'jid') + args.jid = attr; + } + var affiliations = xmpp.stanza('affiliations', {node: nodeID}) + .c('affiliation', args); + ev.cnode(affiliations); + } else if (type == 'collection') { + var collection = xmpp.stanza('collection', {node: nodeID}); + if (a1 == 'associate') + collection.cnode('associate', {node: nodeID}); + else + collection.cnode('disassociate', {node: nodeID}); + ev.cnode(collection); + } else if (type == 'configuration') { + if (!config.enabled('config-node')) { + _('Error #4', 41) + return; + } + + var configuration = xmpp.stanza('configuration', {node: nodeID}); + if (a1) { + var x = forms.build('node_config', service_configuration.node_config, storage.getConfiguration(nodeID)); + if (x) + configuration.cnode(x); //TODO: voir exemple 150 + } + ev.cnode(configuration); + } else if (type == 'delete') { + var del = xmpp.stanza('delete', {node: nodeID}); + if (a1) + del.c('redirect', {uri: a1}); + ev.cnode(del); + } else if (type == 'items') { + var items = xmpp.stanza(type, {node: nodeID}); + if (a2 == 'retract') + for (var i in a1) + items.s('retract', {id: i}); + else { + for (var i in a1) { + var item = a1[i]; + var args = {}; + if (i != '') + args.id = i; + if (item.node) + args.node = item.node; + if (item.publisher) + args.publisher = item.publisher; + var it = xmpp.stanza('item', args); + if (item.content) + it.cnode(item.content); + items.cnode(it); + } + } + ev.cnode(items); + } else if (type == 'purge') { + ev.c('purge', {node: nodeID}); + } else if (type == 'subscription') { + if (!config.enabled('subscription-notifications')) + return; + + var args = {node: nodeID}; + for (i in a1) { + var attr = a1[i]; + if (i == 'subscription') { + if (attr == 'none' || attr == 'pending' || attr == 'subscribed' || attr == 'unconfigured') + args[i] = attr; + else { + _('Error #3', 41) + return; + } + } else if (i == 'jid' || i == 'subid') + args[i] = attr; + else if (i == 'expiry') + args[i] = attr.toString(); + } + if (!args.jid || args.jid == '') { + _('Error #2', 41) + return; + } + var sub = xmpp.stanza('subscription', args); + ev.cnode(sub); + } else { + _('Error #1', 41) + return; + } + + var subs; + if (typeof notifs == 'string') { + subs = {}; + subs[notifs] = storage.getSubscription(notifs, nodeID); + } else + subs = notifs; + + for (var i in subs) { + var sub = subs[i]; + + if (sub.options) { + if (typeof sub.options['pubsub#deliver'] != 'undefined' && !sub.options['pubsub#deliver']) + continue; + + if (typeof sub.options['pubsub#digest'] != 'undefined' && sub.options['pubsub#digest']) { + if (!sub.digest) + sub.digest = []; + sub.digest.push(ev) + + if (sub.digestTimeout) + continue; + + var freq; + if (typeof sub.options['pubsub#digest_frequency'] == 'undefined') + freq = 0; + else + freq = parseInt(sub.options['pubsub#digest_frequency']); + + if (freq == 0) + freq = 24*60*60*1000; + + setTimeout(sendDigest, freq, notifs[i], nodeID); + sub.digestTimeout = true; + continue; + } + } + + var message = xmpp.message({to: i, from: config.jid, id: conn.getUniqueId()}); + message.cnode(ev); + conn.send(message); + } +} + +exports.sendDigest = function(jid, nodeID) { + var sub = storage.getSubscription(jid, nodeID); + if (sub.digestTimeout) + sub.digestTimeout = false; + + var message = xmpp.message({to: jid, from: config.jid, id: conn.getUniqueId()}); + for (var i in sub.digest) + message.cnode(sub.digest[i]); + conn.send(message); +} + +exports.setConnection = function(c) { + conn = c; +}