Mercurial > prosody-modules
comparison mod_cloud_notify/mod_cloud_notify.lua @ 2201:eb5555a3a535
mod_cloud_notify: Enable persistent storage of user notification settings
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 06 Jun 2016 15:58:41 +0200 |
| parents | e9e38ae8037f |
| children | a3e3dc9131e7 |
comparison
equal
deleted
inserted
replaced
| 2200:e9e38ae8037f | 2201:eb5555a3a535 |
|---|---|
| 13 -- configuration | 13 -- configuration |
| 14 local include_body = module:get_option("push_notification_with_body", false); | 14 local include_body = module:get_option("push_notification_with_body", false); |
| 15 local include_sender = module:get_option("push_notification_with_sender", false); | 15 local include_sender = module:get_option("push_notification_with_sender", false); |
| 16 | 16 |
| 17 -- For keeping state across reloads | 17 -- For keeping state across reloads |
| 18 local push_enabled = module:shared("push-enabled-users"); | 18 local push_enabled = module:open_store(); |
| 19 -- TODO map store would be better here | |
| 19 | 20 |
| 20 -- http://xmpp.org/extensions/xep-0357.html#disco | 21 -- http://xmpp.org/extensions/xep-0357.html#disco |
| 21 module:hook("account-disco-info", function(event) | 22 module:hook("account-disco-info", function(event) |
| 22 (event.reply or event.stanza):tag("feature", {var=xmlns_push}):up(); | 23 (event.reply or event.stanza):tag("feature", {var=xmlns_push}):up(); |
| 23 end); | 24 end); |
| 36 local publish_options = stanza.tags[1].tags[1]; | 37 local publish_options = stanza.tags[1].tags[1]; |
| 37 if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then | 38 if publish_options and ( publish_options.name ~= "x" or publish_options.attr.xmlns ~= "jabber:x:data" ) then |
| 38 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options")); | 39 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options")); |
| 39 return true; | 40 return true; |
| 40 end | 41 end |
| 41 local user_push_services = push_enabled[origin.username]; | 42 local user_push_services = push_enabled:get(origin.username); |
| 42 if not user_push_services then | 43 if not user_push_services then |
| 43 user_push_services = {}; | 44 user_push_services = {}; |
| 44 push_enabled[origin.username] = user_push_services; | |
| 45 end | 45 end |
| 46 user_push_services[push_jid .. "<" .. (push_node or "")] = { | 46 user_push_services[push_jid .. "<" .. (push_node or "")] = { |
| 47 jid = push_jid; | 47 jid = push_jid; |
| 48 node = push_node; | 48 node = push_node; |
| 49 count = 0; | 49 count = 0; |
| 50 options = publish_options; | 50 options = publish_options; |
| 51 }; | 51 }; |
| 52 origin.send(st.reply(stanza)); | 52 local ok, err = push_enabled:set(origin.username, user_push_services); |
| 53 if not ok then | |
| 54 origin.send(st.error_reply(stanza, "wait", "internal-server-error")); | |
| 55 else | |
| 56 origin.send(st.reply(stanza)); | |
| 57 end | |
| 53 return true; | 58 return true; |
| 54 end); | 59 end); |
| 55 | 60 |
| 56 -- http://xmpp.org/extensions/xep-0357.html#disabling | 61 -- http://xmpp.org/extensions/xep-0357.html#disabling |
| 57 module:hook("iq-set/self/"..xmlns_push..":disable", function (event) | 62 module:hook("iq-set/self/"..xmlns_push..":disable", function (event) |
| 60 local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included | 65 local push_node = stanza.tags[1].attr.node; -- A 'node' attribute MAY be included |
| 61 if not push_jid then | 66 if not push_jid then |
| 62 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid")); | 67 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid")); |
| 63 return true; | 68 return true; |
| 64 end | 69 end |
| 65 local user_push_services = push_enabled[origin.username]; | 70 local user_push_services = push_enabled:get(origin.username); |
| 66 for key, push_info in pairs(user_push_services) do | 71 for key, push_info in pairs(user_push_services) do |
| 67 if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then | 72 if push_info.jid == push_jid and (not push_node or push_info.node == push_node) then |
| 68 user_push_services[key] = nil; | 73 user_push_services[key] = nil; |
| 69 end | 74 end |
| 70 end | 75 end |
| 82 | 87 |
| 83 -- http://xmpp.org/extensions/xep-0357.html#publishing | 88 -- http://xmpp.org/extensions/xep-0357.html#publishing |
| 84 local function handle_notify_request(origin, stanza) | 89 local function handle_notify_request(origin, stanza) |
| 85 local to = stanza.attr.to; | 90 local to = stanza.attr.to; |
| 86 local node = to and jid.split(to) or origin.username; | 91 local node = to and jid.split(to) or origin.username; |
| 87 local user_push_services = push_enabled[node]; | 92 local user_push_services = push_enabled:get(node); |
| 88 if not user_push_services then return end | 93 if not user_push_services then return end |
| 89 | 94 |
| 90 for _, push_info in pairs(user_push_services) do | 95 for _, push_info in pairs(user_push_services) do |
| 91 push_info.count = push_info.count + 1; | 96 push_info.count = push_info.count + 1; |
| 92 local push_jid, push_node = push_info.jid, push_info.node; | 97 local push_jid, push_node = push_info.jid, push_info.node; |
| 161 module:hook("smacks-hibernation-start", hibernate_session); | 166 module:hook("smacks-hibernation-start", hibernate_session); |
| 162 module:hook("smacks-hibernation-end", restore_session); | 167 module:hook("smacks-hibernation-end", restore_session); |
| 163 | 168 |
| 164 | 169 |
| 165 module:hook("message/offline/broadcast", function(event) | 170 module:hook("message/offline/broadcast", function(event) |
| 166 local user_push_services = push_enabled[event.origin.username]; | 171 local user_push_services = push_enabled:get(event.origin.username); |
| 167 if not user_push_services then return end | 172 if not user_push_services then return end |
| 168 | 173 |
| 169 for _, push_info in pairs(user_push_services) do | 174 for _, push_info in pairs(user_push_services) do |
| 170 if push_info then | 175 if push_info then |
| 171 push_info.count = 0; | 176 push_info.count = 0; |
