mod_cloud_notify/mod_cloud_notify.lua
changeset 1911 7fe7bd7b33b6
parent 1788 1656d4fd71d0
child 1912 eba279ddc050
equal deleted inserted replaced
1910:5849d70bcd37 1911:7fe7bd7b33b6
    11 
    11 
    12 module:add_feature(xmlns_push);
    12 module:add_feature(xmlns_push);
    13 
    13 
    14 local push_enabled = module:shared("push-enabled-users");
    14 local push_enabled = module:shared("push-enabled-users");
    15 
    15 
       
    16 -- http://xmpp.org/extensions/xep-0357.html#enabling
    16 module:hook("iq-set/self/"..xmlns_push..":enable", function (event)
    17 module:hook("iq-set/self/"..xmlns_push..":enable", function (event)
    17 	local origin, stanza = event.origin, event.stanza;
    18 	local origin, stanza = event.origin, event.stanza;
    18 	local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node;
    19 	-- MUST contain a 'jid' attribute of the XMPP Push Service being enabled
    19 	if not push_jid or not push_node then
    20 	local push_jid = stanza.tags[1].attr.jid;
    20 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node"));
    21 	-- SHOULD contain a 'node' attribute
       
    22 	local push_node = stanza.tags[1].attr.node;
       
    23 	if not push_jid then
       
    24 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
    21 		return true;
    25 		return true;
    22 	end
    26 	end
    23 	local publish_options = stanza.tags[1].tags[1];
    27 	local publish_options = stanza.tags[1].tags[1];
    24 	if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then
    28 	if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then
    25 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options"));
    29 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options"));
    27 	end
    31 	end
    28 	local user_push_services = push_enabled[origin.username];
    32 	local user_push_services = push_enabled[origin.username];
    29 	if not user_push_services then
    33 	if not user_push_services then
    30 		user_push_services = {};
    34 		user_push_services = {};
    31 	end
    35 	end
    32 	user_push_services[push_jid .. "<" .. push_node] = {
    36 	user_push_services[push_jid .. "<" .. (push_node or "")] = {
    33 		jid = push_jid;
    37 		jid = push_jid;
    34 		node = push_node;
    38 		node = push_node;
    35 		count = 0;
    39 		count = 0;
    36 		options = publish_options;
    40 		options = publish_options;
    37 	};
    41 	};
    38 	origin.send(st.reply(stanza));
    42 	origin.send(st.reply(stanza));
    39 	return true;
    43 	return true;
    40 end);
    44 end);
    41 
    45 
       
    46 -- http://xmpp.org/extensions/xep-0357.html#disabling
    42 module:hook("iq-set/self/"..xmlns_push..":disable", function (event)
    47 module:hook("iq-set/self/"..xmlns_push..":disable", function (event)
    43 	local origin, stanza = event.origin, event.stanza;
    48 	local origin, stanza = event.origin, event.stanza;
    44 	local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node;
    49 	local push_jid = stanza.tags[1].attr.jid; -- MUST include a 'jid' attribute
    45 	if not push_jid or not push_node then
    50 	local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included
    46 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node"));
    51 	if not push_jid then
       
    52 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid"));
    47 		return true;
    53 		return true;
    48 	end
    54 	end
    49 	local user_push_services = push_enabled[origin.username];
    55 	local user_push_services = push_enabled[origin.username];
    50 	if user_push_services then
    56 	for key, push_info in pairs(user_push_services) do
    51 		user_push_services[push_jid .. "<" .. push_node] = nil;
    57 		if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then
       
    58 			user_push_services[key] = nil;
       
    59 		end
    52 	end
    60 	end
    53 	origin.send(st.reply(stanza));
    61 	origin.send(st.reply(stanza));
    54 	return true;
    62 	return true;
    55 end);
    63 end);
    56 
    64 
    60 	{ name = "pending-subscription-count"; type = "text-single"; };
    68 	{ name = "pending-subscription-count"; type = "text-single"; };
    61 	{ name = "last-message-sender"; type = "jid-single"; };
    69 	{ name = "last-message-sender"; type = "jid-single"; };
    62 	{ name = "last-message-body"; type = "text-single"; };
    70 	{ name = "last-message-body"; type = "text-single"; };
    63 };
    71 };
    64 
    72 
       
    73 -- http://xmpp.org/extensions/xep-0357.html#publishing
    65 module:hook("message/offline/handle", function(event)
    74 module:hook("message/offline/handle", function(event)
    66 	local origin, stanza = event.origin, event.stanza;
    75 	local origin, stanza = event.origin, event.stanza;
    67 	local to = stanza.attr.to;
    76 	local to = stanza.attr.to;
    68 	local node = to and jid.split(to) or origin.username;
    77 	local node = to and jid.split(to) or origin.username;
    69 	local user_push_services = push_enabled[node];
    78 	local user_push_services = push_enabled[node];