⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_muc_room.erl

📁 ejabberd-0.7.5 分布式Jabber服务器
💻 ERL
📖 第 1 页 / 共 5 页
字号:
% 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 + -