593
593
%% {stop, Reason, Reply, NewStateData}
594
594
%%----------------------------------------------------------------------
595
595
handle_sync_event({get_disco_item, JID, Lang}, _From, StateName, StateData) ->
596
FAffiliation = get_affiliation(JID, StateData),
597
FRole = get_role(JID, StateData),
599
case ((StateData#state.config)#config.public_list == true) orelse
600
(FRole /= none) orelse
601
(FAffiliation == admin) orelse
602
(FAffiliation == owner) of
604
Desc = case (StateData#state.config)#config.public of
608
translate:translate(Lang, "private, ")
610
Len = ?DICT:fold(fun(_, _, Acc) -> Acc + 1 end, 0,
611
StateData#state.users),
612
" (" ++ Desc ++ integer_to_list(Len) ++ ")";
616
Reply = case ((StateData#state.config)#config.public == true) orelse
617
(FRole /= none) orelse
618
(FAffiliation == admin) orelse
619
(FAffiliation == owner) of
596
case (StateData#state.config)#config.public_list of
598
Reply = get_roomdesc_reply(StateData,
599
get_roomdesc_tail(StateData, Lang)),
600
{reply, Reply, StateName, StateData};
602
case is_occupant_or_admin(JID, StateData) of
621
{item, get_title(StateData) ++ Tail};
604
Reply = get_roomdesc_reply(StateData, get_roomdesc_tail(
606
{reply, Reply, StateName, StateData};
625
{reply, Reply, StateName, StateData};
608
{reply, false, StateName, StateData}
626
611
handle_sync_event(get_config, _From, StateName, StateData) ->
627
612
{reply, {ok, StateData#state.config}, StateName, StateData};
628
613
handle_sync_event(get_state, _From, StateName, StateData) ->
1000
985
LJID = jlib:jid_tolower(JID),
1001
986
?DICT:is_key(LJID, StateData#state.users).
988
%% Check if the user is occupant of the room, or at least is an admin or owner.
989
is_occupant_or_admin(JID, StateData) ->
990
FAffiliation = get_affiliation(JID, StateData),
991
FRole = get_role(JID, StateData),
992
case (FRole /= none) orelse
993
(FAffiliation == admin) orelse
994
(FAffiliation == owner) of
1005
1002
%%% Handle IQ queries of vCard
3329
3326
{error, ?ERR_NOT_ALLOWED};
3331
3328
process_iq_disco_items(From, get, _Lang, StateData) ->
3332
FAffiliation = get_affiliation(From, StateData),
3333
FRole = get_role(From, StateData),
3334
case ((StateData#state.config)#config.public_list == true) orelse
3335
(FRole /= none) orelse
3336
(FAffiliation == admin) orelse
3337
(FAffiliation == owner) of
3329
case (StateData#state.config)#config.public_list of
3341
fun({_LJID, Info}) ->
3342
Nick = Info#user.nick,
3343
{xmlelement, "item",
3344
[{"jid", jlib:jid_to_string(
3345
{StateData#state.room,
3346
StateData#state.host,
3348
{"name", Nick}], []}
3350
?DICT:to_list(StateData#state.users)),
3351
{result, UList, StateData};
3331
{result, get_mucroom_disco_items(StateData), StateData};
3353
{error, ?ERR_FORBIDDEN}
3333
case is_occupant_or_admin(From, StateData) of
3335
{result, get_mucroom_disco_items(StateData), StateData};
3337
{error, ?ERR_FORBIDDEN}
3356
3341
process_iq_captcha(_From, get, _Lang, _SubEl, _StateData) ->
3360
get_roomdesc_reply(StateData, Tail) ->
3361
case ((StateData#state.config)#config.public == true) of
3363
{item, get_title(StateData) ++ Tail};
3368
get_roomdesc_tail(StateData, Lang) ->
3369
Desc = case (StateData#state.config)#config.public of
3373
translate:translate(Lang, "private, ")
3375
Len = ?DICT:fold(fun(_, _, Acc) -> Acc + 1 end, 0, StateData#state.users),
3376
" (" ++ Desc ++ integer_to_list(Len) ++ ")".
3378
get_mucroom_disco_items(StateData) ->
3380
fun({_LJID, Info}) ->
3381
Nick = Info#user.nick,
3382
{xmlelement, "item",
3383
[{"jid", jlib:jid_to_string({StateData#state.room,
3384
StateData#state.host, Nick})},
3385
{"name", Nick}], []}
3387
?DICT:to_list(StateData#state.users)).
3376
3389
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3377
3390
% Invitation support