4 -- |
4 -- |
5 -- This project is MIT/X11 licensed. Please see the |
5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. |
6 -- COPYING file in the source package for more information. |
7 -- |
7 -- |
8 |
8 |
9 local st, jid = require "prosody.util.stanza", require "prosody.util.jid"; |
9 local usermanager = require "prosody.core.usermanager"; |
|
10 local id = require "prosody.util.id"; |
|
11 local jid = require "prosody.util.jid"; |
|
12 local st = require "prosody.util.stanza"; |
10 |
13 |
11 local hosts = prosody.hosts; |
14 local hosts = prosody.hosts; |
12 |
15 |
13 function send_to_online(message, host) |
16 function send_to_online(message, host) |
|
17 host = host or module.host; |
14 local sessions; |
18 local sessions; |
15 if host then |
19 if host then |
16 sessions = { [host] = hosts[host] }; |
20 sessions = { [host] = hosts[host] }; |
17 else |
21 else |
18 sessions = hosts; |
22 sessions = hosts; |
28 module:send(message); |
32 module:send(message); |
29 end |
33 end |
30 end |
34 end |
31 end |
35 end |
32 |
36 |
|
37 return c; |
|
38 end |
|
39 |
|
40 function send_to_all(message, host) |
|
41 host = host or module.host; |
|
42 local c = 0; |
|
43 for username in usermanager.users(host) do |
|
44 message.attr.to = username.."@"..host; |
|
45 module:send(st.clone(message)); |
|
46 c = c + 1; |
|
47 end |
|
48 return c; |
|
49 end |
|
50 |
|
51 function send_to_role(message, role, host) |
|
52 host = host or module.host; |
|
53 local c = 0; |
|
54 for _, recipient_jid in ipairs(usermanager.get_jids_with_role(role, host)) do |
|
55 message.attr.to = recipient_jid; |
|
56 module:send(st.clone(message)); |
|
57 c = c + 1; |
|
58 end |
33 return c; |
59 return c; |
34 end |
60 end |
35 |
61 |
36 module:default_permission("prosody:admin", ":send-announcement"); |
62 module:default_permission("prosody:admin", ":send-announcement"); |
37 |
63 |
80 end |
106 end |
81 |
107 |
82 local fields = announce_layout:data(data.form); |
108 local fields = announce_layout:data(data.form); |
83 |
109 |
84 module:log("info", "Sending server announcement to all online users"); |
110 module:log("info", "Sending server announcement to all online users"); |
85 local message = st.message({type = "headline"}, fields.announcement):up() |
111 local message = st.message({type = "headline"}, fields.announcement):up(); |
86 :tag("subject"):text(fields.subject or "Announcement"); |
112 if fields.subject and fields.subject ~= "" then |
|
113 message:text_tag("subject", fields.subject); |
|
114 end |
87 |
115 |
88 local count = send_to_online(message, data.to); |
116 local count = send_to_online(message, data.to); |
89 |
117 |
90 module:log("info", "Announcement sent to %d online users", count); |
118 module:log("info", "Announcement sent to %d online users", count); |
91 return { status = "completed", info = ("Announcement sent to %d online users"):format(count) }; |
119 return { status = "completed", info = ("Announcement sent to %d online users"):format(count) }; |
97 module:depends "adhoc"; |
125 module:depends "adhoc"; |
98 local adhoc_new = module:require "adhoc".new; |
126 local adhoc_new = module:require "adhoc".new; |
99 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); |
127 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); |
100 module:provides("adhoc", announce_desc); |
128 module:provides("adhoc", announce_desc); |
101 |
129 |
|
130 module:add_item("shell-command", { |
|
131 section = "announce"; |
|
132 section_desc = "Broadcast announcements to users"; |
|
133 name = "all"; |
|
134 desc = "Send announcement to all users on the host"; |
|
135 args = { |
|
136 { name = "host", type = "string" }; |
|
137 { name = "text", type = "string" }; |
|
138 }; |
|
139 host_selector = "host"; |
|
140 handler = function(self, host, text) |
|
141 local msg = st.message({ from = host, id = id.short() }) |
|
142 :text_tag("body", text); |
|
143 local count = send_to_all(msg, host); |
|
144 return true, ("Announcement sent to %d users"):format(count); |
|
145 end; |
|
146 }); |
|
147 |
|
148 module:add_item("shell-command", { |
|
149 section = "announce"; |
|
150 section_desc = "Broadcast announcements to users"; |
|
151 name = "online"; |
|
152 desc = "Send announcement to all online users on the host"; |
|
153 args = { |
|
154 { name = "host", type = "string" }; |
|
155 { name = "text", type = "string" }; |
|
156 }; |
|
157 host_selector = "host"; |
|
158 handler = function(self, host, text) |
|
159 local msg = st.message({ from = host, id = id.short(), type = "headline" }) |
|
160 :text_tag("body", text); |
|
161 local count = send_to_online(msg, host); |
|
162 return true, ("Announcement sent to %d users"):format(count); |
|
163 end; |
|
164 }); |
|
165 |
|
166 module:add_item("shell-command", { |
|
167 section = "announce"; |
|
168 section_desc = "Broadcast announcements to users"; |
|
169 name = "role"; |
|
170 desc = "Send announcement to users with a specific role on the host"; |
|
171 args = { |
|
172 { name = "host", type = "string" }; |
|
173 { name = "role", type = "string" }; |
|
174 { name = "text", type = "string" }; |
|
175 }; |
|
176 host_selector = "host"; |
|
177 handler = function(self, host, role, text) |
|
178 local msg = st.message({ from = host, id = id.short() }) |
|
179 :text_tag("body", text); |
|
180 local count = send_to_role(msg, role, host); |
|
181 return true, ("Announcement sent to %d users"):format(count); |
|
182 end; |
|
183 }); |