diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-02-22 19:46:47 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-02-22 19:46:47 +0300 |
commit | 3c4057ff553928d4e4ab40e410dbc6a478dd8206 (patch) | |
tree | a0272f84a1221db928cfd4c9f44d9bed6e196bc8 /src/mod_disco.erl | |
parent | Make sure all hooks are called with proper host (diff) |
Reload modules when reloading configuration file
Diffstat (limited to 'src/mod_disco.erl')
-rw-r--r-- | src/mod_disco.erl | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/mod_disco.erl b/src/mod_disco.erl index 2de8679e..88c06c54 100644 --- a/src/mod_disco.erl +++ b/src/mod_disco.erl @@ -32,7 +32,7 @@ -behaviour(gen_mod). --export([start/2, stop/1, process_local_iq_items/1, +-export([start/2, stop/1, reload/3, process_local_iq_items/1, process_local_iq_info/1, get_local_identity/5, get_local_features/5, get_local_services/5, process_sm_iq_items/1, process_sm_iq_info/1, @@ -118,10 +118,51 @@ stop(Host) -> {{'_', Host}}), ok. +reload(Host, NewOpts, OldOpts) -> + case gen_mod:is_equal_opt(extra_domains, NewOpts, OldOpts, + fun(Hs) -> + [iolist_to_binary(H) || H <- Hs] + end, []) of + {false, NewDomains, OldDomains} -> + lists:foreach( + fun(Domain) -> + register_extra_domain(Host, Domain) + end, NewDomains -- OldDomains), + lists:foreach( + fun(Domain) -> + unregister_extra_domain(Host, Domain) + end, OldDomains -- NewDomains); + true -> + ok + end, + case gen_mod:is_equal_opt(iqdisc, NewOpts, OldOpts, + fun gen_iq_handler:check_type/1, + one_queue) of + {false, IQDisc, _} -> + gen_iq_handler:add_iq_handler(ejabberd_local, Host, + ?NS_DISCO_ITEMS, ?MODULE, + process_local_iq_items, IQDisc), + gen_iq_handler:add_iq_handler(ejabberd_local, Host, + ?NS_DISCO_INFO, ?MODULE, + process_local_iq_info, IQDisc), + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, + ?NS_DISCO_ITEMS, ?MODULE, process_sm_iq_items, + IQDisc), + gen_iq_handler:add_iq_handler(ejabberd_sm, Host, + ?NS_DISCO_INFO, ?MODULE, process_sm_iq_info, + IQDisc); + true -> + ok + end. + -spec register_extra_domain(binary(), binary()) -> true. register_extra_domain(Host, Domain) -> ets:insert(disco_extra_domains, {{Domain, Host}}). +-spec unregister_extra_domain(binary(), binary()) -> true. +unregister_extra_domain(Host, Domain) -> + ets:delete_object(disco_extra_domains, {{Domain, Host}}). + -spec process_local_iq_items(iq()) -> iq(). process_local_iq_items(#iq{type = set, lang = Lang} = IQ) -> Txt = <<"Value 'set' of 'type' attribute is not allowed">>, |