aboutsummaryrefslogtreecommitdiff
path: root/src/mod_disco.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_disco.erl')
-rw-r--r--src/mod_disco.erl85
1 files changed, 37 insertions, 48 deletions
diff --git a/src/mod_disco.erl b/src/mod_disco.erl
index f0d23a0ca..fd992d49d 100644
--- a/src/mod_disco.erl
+++ b/src/mod_disco.erl
@@ -37,8 +37,7 @@
get_local_features/5, get_local_services/5,
process_sm_iq_items/1, process_sm_iq_info/1,
get_sm_identity/5, get_sm_features/5, get_sm_items/5,
- get_info/5, transform_module_options/1, mod_opt_type/1,
- mod_options/1, depends/2]).
+ get_info/5, mod_opt_type/1, mod_options/1, depends/2]).
-include("logger.hrl").
-include("translate.hrl").
@@ -63,7 +62,7 @@ start(Host, Opts) ->
catch ets:new(disco_extra_domains,
[named_table, ordered_set, public,
{heir, erlang:group_leader(), none}]),
- ExtraDomains = gen_mod:get_opt(extra_domains, Opts),
+ ExtraDomains = mod_disco_opt:extra_domains(Opts),
lists:foreach(fun (Domain) ->
register_extra_domain(Host, Domain)
end,
@@ -112,19 +111,16 @@ stop(Host) ->
ok.
reload(Host, NewOpts, OldOpts) ->
- case gen_mod:is_equal_opt(extra_domains, NewOpts, OldOpts) 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.
+ NewDomains = mod_disco_opt:extra_domains(NewOpts),
+ OldDomains = mod_disco_opt:extra_domains(OldOpts),
+ lists:foreach(
+ fun(Domain) ->
+ register_extra_domain(Host, Domain)
+ end, NewDomains -- OldDomains),
+ lists:foreach(
+ fun(Domain) ->
+ unregister_extra_domain(Host, Domain)
+ end, OldDomains -- NewDomains).
-spec register_extra_domain(binary(), binary()) -> true.
register_extra_domain(Host, Domain) ->
@@ -177,7 +173,7 @@ process_local_iq_info(#iq{type = get, lang = Lang,
binary(), binary()) -> [identity()].
get_local_identity(Acc, _From, To, <<"">>, _Lang) ->
Host = To#jid.lserver,
- Name = gen_mod:get_module_opt(Host, ?MODULE, name),
+ Name = mod_disco_opt:name(Host),
Acc ++ [#identity{category = <<"server">>,
type = <<"im">>,
name = Name}];
@@ -238,7 +234,7 @@ get_vh_services(Host) ->
Hosts = lists:sort(fun (H1, H2) ->
byte_size(H1) >= byte_size(H2)
end,
- ejabberd_config:get_myhosts()),
+ ejabberd_option:hosts()),
lists:filter(fun (H) ->
case lists:dropwhile(fun (VH) ->
not
@@ -374,23 +370,6 @@ get_user_resources(User, Server) ->
[#disco_item{jid = jid:make(User, Server, Resource), name = User}
|| Resource <- lists:sort(Rs)].
--spec transform_module_options(gen_mod:opts()) -> gen_mod:opts().
-transform_module_options(Opts) ->
- lists:map(
- fun({server_info, Infos}) ->
- NewInfos = lists:map(
- fun({Modules, Name, URLs}) ->
- [[{modules, Modules},
- {name, Name},
- {urls, URLs}]];
- (Opt) ->
- Opt
- end, Infos),
- {server_info, NewInfos};
- (Opt) ->
- Opt
- end, Opts).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Support for: XEP-0157 Contact Addresses for XMPP Services
@@ -411,7 +390,7 @@ get_info(Acc, _, _, _Node, _) -> Acc.
-spec get_fields(binary(), module()) -> [xdata_field()].
get_fields(Host, Module) ->
- Fields = gen_mod:get_module_opt(Host, ?MODULE, server_info),
+ Fields = mod_disco_opt:server_info(Host),
Fields1 = lists:filter(fun ({Modules, _, _}) ->
case Modules of
all -> true;
@@ -429,19 +408,29 @@ depends(_Host, _Opts) ->
[].
mod_opt_type(extra_domains) ->
- fun (Hs) -> [iolist_to_binary(H) || H <- Hs] end;
-mod_opt_type(name) -> fun iolist_to_binary/1;
+ econf:list(econf:binary());
+mod_opt_type(name) ->
+ econf:binary();
mod_opt_type(server_info) ->
- fun (L) ->
- lists:map(fun (Opts) ->
- Mods = proplists:get_value(modules, Opts, all),
- Name = proplists:get_value(name, Opts, <<>>),
- URLs = proplists:get_value(urls, Opts, []),
- {Mods, Name, URLs}
- end,
- L)
- end.
-
+ econf:list(
+ econf:and_then(
+ econf:options(
+ #{name => econf:binary(),
+ urls => econf:list(econf:binary()),
+ modules =>
+ econf:either(
+ all,
+ econf:list(econf:beam()))}),
+ fun(Opts) ->
+ Mods = proplists:get_value(modules, Opts, all),
+ Name = proplists:get_value(name, Opts, <<>>),
+ URLs = proplists:get_value(urls, Opts, []),
+ {Mods, Name, URLs}
+ end)).
+
+-spec mod_options(binary()) -> [{server_info,
+ [{all | [module()], binary(), [binary()]}]} |
+ {atom(), any()}].
mod_options(_Host) ->
[{extra_domains, []},
{server_info, []},