diff options
Diffstat (limited to 'src/mod_muc_room.erl')
-rw-r--r-- | src/mod_muc_room.erl | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 71dd09084..158e937c7 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -37,7 +37,9 @@ get_role/2, get_affiliation/2, is_occupant_or_admin/2, - route/2]). + route/2, + expand_opts/1, + config_fields/0]). %% gen_fsm callbacks -export([init/1, @@ -506,7 +508,7 @@ handle_event(_Event, StateName, StateData) -> {next_state, StateName, StateData}. handle_sync_event({get_disco_item, Filter, JID, Lang}, _From, StateName, StateData) -> - Len = ?DICT:size(StateData#state.users), + Len = ?DICT:size(StateData#state.nicks), Reply = case (Filter == all) or (Filter == Len) or ((Filter /= 0) and (Len /= 0)) of true -> get_roomdesc_reply(JID, StateData, @@ -3609,6 +3611,35 @@ make_opts(StateData) -> {subject_author, StateData#state.subject_author}, {subscribers, Subscribers}]. +expand_opts(CompactOpts) -> + DefConfig = #config{}, + Fields = record_info(fields, config), + {_, Opts1} = + lists:foldl( + fun(Field, {Pos, Opts}) -> + case lists:keyfind(Field, 1, CompactOpts) of + false -> + DefV = element(Pos, DefConfig), + DefVal = case (?SETS):is_set(DefV) of + true -> (?SETS):to_list(DefV); + false -> DefV + end, + {Pos+1, [{Field, DefVal}|Opts]}; + {_, Val} -> + {Pos+1, [{Field, Val}|Opts]} + end + end, {2, []}, Fields), + SubjectAuthor = proplists:get_value(subject_author, CompactOpts, <<"">>), + Subject = proplists:get_value(subject, CompactOpts, <<"">>), + Subscribers = proplists:get_value(subscribers, CompactOpts, []), + [{subject, Subject}, + {subject_author, SubjectAuthor}, + {subscribers, Subscribers} + | lists:reverse(Opts1)]. + +config_fields() -> + [subject, subject_author, subscribers | record_info(fields, config)]. + -spec destroy_room(muc_destroy(), state()) -> {result, undefined, stop}. destroy_room(DEl, StateData) -> Destroy = DEl#muc_destroy{xmlns = ?NS_MUC_USER}, @@ -3703,7 +3734,7 @@ process_iq_disco_info(From, #iq{type = get, lang = Lang, -spec iq_disco_info_extras(binary(), state()) -> xdata(). iq_disco_info_extras(Lang, StateData) -> Fs1 = [{description, (StateData#state.config)#config.description}, - {occupants, ?DICT:size(StateData#state.users)}, + {occupants, ?DICT:size(StateData#state.nicks)}, {contactjid, get_owners(StateData)}], Fs2 = case (StateData#state.config)#config.pubsub of Node when is_binary(Node), Node /= <<"">> -> @@ -3938,20 +3969,18 @@ get_roomdesc_tail(StateData, Lang) -> true -> <<"">>; _ -> translate:translate(Lang, <<"private, ">>) end, - Len = (?DICT):size(StateData#state.users), + Len = (?DICT):size(StateData#state.nicks), <<" (", Desc/binary, (integer_to_binary(Len))/binary, ")">>. -spec get_mucroom_disco_items(state()) -> disco_items(). get_mucroom_disco_items(StateData) -> - Items = lists:map( - fun({_LJID, Info}) -> - Nick = Info#user.nick, - #disco_item{jid = jid:make(StateData#state.room, - StateData#state.host, - Nick), - name = Nick} - end, - (?DICT):to_list(StateData#state.users)), + Items = ?DICT:fold( + fun(Nick, _, Acc) -> + [#disco_item{jid = jid:make(StateData#state.room, + StateData#state.host, + Nick), + name = Nick}|Acc] + end, [], StateData#state.nicks), #disco_items{items = Items}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |