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); |