diff options
author | Matthew Wild <mwild1@gmail.com> | 2009-06-22 18:05:36 +0100 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2009-06-22 18:05:36 +0100 |
commit | 8441ed782155cead1d9ca6f5a62d74e8ee9bdac5 (patch) | |
tree | c5d9dbae17765441828542193ae2dbb5cd2868af | |
parent | 3d891979efc61afdef96424fbb8a70b95d18cecf (diff) | |
download | prosody-8441ed782155cead1d9ca6f5a62d74e8ee9bdac5.tar.gz prosody-8441ed782155cead1d9ca6f5a62d74e8ee9bdac5.zip |
mod_announce: New module to send a message to all online users
-rw-r--r-- | plugins/mod_announce.lua | 37 |
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); |