diff options
author | Badlop <badlop@process-one.net> | 2009-04-22 10:40:11 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2009-04-22 10:40:11 +0000 |
commit | d7223ea6ef1e7ed0e0c727ae22c63a0de70f1550 (patch) | |
tree | 54fbdbabeb5a16dd0a20cfe807bdf1f13ffa0a36 /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.erl | 63 |
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), |