plugins/mod_announce.lua
changeset 13488 e22609460975
parent 12981 74b9e05af71e
child 13489 3bdbaba15c00
equal deleted inserted replaced
13487:7b070909bd15 13488: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 });