aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-06-22 18:05:36 +0100
committerMatthew Wild <mwild1@gmail.com>2009-06-22 18:05:36 +0100
commit8441ed782155cead1d9ca6f5a62d74e8ee9bdac5 (patch)
treec5d9dbae17765441828542193ae2dbb5cd2868af /plugins
parent3d891979efc61afdef96424fbb8a70b95d18cecf (diff)
downloadprosody-8441ed782155cead1d9ca6f5a62d74e8ee9bdac5.tar.gz
prosody-8441ed782155cead1d9ca6f5a62d74e8ee9bdac5.zip
mod_announce: New module to send a message to all online users
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mod_announce.lua37
1 files changed, 37 insertions, 0 deletions
diff --git a/plugins/mod_announce.lua b/plugins/mod_announce.lua
new file mode 100644
index 00000000..992410f3
--- /dev/null
+++ b/plugins/mod_announce.lua
@@ -0,0 +1,37 @@
+local st, jid, set = require "util.stanza", require "util.jid", require "util.set";
+
+local admins = set.new(config.get(module:get_host(), "core", "admins"));
+
+function handle_announcement(data)
+ local origin, stanza = data.origin, data.stanza;
+ local host, resource = select(2, jid.split(stanza.attr.to));
+
+ if resource ~= "announce/online" then
+ return; -- Not an announcement
+ end
+
+ if not admins:contains(jid.bare(origin.full_jid)) then
+ -- Not an admin? Not allowed!
+ module:log("warn", "Non-admin %s tried to send server announcement", tostring(jid.bare(origin.full_jid)));
+ origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+ return;
+ end
+
+ module:log("info", "Sending server announcement to all online users");
+ local host_session = hosts[host];
+ local message = st.clone(stanza);
+ message.attr.type = "headline";
+ message.attr.from = host;
+
+ local c = 0;
+ for user in pairs(host_session.sessions) do
+ c = c + 1;
+ message.attr.to = user.."@"..host;
+ core_post_stanza(host_session, message);
+ end
+
+ module:log("info", "Announcement sent to %d online users", c);
+ return true;
+end
+
+module:hook("message/host", handle_announcement);