Software / code / prosody-modules
Comparison
mod_cloud_notify/mod_cloud_notify.lua @ 1784:1656d4fd71d0 last-google-code-commit
mod_cloud_notify: Fix syntax errors and name
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 24 Aug 2015 23:17:36 +0200 |
| parent | 1783:mod_cloud_notify/mod_mobile_notify.lua@b31fe2d22310 |
| child | 1907:7fe7bd7b33b6 |
comparison
equal
deleted
inserted
replaced
| 1783:b31fe2d22310 | 1784:1656d4fd71d0 |
|---|---|
| 1 -- XEP-0357: Push (aka: My mobile OS vendor won't let me have persistent TCP connections) | |
| 2 -- Copyright (C) 2015 Kim Alvefur | |
| 3 -- | |
| 4 -- This file is MIT/X11 licensed. | |
| 5 | |
| 6 local st = require"util.stanza"; | |
| 7 local jid = require"util.jid"; | |
| 8 local dataform = require"util.dataforms".new; | |
| 9 | |
| 10 local xmlns_push = "urn:xmpp:push:0"; | |
| 11 | |
| 12 module:add_feature(xmlns_push); | |
| 13 | |
| 14 local push_enabled = module:shared("push-enabled-users"); | |
| 15 | |
| 16 module:hook("iq-set/self/"..xmlns_push..":enable", function (event) | |
| 17 local origin, stanza = event.origin, event.stanza; | |
| 18 local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node; | |
| 19 if not push_jid or not push_node then | |
| 20 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node")); | |
| 21 return true; | |
| 22 end | |
| 23 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 | |
| 25 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid publish options")); | |
| 26 return true; | |
| 27 end | |
| 28 local user_push_services = push_enabled[origin.username]; | |
| 29 if not user_push_services then | |
| 30 user_push_services = {}; | |
| 31 end | |
| 32 user_push_services[push_jid .. "<" .. push_node] = { | |
| 33 jid = push_jid; | |
| 34 node = push_node; | |
| 35 count = 0; | |
| 36 options = publish_options; | |
| 37 }; | |
| 38 origin.send(st.reply(stanza)); | |
| 39 return true; | |
| 40 end); | |
| 41 | |
| 42 module:hook("iq-set/self/"..xmlns_push..":disable", function (event) | |
| 43 local origin, stanza = event.origin, event.stanza; | |
| 44 local push_jid, push_node = stanza.tags[1].attr.jid, stanza.tags[1].attr.node; | |
| 45 if not push_jid or not push_node then | |
| 46 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing jid or node")); | |
| 47 return true; | |
| 48 end | |
| 49 local user_push_services = push_enabled[origin.username]; | |
| 50 if user_push_services then | |
| 51 user_push_services[push_jid .. "<" .. push_node] = nil; | |
| 52 end | |
| 53 origin.send(st.reply(stanza)); | |
| 54 return true; | |
| 55 end); | |
| 56 | |
| 57 local push_form = dataform { | |
| 58 { name = "FORM_TYPE"; type = "hidden"; value = "urn:xmpp:push:summary"; }; | |
| 59 { name = "message-count"; type = "text-single"; }; | |
| 60 { name = "pending-subscription-count"; type = "text-single"; }; | |
| 61 { name = "last-message-sender"; type = "jid-single"; }; | |
| 62 { name = "last-message-body"; type = "text-single"; }; | |
| 63 }; | |
| 64 | |
| 65 module:hook("message/offline/handle", function(event) | |
| 66 local origin, stanza = event.origin, event.stanza; | |
| 67 local to = stanza.attr.to; | |
| 68 local node = to and jid.split(to) or origin.username; | |
| 69 local user_push_services = push_enabled[node]; | |
| 70 if not user_push_services then return end | |
| 71 | |
| 72 for _, push_info in pairs(user_push_services) do | |
| 73 push_info.count = push_info.count + 1; | |
| 74 local push_jid, push_node = push_info.jid, push_info.node; | |
| 75 local push_publish = st.iq({ to = push_jid, from = module.host, type = "set", id = "push" }) | |
| 76 :tag("pubsub", { xmlns = "http://jabber.org/protocol/pubsub" }) | |
| 77 :tag("publish", { node = push_node }); | |
| 78 push_publish:add_child(push_form:form({ | |
| 79 ["message-count"] = tostring(push_info.count); | |
| 80 ["last-message-sender"] = stanza.attr.from; | |
| 81 ["last-message-body"] = stanza:get_child_text("body"); | |
| 82 })); | |
| 83 push_publish:up(); -- / publish | |
| 84 if push_info.options then | |
| 85 push_publish:tag("publish-options"):add_child(push_info.options); | |
| 86 end | |
| 87 module:send(push_publish); | |
| 88 end | |
| 89 end, 1); | |
| 90 | |
| 91 module:hook("message/offline/broadcast", function(event) | |
| 92 local user_push_services = push_enabled[event.origin.username]; | |
| 93 if not user_push_services then return end | |
| 94 | |
| 95 for _, push_info in pairs(user_push_services) do | |
| 96 if push_info then | |
| 97 push_info.count = 0; | |
| 98 end | |
| 99 end | |
| 100 end, 1); |