aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2009-04-22 10:40:11 +0000
committerBadlop <badlop@process-one.net>2009-04-22 10:40:11 +0000
commitd7223ea6ef1e7ed0e0c727ae22c63a0de70f1550 (patch)
tree54fbdbabeb5a16dd0a20cfe807bdf1f13ffa0a36 /src
parent* src/ejabberd_captcha.erl: If a problem appears while obtaining (diff)
* src/mod_shared_roster.erl: Support in API to add 'all' as member
of a group (thanks to Martin Langhoff)(EJAB-916) SVN Revision: 2031
Diffstat (limited to 'src')
-rw-r--r--src/mod_shared_roster.erl63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl
index d71c55ebc..4d323b7ee 100644
--- a/src/mod_shared_roster.erl
+++ b/src/mod_shared_roster.erl
@@ -542,15 +542,28 @@ is_user_in_group({_U, S} = US, Group, Host) ->
%% @spec (Host::string(), {User::string(), Server::string()}, Group::string()) -> {atomic, ok}
add_user_to_group(Host, US, Group) ->
{LUser, LServer} = US,
- %% Push this new user to members of groups where this group is displayed
- push_user_to_displayed(LUser, LServer, Group, both),
- %% Push members of groups that are displayed to this group
- push_displayed_to_user(LUser, LServer, Group, Host, both),
- R = #sr_user{us = US, group_host = {Group, Host}},
- F = fun() ->
- mnesia:write(R)
- end,
- mnesia:transaction(F).
+ case regexp:match(LUser, "^@.+@$") of
+ {match,_,_} ->
+ GroupOpts = mod_shared_roster:get_group_opts(Host, Group),
+ AllUsersOpt =
+ case LUser == "@all@" of
+ true -> [{all_users, true}];
+ false -> []
+ end,
+ mod_shared_roster:set_group_opts(
+ Host, Group,
+ GroupOpts ++ AllUsersOpt);
+ nomatch ->
+ %% Push this new user to members of groups where this group is displayed
+ push_user_to_displayed(LUser, LServer, Group, both),
+ %% Push members of groups that are displayed to this group
+ push_displayed_to_user(LUser, LServer, Group, Host, both),
+ R = #sr_user{us = US, group_host = {Group, Host}},
+ F = fun() ->
+ mnesia:write(R)
+ end,
+ mnesia:transaction(F)
+ end.
push_displayed_to_user(LUser, LServer, Group, Host, Subscription) ->
GroupsOpts = groups_with_opts(LServer),
@@ -560,17 +573,29 @@ push_displayed_to_user(LUser, LServer, Group, Host, Subscription) ->
remove_user_from_group(Host, US, Group) ->
GroupHost = {Group, Host},
- R = #sr_user{us = US, group_host = GroupHost},
- F = fun() ->
- mnesia:delete_object(R)
- end,
- Result = mnesia:transaction(F),
{LUser, LServer} = US,
- %% Push removal of the old user to members of groups where the group that this user was members was displayed
- push_user_to_displayed(LUser, LServer, Group, remove),
- %% Push removal of members of groups that where displayed to the group which this user has left
- push_displayed_to_user(LUser, LServer, Group, Host, remove),
- Result.
+ case regexp:match(LUser, "^@.+@$") of
+ {match,_,_} ->
+ GroupOpts = mod_shared_roster:get_group_opts(Host, Group),
+ NewGroupOpts =
+ case LUser of
+ "@all@" ->
+ lists:filter(fun(X) -> X/={all_users,true} end, GroupOpts)
+ end,
+ mod_shared_roster:set_group_opts(Host, Group, NewGroupOpts);
+ nomatch ->
+ R = #sr_user{us = US, group_host = GroupHost},
+ F = fun() ->
+ mnesia:delete_object(R)
+ end,
+ Result = mnesia:transaction(F),
+ %% Push removal of the old user to members of groups where the group that this user was members was displayed
+ push_user_to_displayed(LUser, LServer, Group, remove),
+ %% Push removal of members of groups that where displayed to the group which this user has left
+ push_displayed_to_user(LUser, LServer, Group, Host, remove),
+ Result
+ end.
+
push_members_to_user(LUser, LServer, Group, Host, Subscription) ->
GroupsOpts = groups_with_opts(LServer),