📄 mod_irc_connection.erl
字号:
end, Msg1), ejabberd_router:route( jlib:make_jid(lists:concat([FromUser, "!", StateData#state.server]), StateData#state.myname, ""), StateData#state.user, {xmlelement, "message", [{"type", "chat"}], [{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).process_notice(StateData, Nick, From, String) -> [FromUser | _] = string:tokens(From, "!"), {ok, Msg, _} = regexp:sub(String, ".*NOTICE[^:]*:", ""), Msg1 = case Msg of [1, $A, $C, $T, $I, $O, $N, $ | Rest] -> "/me " ++ Rest; _ -> Msg end, Msg2 = lists:filter( fun(C) -> if (C < 32) and (C /= 9) and (C /= 10) and (C /= 13) -> false; true -> true end end, Msg1), ejabberd_router:route( jlib:make_jid(lists:concat([FromUser, "!", StateData#state.server]), StateData#state.myname, ""), StateData#state.user, {xmlelement, "message", [{"type", "chat"}], [{xmlelement, "body", [], [{xmlcdata, "NOTICE: " ++ Msg2}]}]}).process_version(StateData, Nick, From) -> [FromUser | _] = string:tokens(From, "!"), send_text( StateData, io_lib:format("NOTICE ~s :\001VERSION " "ejabberd IRC transport ~s (c) Alexey Shchepin" "\001\r\n", [FromUser, ?VERSION]) ++ io_lib:format("NOTICE ~s :\001VERSION " "http://ejabberd.jabberstudio.org/" "\001\r\n", [FromUser])).process_topic(StateData, Chan, From, String) -> [FromUser | _] = string:tokens(From, "!"), {ok, Msg, _} = regexp:sub(String, ".*TOPIC[^:]*:", ""), Msg1 = lists:filter( fun(C) -> if (C < 32) and (C /= 9) and (C /= 10) and (C /= 13) -> false; true -> true end end, Msg), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "message", [{"type", "groupchat"}], [{xmlelement, "subject", [], [{xmlcdata, Msg1}]}, {xmlelement, "body", [], [{xmlcdata, "/me has changed the subject to: " ++ Msg1}]}]}).process_part(StateData, Chan, From, String) -> [FromUser | FromIdent] = string:tokens(From, "!"), {ok, Msg, _} = regexp:sub(String, ".*PART[^:]*", ""), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "message", [{"type", "groupchat"}], [{xmlelement, "body", [], [{xmlcdata, "/me has part: " ++ Msg ++ "(" ++ FromIdent ++ ")" }]}]}), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "presence", [{"type", "unavailable"}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "member"}, {"role", "none"}], []}]}, {xmlelement, "status", [], [{xmlcdata, Msg ++ "(" ++ FromIdent ++ ")"}]}] }), case catch dict:update(Chan, fun(Ps) -> remove_element(FromUser, Ps) end, StateData#state.channels) of {'EXIT', _} -> StateData; NS -> StateData#state{channels = NS} end.process_quit(StateData, From, String) -> [FromUser | FromIdent] = string:tokens(From, "!"), {ok, Msg, _} = regexp:sub(String, ".*QUIT[^:]*:", ""), NewChans = dict:map( fun(Chan, Ps) -> case ?SETS:is_member(FromUser, Ps) of true -> ejabberd_router:route( jlib:make_jid( lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "message", [{"type", "groupchat"}], [{xmlelement, "body", [], [{xmlcdata, "/me has quit: " ++ Msg ++ "(" ++ FromIdent ++ ")" }]}]}), ejabberd_router:route( jlib:make_jid( lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "presence", [{"type", "unavailable"}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "member"}, {"role", "none"}], []}]}, {xmlelement, "status", [], [{xmlcdata, Msg ++ "(" ++ FromIdent ++ ")"}]} ]}), remove_element(FromUser, Ps); _ -> Ps end end, StateData#state.channels), StateData.process_join(StateData, Channel, From, String) -> [FromUser | FromIdent] = string:tokens(From, "!"), Chan = lists:subtract(Channel, ":#"), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "presence", [], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "member"}, {"role", "participant"}], []}]}, {xmlelement, "status", [], [{xmlcdata, FromIdent}]}]}), {ok, Msg, _} = regexp:sub(String, ".*JOIN[^:]*:", ""), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "message", [{"type", "groupchat"}], [{xmlelement, "body", [], [{xmlcdata, "/me has joined " ++ Msg ++ "(" ++ FromIdent ++ ")" }]}]}), case catch dict:update(Chan, fun(Ps) -> ?SETS:add_element(FromUser, Ps) end, StateData#state.channels) of {'EXIT', _} -> StateData; NS -> StateData#state{channels = NS} end.process_mode_o(StateData, Chan, From, Nick, Affiliation, Role) -> %Msg = lists:last(string:tokens(String, ":")), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, Nick), StateData#state.user, {xmlelement, "presence", [], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", Affiliation}, {"role", Role}], []}]}]}).process_kick(StateData, Chan, From, Nick) -> %Msg = lists:last(string:tokens(String, ":")), ejabberd_router:route( jlib:make_jid(lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, Nick), StateData#state.user, {xmlelement, "presence", [{"type", "unavailable"}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "none"}, {"role", "none"}], []}, {xmlelement, "status", [{"code", "307"}], []} ]}]}).process_nick(StateData, From, NewNick) -> [FromUser | _] = string:tokens(From, "!"), Nick = lists:subtract(NewNick, ":"), NewChans = dict:map( fun(Chan, Ps) -> case ?SETS:is_member(FromUser, Ps) of true -> ejabberd_router:route( jlib:make_jid( lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, FromUser), StateData#state.user, {xmlelement, "presence", [{"type", "unavailable"}], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "member"}, {"role", "participant"}, {"nick", Nick}], []}, {xmlelement, "status", [{"code", "303"}], []} ]}]}), ejabberd_router:route( jlib:make_jid( lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, Nick), StateData#state.user, {xmlelement, "presence", [], [{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}], [{xmlelement, "item", [{"affiliation", "member"}, {"role", "participant"}], []} ]}]}), ?SETS:add_element(Nick, remove_element(FromUser, Ps)); _ -> Ps end end, StateData#state.channels), StateData#state{channels = NewChans}.process_error(StateData, String) -> lists:foreach( fun(Chan) -> ejabberd_router:route( jlib:make_jid( lists:concat([Chan, "%", StateData#state.server]), StateData#state.myname, StateData#state.nick), StateData#state.user, {xmlelement, "presence", [{"type", "error"}], [{xmlelement, "error", [{"code", "502"}], [{xmlcdata, String}]}]}) end, dict:fetch_keys(StateData#state.channels)).remove_element(E, Set) -> case ?SETS:is_element(E, Set) of true -> ?SETS:del_element(E, Set); _ -> Set end.iq_admin(StateData, Channel, From, To, #iq{type = Type, xmlns = XMLNS, sub_el = SubEl} = IQ) -> case catch process_iq_admin(StateData, Channel, Type, SubEl) of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); Res -> if Res /= ignore -> ResIQ = case Res of {result, ResEls} -> IQ#iq{type = result, sub_el = [{xmlelement, "query", [{"xmlns", XMLNS}], ResEls }]}; {error, Error} -> IQ#iq{type = error, sub_el = [SubEl, Error]} end, ejabberd_router:route(To, From, jlib:iq_to_xml(ResIQ)); true -> ok end end.process_iq_admin(StateData, Channel, set, SubEl) -> case xml:get_subtag(SubEl, "item") of false -> {error, ?ERR_BAD_REQUEST}; ItemEl -> Nick = xml:get_tag_attr_s("nick", ItemEl), Affiliation = xml:get_tag_attr_s("affiliation", ItemEl), Role = xml:get_tag_attr_s("role", ItemEl), Reason = xml:get_path_s(ItemEl, [{elem, "reason"}, cdata]), process_admin(StateData, Channel, Nick, Affiliation, Role, Reason) end;process_iq_admin(StateData, Channel, get, SubEl) -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED}.process_admin(StateData, Channel, "", Affiliation, Role, Reason) -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED};process_admin(StateData, Channel, Nick, Affiliation, "none", Reason) -> case Reason of "" -> send_text(StateData, io_lib:format("KICK #~s ~s\r\n", [Channel, Nick])); _ -> send_text(StateData, io_lib:format("KICK #~s ~s :~s\r\n", [Channel, Nick, Reason])) end, {result, []};process_admin(StateData, Channel, Nick, Affiliation, Role, Reason) -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED}.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -