Annotate

plugins/mod_announce.lua @ 13014:06453c564141

util.startup: Add prosody.started promise to easily execute code after startup To avoid a race where server-started fires before the promise function body is run (on next tick), I moved server-started to fire on the next tick, which seems sensible anyway. Errors are logged, I'm not sure if we ought to be doing something more here. I'm sure we'll find out.
author Matthew Wild <mwild1@gmail.com>
date Sat, 01 Apr 2023 11:56:38 +0100
parent 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1397
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
4 --
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1397
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1397
diff changeset
6 -- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1397
diff changeset
7 --
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1397
diff changeset
8
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
9 local st, jid = require "prosody.util.stanza", require "prosody.util.jid";
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
5370
7838acadb0fa mod_announce, mod_auth_anonymous, mod_c2s, mod_c2s, mod_component, mod_iq, mod_message, mod_presence, mod_tls: Access prosody.{hosts,bare_sessions,full_sessions} instead of the old globals
Kim Alvefur <zash@zash.se>
parents: 5076
diff changeset
11 local hosts = prosody.hosts;
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
3278
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
13 function send_to_online(message, host)
3275
05c1d8269043 mod_announce: Changed a global variable to local.
Waqas Hussain <waqas20@gmail.com>
parents: 3228
diff changeset
14 local sessions;
3278
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
15 if host then
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
16 sessions = { [host] = hosts[host] };
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
17 else
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
18 sessions = hosts;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
19 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
20
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
21 local c = 0;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
22 for hostname, host_session in pairs(sessions) do
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
23 if host_session.sessions then
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
24 message.attr.from = hostname;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
25 for username in pairs(host_session.sessions) do
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
26 c = c + 1;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
27 message.attr.to = username.."@"..hostname;
5014
b2006c1cfa85 mod_announce, mod_motd, mod_pubsub, mod_register, mod_watchregistrations, mod_welcome: Use module:send() instead of core_*_stanza()
Kim Alvefur <zash@zash.se>
parents: 4926
diff changeset
28 module:send(message);
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
29 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
30 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
31 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
32
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
33 return c;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
34 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
35
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 10545
diff changeset
36 module:default_permission("prosody:admin", ":send-announcement");
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
37
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
38 -- Old <message>-based jabberd-style announcement sending
3278
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
39 function handle_announcement(event)
8974
71500c68fed4 mod_announce: Fix luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 8960
diff changeset
40 local stanza = event.stanza;
10545
2fbcdf6da331 mod_announce: Silence luacheck warning about unused variable
Kim Alvefur <zash@zash.se>
parents: 10026
diff changeset
41 -- luacheck: ignore 211/node
3278
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
42 local node, host, resource = jid.split(stanza.attr.to);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
43
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 if resource ~= "announce/online" then
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 return; -- Not an announcement
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
47
12642
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 10545
diff changeset
48 if not module:may(":send-announcement", event) then
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 10545
diff changeset
49 -- Not allowed!
3278
5ca2ed58788f mod_announce: A little cleanup.
Waqas Hussain <waqas20@gmail.com>
parents: 3276
diff changeset
50 module:log("warn", "Non-admin '%s' tried to send server announcement", stanza.attr.from);
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 return;
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
53
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 module:log("info", "Sending server announcement to all online users");
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local message = st.clone(stanza);
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 message.attr.type = "headline";
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 message.attr.from = host;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
58
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
59 local c = send_to_online(message, host);
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 module:log("info", "Announcement sent to %d online users", c);
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 return true;
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
63 module:hook("message/host", handle_announcement);
1385
8999dd4253f9 mod_announce: New module to send a message to all online users
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
65 -- Ad-hoc command (XEP-0133)
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
66 local dataforms_new = require "prosody.util.dataforms".new;
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
67 local announce_layout = dataforms_new{
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
68 title = "Making an Announcement";
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
69 instructions = "Fill out this form to make an announcement to all\nactive users of this service.";
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
70
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
71 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
72 { name = "subject", type = "text-single", label = "Subject" };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
73 { name = "announcement", type = "text-multi", required = true, label = "Announcement" };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
74 };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
75
8974
71500c68fed4 mod_announce: Fix luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 8960
diff changeset
76 function announce_handler(_, data, state)
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
77 if state then
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
78 if data.action == "cancel" then
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
79 return { status = "canceled" };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
80 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
81
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
82 local fields = announce_layout:data(data.form);
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
83
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
84 module:log("info", "Sending server announcement to all online users");
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
85 local message = st.message({type = "headline"}, fields.announcement):up()
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
86 :tag("subject"):text(fields.subject or "Announcement");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
87
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
88 local count = send_to_online(message, data.to);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5370
diff changeset
89
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
90 module:log("info", "Announcement sent to %d online users", count);
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
91 return { status = "completed", info = ("Announcement sent to %d online users"):format(count) };
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
92 else
5076
88fb94df9b18 mod_admin_adhoc, mod_announce: Explicitly specify possible actions for ad-hoc commands
Florian Zeitz <florob@babelmonkeys.de>
parents: 5014
diff changeset
93 return { status = "executing", actions = {"next", "complete", default = "complete"}, form = announce_layout }, "executing";
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
94 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
95 end
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
96
8960
9d0d1e427b82 mod_announce: Depend on mod_adhoc for consistent behaviour (thanks meaz, Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 8680
diff changeset
97 module:depends "adhoc";
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
98 local adhoc_new = module:require "adhoc".new;
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
99 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin");
4926
58714123f600 mod_adhoc, mod_admin_adhoc, mod_announce: Use module:provides() to manage Ad-Hoc commands
Florian Zeitz <florob@babelmonkeys.de>
parents: 3278
diff changeset
100 module:provides("adhoc", announce_desc);
3228
65e5dfcf5a9f mod_announce: Add ad-hoc command for sending announcements \o/
Matthew Wild <mwild1@gmail.com>
parents: 3199
diff changeset
101