@ -90,6 +90,21 @@ local function nodestore(username)
return data , err ;
end
function store : set ( node , data )
if data then
-- Save the data without subscriptions
local subscribers = { } ;
for jid , sub in pairs ( data.subscribers ) do
if type ( sub ) ~= " table " or not sub.presence then
subscribers [ jid ] = sub ;
end
end
data = {
name = data.name ;
config = data.config ;
affiliations = data.affiliations ;
subscribers = subscribers ;
} ;
end
return node_config : set ( username , node , data ) ;
end
function store : users ( )
@ -136,23 +151,7 @@ local function get_broadcaster(username)
end
message : add_child ( item ) ;
end
local broadcast_to = { } ;
for jid in pairs ( jids ) do
broadcast_to [ jid ] = true ;
end
local service_recipients = recipients [ username ] ;
if service_recipients then
local service = services [ username ] ;
for recipient , nodes in pairs ( service_recipients ) do
if nodes : contains ( node ) and service : may ( node , recipient , " subscribe " ) then
broadcast_to [ recipient ] = true ;
end
end
end
for jid in pairs ( broadcast_to ) do
module : log ( " debug " , " Sending notification to %s from %s: %s " , jid , user_bare , tostring ( item ) ) ;
message.attr . to = jid ;
module : send ( message ) ;
@ -161,6 +160,20 @@ local function get_broadcaster(username)
return simple_broadcast ;
end
local function on_node_creation ( event )
local service = event.service ;
local node = event.node ;
local username = service.config . pep_username ;
local service_recipients = recipients [ username ] ;
if not service_recipients then return ; end
for recipient , nodes in pairs ( service_recipients ) do
if nodes : contains ( node ) then
service : add_subscription ( node , recipient , recipient , { presence = true } ) ;
end
end
end
function get_pep_service ( username )
module : log ( " debug " , " get_pep_service(%q) " , username ) ;
@ -220,6 +233,10 @@ function get_pep_service(username)
return service ;
end
module : hook ( " item-added/pep-service " , function ( event )
local service = event.item . service ;
module : hook_object_event ( service.events , " node-created " , on_node_creation ) ;
end ) ;
function handle_pubsub_iq ( event )
local origin , stanza = event.origin , event.stanza ;
@ -286,9 +303,12 @@ local function update_subscriptions(recipient, service_name, nodes)
end
local service = get_pep_service ( service_name ) ;
for node in current - nodes do
service : remove_subscription ( node , recipient , recipient ) ;
end
for node in nodes - current do
if service : may ( node , recipient , " subscribe " ) then
if service : add_subscription ( node , recipient , recipient , { presence = true } ) then
resend_last_item ( recipient , node , service ) ;
end
end