📄 mod_muc_room.erl
字号:
% Admin stuffprocess_iq_admin(From, set, Lang, SubEl, StateData) -> {xmlelement, _, _, Items} = SubEl, process_admin_items_set(From, Items, Lang, StateData);process_iq_admin(From, get, Lang, SubEl, StateData) -> case xml:get_subtag(SubEl, "item") of false -> {error, ?ERR_BAD_REQUEST}; Item -> FAffiliation = get_affiliation(From, StateData), FRole = get_role(From, StateData), case xml:get_tag_attr("role", Item) of false -> case xml:get_tag_attr("affiliation", Item) of false -> {error, ?ERR_BAD_REQUEST}; {value, StrAffiliation} -> case catch list_to_affiliation(StrAffiliation) of {'EXIT', _} -> {error, ?ERR_BAD_REQUEST}; SAffiliation -> if (FAffiliation == owner) or (FAffiliation == admin) -> Items = items_with_affiliation( SAffiliation, StateData), {result, Items, StateData}; true -> ErrText = "Administrator privileges required", {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end end end; {value, StrRole} -> case catch list_to_role(StrRole) of {'EXIT', _} -> {error, ?ERR_BAD_REQUEST}; SRole -> if FRole == moderator -> Items = items_with_role(SRole, StateData), {result, Items, StateData}; true -> ErrText = "Moderator privileges required", {error, ?ERRT_FORBIDDEN(Lang, ErrText)} end end end end.items_with_role(SRole, StateData) -> lists:map( fun({_, U}) -> user_to_item(U, StateData) end, search_role(SRole, StateData)).items_with_affiliation(SAffiliation, StateData) -> lists:map( fun({JID, Affiliation}) -> {xmlelement, "item", [{"affiliation", affiliation_to_list(Affiliation)}, {"jid", jlib:jid_to_string(JID)}], []} end, search_affiliation(SAffiliation, StateData)).user_to_item(#user{role = Role, nick = Nick, jid = JID }, StateData) -> Affiliation = get_affiliation(JID, StateData), {xmlelement, "item", [{"role", role_to_list(Role)}, {"affiliation", affiliation_to_list(Affiliation)}, {"nick", Nick}, {"jid", jlib:jid_to_string(JID)}], []}.search_role(Role, StateData) -> lists:filter( fun({_, #user{role = R}}) -> Role == R end, ?DICT:to_list(StateData#state.users)).search_affiliation(Affiliation, StateData) -> lists:filter( fun({_, A}) -> Affiliation == A end, ?DICT:to_list(StateData#state.affiliations)).process_admin_items_set(UJID, Items, Lang, StateData) -> UAffiliation = get_affiliation(UJID, StateData), URole = get_role(UJID, StateData), case find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, []) of {result, Res} -> NSD = lists:foldl( fun(E, SD) -> case catch ( case E of {JID, role, none, Reason} -> catch send_kickban_presence( JID, Reason, "307", SD), set_role(JID, none, SD); {JID, affiliation, outcast, Reason} -> catch send_kickban_presence( JID, Reason, "301", SD), set_affiliation( JID, outcast, set_role(JID, none, SD)); {JID, affiliation, A, Reason} when (A == admin) or (A == owner)-> SD1 = set_affiliation(JID, A, SD), SD2 = set_role(JID, moderator, SD1), send_update_presence(JID, SD2), SD2; {JID, affiliation, member, Reason} -> SD1 = set_affiliation( JID, member, SD), SD2 = set_role(JID, participant, SD1), send_update_presence(JID, SD2), SD2; {JID, role, R, Reason} -> SD1 = set_role(JID, R, SD), catch send_new_presence(JID, SD1), SD1; {JID, affiliation, A, Reason} -> SD1 = set_affiliation(JID, A, SD), send_update_presence(JID, SD1), SD1 end ) of {'EXIT', ErrReason} -> io:format("MUC ITEMS SET ERR: ~p~n", [ErrReason]), SD; NSD -> NSD end end, StateData, Res), io:format("MUC SET: ~p~n", [Res]), case (NSD#state.config)#config.persistent of true -> mod_muc:store_room(NSD#state.room, make_opts(NSD)); _ -> ok end, {result, [], NSD}; Err -> Err end. find_changed_items(UJID, UAffiliation, URole, [], _Lang, StateData, Res) -> {result, Res};find_changed_items(UJID, UAffiliation, URole, [{xmlcdata, _} | Items], Lang, StateData, Res) -> find_changed_items(UJID, UAffiliation, URole, Items, Lang, StateData, Res);find_changed_items(UJID, UAffiliation, URole, [{xmlelement, "item", Attrs, _Els} = Item | Items], Lang, StateData, Res) -> TJID = case xml:get_attr("jid", Attrs) of {value, S} -> case jlib:string_to_jid(S) of error -> ErrText = io_lib:format( translate:translate( Lang, "JID ~s is invalid"), [S]), {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; J -> {value, J} end; _ -> case xml:get_attr("nick", Attrs) of {value, N} -> case find_jid_by_nick(N, StateData) of false -> ErrText = io_lib:format( translate:translate( Lang, "Nickname ~s does not exist in the room"), [N]), {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText)}; J -> {value, J} end; _ -> {error, ?ERR_BAD_REQUEST} end end, case TJID of {value, JID} -> TAffiliation = get_affiliation(JID, StateData), TRole = get_role(JID, StateData), case xml:get_attr("role", Attrs) of false -> case xml:get_attr("affiliation", Attrs) of false -> {error, ?ERR_BAD_REQUEST}; {value, StrAffiliation} -> case catch list_to_affiliation(StrAffiliation) of {'EXIT', _} -> ErrText1 = io_lib:format( translate:translate( Lang, "Invalid affiliation: ~s"), [StrAffiliation]), {error, ?ERRT_NOT_ACCEPTABLE(Lang, ErrText1)}; SAffiliation -> case can_change_ra( UAffiliation, URole, TAffiliation, TRole, affiliation, SAffiliation) of nothing -> find_changed_items( UJID, UAffiliation, URole, Items, Lang, StateData, Res); true -> find_changed_items( UJID, UAffiliation, URole, Items, Lang, StateData, [{jlib:jid_remove_resource(JID), affiliation, SAffiliation, xml:get_path_s( Item, [{elem, "reason"}, cdata])} | Res]); _ -> {error, ?ERR_NOT_ALLOWED} end end end; {value, StrRole} -> case catch list_to_role(StrRole) of {'EXIT', _} -> ErrText1 = io_lib:format( translate:translate( Lang, "Invalid role: ~s"), [StrRole]), {error, ?ERRT_BAD_REQUEST(Lang, ErrText1)}; SRole -> case can_change_ra( UAffiliation, URole, TAffiliation, TRole, role, SRole) of nothing -> find_changed_items( UJID, UAffiliation, URole, Items, Lang, StateData, Res); true -> find_changed_items( UJID, UAffiliation, URole, Items, Lang, StateData, [{JID, role, SRole, xml:get_path_s( Item, [{elem, "reason"}, cdata])} | Res]); _ -> {error, ?ERR_NOT_ALLOWED} end end end; Err -> Err end;find_changed_items(_UJID, _UAffiliation, _URole, _Items, _Lang, _StateData, _Res) -> {error, ?ERR_BAD_REQUEST}.can_change_ra(FAffiliation, FRole, TAffiliation, TRole, affiliation, Value) when (TAffiliation == Value) -> nothing;can_change_ra(FAffiliation, FRole, TAffiliation, TRole, role, Value) when (TRole == Value) -> nothing;can_change_ra(FAffiliation, FRole, outcast, TRole, affiliation, none) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(FAffiliation, FRole, none, TRole, affiliation, outcast) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(FAffiliation, FRole, none, TRole, affiliation, member) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(owner, FRole, none, TRole, affiliation, admin) -> true;can_change_ra(owner, FRole, none, TRole, affiliation, owner) -> true;can_change_ra(FAffiliation, FRole, member, TRole, affiliation, outcast) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(FAffiliation, FRole, member, TRole, affiliation, none) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(owner, FRole, member, TRole, affiliation, admin) -> true;can_change_ra(owner, FRole, member, TRole, affiliation, owner) -> true;can_change_ra(owner, FRole, admin, TRole, affiliation, member) -> true;can_change_ra(owner, FRole, admin, TRole, affiliation, owner) -> true;can_change_ra(owner, FRole, owner, TRole, affiliation, admin) -> true;can_change_ra(FAffiliation, FRole, TAffiliation, TRole, affiliation, Value) -> false;can_change_ra(FAffiliation, moderator, TAffiliation, visitor, role, none) -> true;can_change_ra(FAffiliation, moderator, TAffiliation, visitor, role, participant) -> true;can_change_ra(FAffiliation, FRole, TAffiliation, visitor, role, moderator) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(FAffiliation, moderator, TAffiliation, participant, role, none) -> true;can_change_ra(FAffiliation, moderator, TAffiliation, participant, role, visitor) -> true;can_change_ra(FAffiliation, FRole, TAffiliation, participant, role, moderator) when (FAffiliation == owner) or (FAffiliation == admin) -> true;can_change_ra(FAffiliation, FRole, owner, moderator, role, participant) -> false;can_change_ra(owner, FRole, TAffiliation, moderator, role, participant) -> true;can_change_ra(FAffiliation, FRole, admin, moderator, role, participant) -> false;can_change_ra(admin, FRole, TAffiliation, moderator, role, participant) -> true;can_change_ra(FAffiliation, FRole, TAffiliation, TRole, role, Value) -> false.send_kickban_presence(JID, Reason, Code, StateData) -> LJID = jlib:jid_tolower(JID), LJIDs = case LJID of {U, S, ""} -> ?DICT:fold( fun(J, _, Js) -> case J of {U, S, _} -> [J | Js]; _ -> Js end end, [], StateData#state.users); _ -> case ?DICT:is_key(LJID, StateData#state.users) of true -> [LJID]; _ -> [] end end, lists:foreach(fun(J) -> send_kickban_presence1(J, Reason, Code, StateData) end, LJIDs).send_kickban_presence1(UJID, Reason, Code, StateData) -> {ok, #user{jid = RealJID, nick = Nick}} = ?DICT:find(jlib:jid_tolower(UJID), StateData#state.users), Affiliation = get_affiliation(UJID, StateData), SAffiliation = affiliation_to_list(Affiliation), lists:foreach( fun({LJID, Info}) -> ItemAttrs = [{"affiliation", SAffiliation}, {"role", "none"}], ItemEls = case Reason of "" -> []; _ -> [{xmlelement, "reason", [], [{xmlcdata, Reason}]}] end, Packet = {xmlelement, "presence", [{"type", "unavailable"}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", ItemAttrs, ItemEls}, {xmlelement, "status", [{"code", Code}], []}]}]}, ejabberd_router:route( jlib:jid_replace_resource(StateData#state.jid, Nick), Info#user.jid, Packet) end, ?DICT:to_list(StateData#state.users)).%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Owner stuffprocess_iq_owner(From, set, Lang, SubEl, StateData) -> FAffiliation = get_affiliation(From, StateData),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -