Comparison

plugins/mod_announce.lua @ 13484:e22609460975

mod_announce: Add shell commands and APIs for sending to all/online/roles
author Matthew Wild <mwild1@gmail.com>
date Wed, 24 Apr 2024 11:50:13 +0100
parent 12977:74b9e05af71e
child 13485:3bdbaba15c00
comparison
equal deleted inserted replaced
13483:7b070909bd15 13484:e22609460975
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 });