aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2021-12-20 09:37:47 +0300
committerAlexey Shchepin <alexey@process-one.net>2021-12-20 09:42:02 +0300
commitfc34661b6f9fe8d506fcd51269c5cefe05c74350 (patch)
treec2945373fd2e3a20a264d72da22ebe7a32796cc9 /src
parentOptimize user removal handling in mod_muc (diff)
Add subscribe_room_many command
Diffstat (limited to 'src')
-rw-r--r--src/mod_muc_admin.erl44
-rw-r--r--src/mod_muc_admin_opt.erl13
2 files changed, 54 insertions, 3 deletions
diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl
index 9952abd27..21611c585 100644
--- a/src/mod_muc_admin.erl
+++ b/src/mod_muc_admin.erl
@@ -40,8 +40,11 @@
change_room_option/4, get_room_options/2,
set_room_affiliation/4, get_room_affiliations/2, get_room_affiliation/3,
web_menu_main/2, web_page_main/2, web_menu_host/3,
- subscribe_room/4, unsubscribe_room/2, get_subscribers/2,
- web_page_host/3, mod_options/1, get_commands_spec/0, find_hosts/1]).
+ subscribe_room/4, subscribe_room_many/3,
+ unsubscribe_room/2, get_subscribers/2,
+ web_page_host/3,
+ mod_opt_type/1, mod_options/1,
+ get_commands_spec/0, find_hosts/1]).
-include("logger.hrl").
-include_lib("xmpp/include/xmpp.hrl").
@@ -331,6 +334,25 @@ get_commands_spec() ->
args = [{user, binary}, {nick, binary}, {room, binary},
{nodes, binary}],
result = {nodes, {list, {node, string}}}},
+ #ejabberd_commands{name = subscribe_room_many, tags = [muc_room],
+ desc = "Subscribe several users to a MUC conference",
+ module = ?MODULE, function = subscribe_room_many,
+ args_desc = ["Users JIDs and nicks",
+ "the room to subscribe",
+ "nodes separated by commas: ,"],
+ args_example = [[{"tom@localhost", "Tom"},
+ {"jerry@localhost", "Jerry"}],
+ "room1@conference.localhost",
+ "urn:xmpp:mucsub:nodes:messages,urn:xmpp:mucsub:nodes:affiliations"],
+ args = [{users, {list,
+ {user, {tuple,
+ [{jid, binary},
+ {nick, binary}
+ ]}}
+ }},
+ {room, binary},
+ {nodes, binary}],
+ result = {res, rescode}},
#ejabberd_commands{name = unsubscribe_room, tags = [muc_room],
desc = "Unsubscribe from a MUC conference",
module = ?MODULE, function = unsubscribe_room,
@@ -1331,6 +1353,18 @@ subscribe_room(User, Nick, Room, Nodes) ->
throw({error, "Malformed room JID"})
end.
+subscribe_room_many(Users, Room, Nodes) ->
+ MaxUsers = mod_muc_admin_opt:subscribe_room_many_max_users(global),
+ if
+ length(Users) > MaxUsers ->
+ throw({error, "Too many users in subscribe_room_many command"});
+ true ->
+ lists:foreach(
+ fun({User, Nick}) ->
+ subscribe_room(User, Nick, Room, Nodes)
+ end, Users)
+ end.
+
unsubscribe_room(User, Room) ->
try jid:decode(Room) of
#jid{luser = Name, lserver = Host} when Name /= <<"">> ->
@@ -1413,7 +1447,11 @@ find_hosts(ServerHost) ->
[]
end.
-mod_options(_) -> [].
+mod_opt_type(subscribe_room_many_max_users) ->
+ econf:int().
+
+mod_options(_) ->
+ [{subscribe_room_many_max_users, 50}].
mod_doc() ->
#{desc =>
diff --git a/src/mod_muc_admin_opt.erl b/src/mod_muc_admin_opt.erl
new file mode 100644
index 000000000..18ca64af7
--- /dev/null
+++ b/src/mod_muc_admin_opt.erl
@@ -0,0 +1,13 @@
+%% Generated automatically
+%% DO NOT EDIT: run `make options` instead
+
+-module(mod_muc_admin_opt).
+
+-export([subscribe_room_many_max_users/1]).
+
+-spec subscribe_room_many_max_users(gen_mod:opts() | global | binary()) -> integer().
+subscribe_room_many_max_users(Opts) when is_map(Opts) ->
+ gen_mod:get_opt(subscribe_room_many_max_users, Opts);
+subscribe_room_many_max_users(Host) ->
+ gen_mod:get_module_opt(Host, mod_muc_admin, subscribe_room_many_max_users).
+