diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-08-09 13:36:43 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2016-08-09 13:36:43 +0300 |
commit | 1fc58ace2f139ea01c13bac0a8f30735d9f8af29 (patch) | |
tree | 86e7339e0227eaeb02b7e5a6ff2dacaf019e8448 /src/mod_muc_room.erl | |
parent | Update to released version (diff) |
Add commands for MUC subscriptions management
Diffstat (limited to '')
-rw-r--r-- | src/mod_muc_room.erl | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 773953c4..e5ed4cc6 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -749,6 +749,60 @@ handle_sync_event({change_state, NewStateData}, _From, handle_sync_event({process_item_change, Item, UJID}, _From, StateName, StateData) -> NSD = process_item_change(Item, StateData, UJID), {reply, {ok, NSD}, StateName, NSD}; +handle_sync_event({muc_subscribe, From, Nick, Nodes}, _From, + StateName, StateData) -> + SubEl = #xmlel{name = <<"subscribe">>, + attrs = [{<<"xmlns">>, ?NS_MUCSUB}, {<<"nick">>, Nick}], + children = [#xmlel{name = <<"event">>, + attrs = [{<<"node">>, Node}]} + || Node <- Nodes]}, + IQ = #iq{type = set, id = randoms:get_string(), + xmlns = ?NS_MUCSUB, sub_el = SubEl}, + Packet = jlib:iq_to_xml(IQ#iq{sub_el = [SubEl]}), + Config = StateData#state.config, + CaptchaRequired = Config#config.captcha_protected, + PasswordProtected = Config#config.password_protected, + TmpConfig = Config#config{captcha_protected = false, + password_protected = false}, + TmpState = StateData#state{config = TmpConfig}, + case process_iq_mucsub(From, Packet, IQ, TmpState) of + {result, _, NewState} -> + NewConfig = (NewState#state.config)#config{ + captcha_protected = CaptchaRequired, + password_protected = PasswordProtected}, + {reply, {ok, get_subscription_nodes(Packet)}, StateName, + NewState#state{config = NewConfig}}; + {ignore, NewState} -> + NewConfig = (NewState#state.config)#config{ + captcha_protected = CaptchaRequired, + password_protected = PasswordProtected}, + {reply, {error, <<"Requrest is ignored">>}, + NewState#state{config = NewConfig}}; + {error, Err, NewState} -> + NewConfig = (NewState#state.config)#config{ + captcha_protected = CaptchaRequired, + password_protected = PasswordProtected}, + {reply, {error, get_error_text(Err)}, StateName, + NewState#state{config = NewConfig}}; + {error, Err} -> + {reply, {error, get_error_text(Err)}, StateName, StateData} + end; +handle_sync_event({muc_unsubscribe, From}, _From, StateName, StateData) -> + SubEl = #xmlel{name = <<"unsubscribe">>, + attrs = [{<<"xmlns">>, ?NS_MUCSUB}]}, + IQ = #iq{type = set, id = randoms:get_string(), + xmlns = ?NS_MUCSUB, sub_el = SubEl}, + Packet = jlib:iq_to_xml(IQ), + case process_iq_mucsub(From, Packet, IQ, StateData) of + {result, _, NewState} -> + {reply, ok, StateName, NewState}; + {ignore, NewState} -> + {reply, {error, <<"Requrest is ignored">>}, NewState}; + {error, Err, NewState} -> + {reply, {error, get_error_text(Err)}, StateName, NewState}; + {error, Err} -> + {reply, {error, get_error_text(Err)}, StateName, StateData} + end; handle_sync_event(_Event, _From, StateName, StateData) -> Reply = ok, {reply, Reply, StateName, StateData}. @@ -1346,6 +1400,14 @@ get_error_condition2(Packet) -> <- EEls], {condition, Condition}. +get_error_text(Error) -> + case fxml:get_subtag_with_xmlns(Error, <<"text">>, ?NS_STANZAS) of + #xmlel{} = Tag -> + fxml:get_tag_cdata(Tag); + false -> + <<"">> + end. + make_reason(Packet, From, StateData, Reason1) -> {ok, #user{nick = FromNick}} = (?DICT):find(jid:tolower(From), StateData#state.users), Condition = get_error_condition(Packet), @@ -4608,6 +4670,18 @@ process_iq_mucsub(From, _Packet, NewStateData = remove_subscription(From, User, StateData), store_room(NewStateData), {result, [], NewStateData}; + error when From#jid.lresource == <<"">> -> + {LUser, LServer, _} = LJID, + NewStateData = + dict:fold( + fun({U, S, _}, #user{jid = J, is_subscriber = true} = User, + AccState) when U == LUser, S == LServer -> + remove_subscription(J, User, AccState); + (_, _, AccState) -> + AccState + end, StateData, StateData#state.users), + store_room(NewStateData), + {result, [], NewStateData}; _ -> {result, [], StateData} end; |