diff options
Diffstat (limited to 'src/muc_roomconfig.erl')
-rw-r--r-- | src/muc_roomconfig.erl | 1675 |
1 files changed, 1675 insertions, 0 deletions
diff --git a/src/muc_roomconfig.erl b/src/muc_roomconfig.erl new file mode 100644 index 000000000..73ceb649e --- /dev/null +++ b/src/muc_roomconfig.erl @@ -0,0 +1,1675 @@ +%% Created automatically by xdata generator (xdata_codec.erl) +%% Source: muc_roomconfig.xdata +%% Form type: http://jabber.org/protocol/muc#roomconfig +%% Document: XEP-0045 + +-module(muc_roomconfig). + +-export([decode/1, decode/2, encode/1, encode/2, + format_error/1]). + +-include("xmpp_codec.hrl"). + +-include("muc_roomconfig.hrl"). + +-export_type([{property, 0}, {result, 0}, {form, 0}]). + +dec_int(Val, Min, Max) -> + case list_to_integer(binary_to_list(Val)) of + Int when Int =< Max, Min == infinity -> Int; + Int when Int =< Max, Int >= Min -> Int + end. + +enc_int(Int) -> integer_to_binary(Int). + +dec_enum(Val, Enums) -> + AtomVal = erlang:binary_to_existing_atom(Val, utf8), + case lists:member(AtomVal, Enums) of + true -> AtomVal + end. + +enc_enum(Atom) -> erlang:atom_to_binary(Atom, utf8). + +dec_enum_int(Val, Enums, Min, Max) -> + try dec_int(Val, Min, Max) catch + _:_ -> dec_enum(Val, Enums) + end. + +enc_enum_int(Int) when is_integer(Int) -> enc_int(Int); +enc_enum_int(Atom) -> enc_enum(Atom). + +dec_bool(<<"1">>) -> true; +dec_bool(<<"0">>) -> false; +dec_bool(<<"true">>) -> true; +dec_bool(<<"false">>) -> false. + +enc_bool(true) -> <<"1">>; +enc_bool(false) -> <<"0">>. + +enc_jid(J) -> jid:to_string(J). + +dec_jid(Val) -> + case jid:from_string(Val) of + error -> erlang:error(badarg); + J -> J + end. + +format_error({form_type_mismatch, Type}) -> + <<"FORM_TYPE doesn't match '", Type/binary, "'">>; +format_error({bad_var_value, Var, Type}) -> + <<"Bad value of field '", Var/binary, "' of type '", + Type/binary, "'">>; +format_error({missing_value, Var, Type}) -> + <<"Missing value of field '", Var/binary, "' of type '", + Type/binary, "'">>; +format_error({too_many_values, Var, Type}) -> + <<"Too many values for field '", Var/binary, + "' of type '", Type/binary, "'">>; +format_error({unknown_var, Var, Type}) -> + <<"Unknown field '", Var/binary, "' of type '", + Type/binary, "'">>; +format_error({missing_required_var, Var, Type}) -> + <<"Missing required field '", Var/binary, "' of type '", + Type/binary, "'">>. + +decode(Fs) -> decode(Fs, []). + +decode(Fs, Acc) -> + case lists:keyfind(<<"FORM_TYPE">>, #xdata_field.var, + Fs) + of + false -> decode(Fs, Acc, []); + #xdata_field{values = + [<<"http://jabber.org/protocol/muc#roomconfig">>]} -> + decode(Fs, Acc, []); + _ -> + erlang:error({?MODULE, + {form_type_mismatch, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end. + +encode(Cfg) -> encode(Cfg, fun (Text) -> Text end). + +encode(List, Translate) when is_list(List) -> + Fs = [case Opt of + {maxhistoryfetch, Val} -> + [encode_maxhistoryfetch(Val, Translate)]; + {maxhistoryfetch, _, _} -> erlang:error({badarg, Opt}); + {allowpm, Val} -> + [encode_allowpm(Val, default, Translate)]; + {allowpm, Val, Opts} -> + [encode_allowpm(Val, Opts, Translate)]; + {allow_private_messages, Val} -> + [encode_allow_private_messages(Val, Translate)]; + {allow_private_messages, _, _} -> + erlang:error({badarg, Opt}); + {allow_private_messages_from_visitors, Val} -> + [encode_allow_private_messages_from_visitors(Val, + default, + Translate)]; + {allow_private_messages_from_visitors, Val, Opts} -> + [encode_allow_private_messages_from_visitors(Val, Opts, + Translate)]; + {allow_visitor_status, Val} -> + [encode_allow_visitor_status(Val, Translate)]; + {allow_visitor_status, _, _} -> + erlang:error({badarg, Opt}); + {allow_visitor_nickchange, Val} -> + [encode_allow_visitor_nickchange(Val, Translate)]; + {allow_visitor_nickchange, _, _} -> + erlang:error({badarg, Opt}); + {allow_voice_requests, Val} -> + [encode_allow_voice_requests(Val, Translate)]; + {allow_voice_requests, _, _} -> + erlang:error({badarg, Opt}); + {allow_subscription, Val} -> + [encode_allow_subscription(Val, Translate)]; + {allow_subscription, _, _} -> + erlang:error({badarg, Opt}); + {voice_request_min_interval, Val} -> + [encode_voice_request_min_interval(Val, Translate)]; + {voice_request_min_interval, _, _} -> + erlang:error({badarg, Opt}); + {captcha_protected, Val} -> + [encode_captcha_protected(Val, Translate)]; + {captcha_protected, _, _} -> + erlang:error({badarg, Opt}); + {captcha_whitelist, Val} -> + [encode_captcha_whitelist(Val, Translate)]; + {captcha_whitelist, _, _} -> + erlang:error({badarg, Opt}); + {allow_query_users, Val} -> + [encode_allow_query_users(Val, Translate)]; + {allow_query_users, _, _} -> + erlang:error({badarg, Opt}); + {allowinvites, Val} -> + [encode_allowinvites(Val, Translate)]; + {allowinvites, _, _} -> erlang:error({badarg, Opt}); + {changesubject, Val} -> + [encode_changesubject(Val, Translate)]; + {changesubject, _, _} -> erlang:error({badarg, Opt}); + {enablelogging, Val} -> + [encode_enablelogging(Val, Translate)]; + {enablelogging, _, _} -> erlang:error({badarg, Opt}); + {getmemberlist, Val} -> + [encode_getmemberlist(Val, default, Translate)]; + {getmemberlist, Val, Opts} -> + [encode_getmemberlist(Val, Opts, Translate)]; + {lang, Val} -> [encode_lang(Val, Translate)]; + {lang, _, _} -> erlang:error({badarg, Opt}); + {pubsub, Val} -> [encode_pubsub(Val, Translate)]; + {pubsub, _, _} -> erlang:error({badarg, Opt}); + {maxusers, Val} -> + [encode_maxusers(Val, default, Translate)]; + {maxusers, Val, Opts} -> + [encode_maxusers(Val, Opts, Translate)]; + {membersonly, Val} -> + [encode_membersonly(Val, Translate)]; + {membersonly, _, _} -> erlang:error({badarg, Opt}); + {moderatedroom, Val} -> + [encode_moderatedroom(Val, Translate)]; + {moderatedroom, _, _} -> erlang:error({badarg, Opt}); + {members_by_default, Val} -> + [encode_members_by_default(Val, Translate)]; + {members_by_default, _, _} -> + erlang:error({badarg, Opt}); + {passwordprotectedroom, Val} -> + [encode_passwordprotectedroom(Val, Translate)]; + {passwordprotectedroom, _, _} -> + erlang:error({badarg, Opt}); + {persistentroom, Val} -> + [encode_persistentroom(Val, Translate)]; + {persistentroom, _, _} -> erlang:error({badarg, Opt}); + {presencebroadcast, Val} -> + [encode_presencebroadcast(Val, default, Translate)]; + {presencebroadcast, Val, Opts} -> + [encode_presencebroadcast(Val, Opts, Translate)]; + {publicroom, Val} -> + [encode_publicroom(Val, Translate)]; + {publicroom, _, _} -> erlang:error({badarg, Opt}); + {public_list, Val} -> + [encode_public_list(Val, Translate)]; + {public_list, _, _} -> erlang:error({badarg, Opt}); + {roomadmins, Val} -> + [encode_roomadmins(Val, Translate)]; + {roomadmins, _, _} -> erlang:error({badarg, Opt}); + {roomdesc, Val} -> [encode_roomdesc(Val, Translate)]; + {roomdesc, _, _} -> erlang:error({badarg, Opt}); + {roomname, Val} -> [encode_roomname(Val, Translate)]; + {roomname, _, _} -> erlang:error({badarg, Opt}); + {roomowners, Val} -> + [encode_roomowners(Val, Translate)]; + {roomowners, _, _} -> erlang:error({badarg, Opt}); + {roomsecret, Val} -> + [encode_roomsecret(Val, Translate)]; + {roomsecret, _, _} -> erlang:error({badarg, Opt}); + {whois, Val} -> [encode_whois(Val, default, Translate)]; + {whois, Val, Opts} -> + [encode_whois(Val, Opts, Translate)]; + {mam, Val} -> [encode_mam(Val, Translate)]; + {mam, _, _} -> erlang:error({badarg, Opt}); + #xdata_field{} -> [Opt]; + _ -> [] + end + || Opt <- List], + FormType = #xdata_field{var = <<"FORM_TYPE">>, + type = hidden, + values = + [<<"http://jabber.org/protocol/muc#roomconfig">>]}, + [FormType | lists:flatten(Fs)]. + +decode([#xdata_field{var = <<"muc#maxhistoryfetch">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{maxhistoryfetch, Result} | Acc], + lists:delete(<<"muc#maxhistoryfetch">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#maxhistoryfetch">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#maxhistoryfetch">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"muc#maxhistoryfetch">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"muc#maxhistoryfetch">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#maxhistoryfetch">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"muc#roomconfig_allowpm">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{allowpm, Result} | Acc], + lists:delete(<<"muc#roomconfig_allowpm">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_allowpm">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#roomconfig_allowpm">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_allowpm">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"muc#roomconfig_allowpm">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_allowpm">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"allow_private_messages">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_private_messages, Result} | Acc], + lists:delete(<<"allow_private_messages">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_private_messages">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_private_messages">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"allow_private_messages">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"allow_private_messages">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_private_messages">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"allow_private_messages_from_visitors">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_enum(Value, [nobody, moderators, anyone]) of + Result -> + decode(Fs, + [{allow_private_messages_from_visitors, Result} | Acc], + lists:delete(<<"allow_private_messages_from_visitors">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, + <<"allow_private_messages_from_visitors">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"allow_private_messages_from_visitors">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"allow_private_messages_from_visitors">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"allow_private_messages_from_visitors">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, + <<"allow_private_messages_from_visitors">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"allow_visitor_status">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_visitor_status, Result} | Acc], + lists:delete(<<"allow_visitor_status">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_visitor_status">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_visitor_status">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"allow_visitor_status">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"allow_visitor_status">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_visitor_status">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"allow_visitor_nickchange">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_visitor_nickchange, Result} | Acc], + lists:delete(<<"allow_visitor_nickchange">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_visitor_nickchange">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"allow_visitor_nickchange">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"allow_visitor_nickchange">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"allow_visitor_nickchange">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_visitor_nickchange">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"allow_voice_requests">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_voice_requests, Result} | Acc], + lists:delete(<<"allow_voice_requests">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_voice_requests">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_voice_requests">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"allow_voice_requests">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"allow_voice_requests">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_voice_requests">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"allow_subscription">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_subscription, Result} | Acc], + lists:delete(<<"allow_subscription">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_subscription">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_subscription">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"allow_subscription">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"allow_subscription">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_subscription">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"voice_request_min_interval">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_int(Value, 0, infinity) of + Result -> + decode(Fs, [{voice_request_min_interval, Result} | Acc], + lists:delete(<<"voice_request_min_interval">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"voice_request_min_interval">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"voice_request_min_interval">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"voice_request_min_interval">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"voice_request_min_interval">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"voice_request_min_interval">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"captcha_protected">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{captcha_protected, Result} | Acc], + lists:delete(<<"captcha_protected">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"captcha_protected">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"captcha_protected">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"captcha_protected">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"captcha_protected">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"captcha_protected">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"captcha_whitelist">>, + values = Values} + | Fs], + Acc, Required) -> + try [dec_jid(Value) || Value <- Values] of + Result -> + decode(Fs, [{captcha_whitelist, Result} | Acc], + lists:delete(<<"captcha_whitelist">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"captcha_whitelist">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_query_users">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allow_query_users, Result} | Acc], + lists:delete(<<"allow_query_users">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"allow_query_users">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"allow_query_users">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"allow_query_users">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"allow_query_users">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"allow_query_users">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_allowinvites">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{allowinvites, Result} | Acc], + lists:delete(<<"muc#roomconfig_allowinvites">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_allowinvites">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_allowinvites">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_allowinvites">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_allowinvites">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_allowinvites">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_changesubject">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{changesubject, Result} | Acc], + lists:delete(<<"muc#roomconfig_changesubject">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_changesubject">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_changesubject">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_changesubject">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_changesubject">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_changesubject">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_enablelogging">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{enablelogging, Result} | Acc], + lists:delete(<<"muc#roomconfig_enablelogging">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_enablelogging">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_enablelogging">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_enablelogging">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_enablelogging">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_enablelogging">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_getmemberlist">>, + values = Values} + | Fs], + Acc, Required) -> + try [Value || Value <- Values] of + Result -> + decode(Fs, [{getmemberlist, Result} | Acc], + lists:delete(<<"muc#roomconfig_getmemberlist">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_getmemberlist">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#roomconfig_lang">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{lang, Result} | Acc], + lists:delete(<<"muc#roomconfig_lang">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_lang">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#roomconfig_lang">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"muc#roomconfig_lang">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"muc#roomconfig_lang">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_lang">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"muc#roomconfig_pubsub">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{pubsub, Result} | Acc], + lists:delete(<<"muc#roomconfig_pubsub">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_pubsub">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#roomconfig_pubsub">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"muc#roomconfig_pubsub">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"muc#roomconfig_pubsub">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_pubsub">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_maxusers">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_enum_int(Value, [none], 0, infinity) of + Result -> + decode(Fs, [{maxusers, Result} | Acc], + lists:delete(<<"muc#roomconfig_maxusers">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_maxusers">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_maxusers">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_maxusers">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_maxusers">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_maxusers">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_membersonly">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{membersonly, Result} | Acc], + lists:delete(<<"muc#roomconfig_membersonly">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_membersonly">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_membersonly">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_membersonly">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_membersonly">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_membersonly">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_moderatedroom">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{moderatedroom, Result} | Acc], + lists:delete(<<"muc#roomconfig_moderatedroom">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_moderatedroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_moderatedroom">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_moderatedroom">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_moderatedroom">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_moderatedroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"members_by_default">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{members_by_default, Result} | Acc], + lists:delete(<<"members_by_default">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"members_by_default">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"members_by_default">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"members_by_default">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"members_by_default">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"members_by_default">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_passwordprotectedroom">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{passwordprotectedroom, Result} | Acc], + lists:delete(<<"muc#roomconfig_passwordprotectedroom">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, + <<"muc#roomconfig_passwordprotectedroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_passwordprotectedroom">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_passwordprotectedroom">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_passwordprotectedroom">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, + <<"muc#roomconfig_passwordprotectedroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_persistentroom">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{persistentroom, Result} | Acc], + lists:delete(<<"muc#roomconfig_persistentroom">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_persistentroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_persistentroom">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_persistentroom">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_persistentroom">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_persistentroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_presencebroadcast">>, + values = Values} + | Fs], + Acc, Required) -> + try [dec_enum(Value, [moderator, participant, visitor]) + || Value <- Values] + of + Result -> + decode(Fs, [{presencebroadcast, Result} | Acc], + lists:delete(<<"muc#roomconfig_presencebroadcast">>, + Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_presencebroadcast">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_publicroom">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{publicroom, Result} | Acc], + lists:delete(<<"muc#roomconfig_publicroom">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_publicroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_publicroom">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_publicroom">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_publicroom">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_publicroom">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"public_list">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{public_list, Result} | Acc], + lists:delete(<<"public_list">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"public_list">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"public_list">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"public_list">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"public_list">>} | _], _, + _) -> + erlang:error({?MODULE, + {too_many_values, <<"public_list">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_roomadmins">>, + values = Values} + | Fs], + Acc, Required) -> + try [dec_jid(Value) || Value <- Values] of + Result -> + decode(Fs, [{roomadmins, Result} | Acc], + lists:delete(<<"muc#roomconfig_roomadmins">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_roomadmins">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_roomdesc">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{roomdesc, Result} | Acc], + lists:delete(<<"muc#roomconfig_roomdesc">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_roomdesc">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_roomdesc">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_roomdesc">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_roomdesc">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_roomdesc">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_roomname">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{roomname, Result} | Acc], + lists:delete(<<"muc#roomconfig_roomname">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_roomname">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_roomname">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_roomname">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_roomname">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_roomname">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = + <<"muc#roomconfig_roomowners">>, + values = Values} + | Fs], + Acc, Required) -> + try [dec_jid(Value) || Value <- Values] of + Result -> + decode(Fs, [{roomowners, Result} | Acc], + lists:delete(<<"muc#roomconfig_roomowners">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_roomowners">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_roomsecret">>, + values = [Value]} + | Fs], + Acc, Required) -> + try Value of + Result -> + decode(Fs, [{roomsecret, Result} | Acc], + lists:delete(<<"muc#roomconfig_roomsecret">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_roomsecret">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = + <<"muc#roomconfig_roomsecret">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = + <<"muc#roomconfig_roomsecret">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = + <<"muc#roomconfig_roomsecret">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_roomsecret">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"muc#roomconfig_whois">>, + values = [Value]} + | Fs], + Acc, Required) -> + try dec_enum(Value, [moderators, anyone]) of + Result -> + decode(Fs, [{whois, Result} | Acc], + lists:delete(<<"muc#roomconfig_whois">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"muc#roomconfig_whois">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"muc#roomconfig_whois">>, + values = []} = + F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"muc#roomconfig_whois">>, + values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"muc#roomconfig_whois">>} + | _], + _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"muc#roomconfig_whois">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = <<"mam">>, values = [Value]} + | Fs], + Acc, Required) -> + try dec_bool(Value) of + Result -> + decode(Fs, [{mam, Result} | Acc], + lists:delete(<<"mam">>, Required)) + catch + _:_ -> + erlang:error({?MODULE, + {bad_var_value, <<"mam">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}) + end; +decode([#xdata_field{var = <<"mam">>, values = []} = F + | Fs], + Acc, Required) -> + decode([F#xdata_field{var = <<"mam">>, values = [<<>>]} + | Fs], + Acc, Required); +decode([#xdata_field{var = <<"mam">>} | _], _, _) -> + erlang:error({?MODULE, + {too_many_values, <<"mam">>, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([#xdata_field{var = Var} | Fs], Acc, Required) -> + if Var /= <<"FORM_TYPE">> -> + erlang:error({?MODULE, + {unknown_var, Var, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); + true -> decode(Fs, Acc, Required) + end; +decode([], _, [Var | _]) -> + erlang:error({?MODULE, + {missing_required_var, Var, + <<"http://jabber.org/protocol/muc#roomconfig">>}}); +decode([], Acc, []) -> Acc. + +encode_maxhistoryfetch(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#maxhistoryfetch">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = + Translate(<<"Maximum Number of History Messages Returned " + "by Room">>)}. + +encode_allowpm(Value, Options, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = if Options == default -> []; + true -> + [#xdata_option{label = Translate(L), value = V} + || {L, V} <- Options] + end, + #xdata_field{var = <<"muc#roomconfig_allowpm">>, + values = Values, required = false, type = 'list-single', + options = Opts, desc = <<>>, + label = + Translate(<<"Roles that May Send Private Messages">>)}. + +encode_allow_private_messages(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_private_messages">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow users to send private messages">>)}. + +encode_allow_private_messages_from_visitors(Value, + Options, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_enum(Value)] + end, + Opts = if Options == default -> + [#xdata_option{label = Translate(<<"nobody">>), + value = <<"nobody">>}, + #xdata_option{label = Translate(<<"moderators only">>), + value = <<"moderators">>}, + #xdata_option{label = Translate(<<"anyone">>), + value = <<"anyone">>}]; + true -> + [#xdata_option{label = Translate(L), + value = enc_enum(V)} + || {L, V} <- Options] + end, + #xdata_field{var = + <<"allow_private_messages_from_visitors">>, + values = Values, required = false, type = 'list-single', + options = Opts, desc = <<>>, + label = + Translate(<<"Allow visitors to send private messages to">>)}. + +encode_allow_visitor_status(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_visitor_status">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow visitors to send status text in " + "presence updates">>)}. + +encode_allow_visitor_nickchange(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_visitor_nickchange">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow visitors to change nickname">>)}. + +encode_allow_voice_requests(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_voice_requests">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow visitors to send voice requests">>)}. + +encode_allow_subscription(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_subscription">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Allow subscription">>)}. + +encode_voice_request_min_interval(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_int(Value)] + end, + Opts = [], + #xdata_field{var = <<"voice_request_min_interval">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = + Translate(<<"Minimum interval between voice requests " + "(in seconds)">>)}. + +encode_captcha_protected(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"captcha_protected">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room CAPTCHA protected">>)}. + +encode_captcha_whitelist(Value, Translate) -> + Values = case Value of + [] -> []; + Value -> [enc_jid(V) || V <- Value] + end, + Opts = [], + #xdata_field{var = <<"captcha_whitelist">>, + values = Values, required = false, type = 'jid-multi', + options = Opts, desc = <<>>, + label = + Translate(<<"Exclude Jabber IDs from CAPTCHA challenge">>)}. + +encode_allow_query_users(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"allow_query_users">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow users to query other users">>)}. + +encode_allowinvites(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_allowinvites">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Allow users to send invites">>)}. + +encode_changesubject(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_changesubject">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = + Translate(<<"Allow users to change the subject">>)}. + +encode_enablelogging(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_enablelogging">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Enable logging">>)}. + +encode_getmemberlist(Value, Options, Translate) -> + Values = case Value of + [] -> []; + Value -> [Value] + end, + Opts = if Options == default -> []; + true -> + [#xdata_option{label = Translate(L), value = V} + || {L, V} <- Options] + end, + #xdata_field{var = <<"muc#roomconfig_getmemberlist">>, + values = Values, required = false, type = 'list-multi', + options = Opts, desc = <<>>, + label = + Translate(<<"Roles and Affiliations that May Retrieve " + "Member List">>)}. + +encode_lang(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_lang">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = + Translate(<<"Natural Language for Room Discussions">>)}. + +encode_pubsub(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_pubsub">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = + Translate(<<"XMPP URI of Associated Publish-Subscribe " + "Node">>)}. + +encode_maxusers(Value, Options, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_enum_int(Value)] + end, + Opts = if Options == default -> + [#xdata_option{label = Translate(<<"No limit">>), + value = <<"none">>}, + #xdata_option{value = <<"5">>}, + #xdata_option{value = <<"10">>}, + #xdata_option{value = <<"20">>}, + #xdata_option{value = <<"30">>}, + #xdata_option{value = <<"50">>}, + #xdata_option{value = <<"100">>}, + #xdata_option{value = <<"200">>}, + #xdata_option{value = <<"500">>}, + #xdata_option{value = <<"1000">>}, + #xdata_option{value = <<"2000">>}, + #xdata_option{value = <<"5000">>}]; + true -> + [#xdata_option{label = Translate(L), + value = enc_enum_int(V)} + || {L, V} <- Options] + end, + #xdata_field{var = <<"muc#roomconfig_maxusers">>, + values = Values, required = false, type = 'list-single', + options = Opts, desc = <<>>, + label = Translate(<<"Maximum Number of Occupants">>)}. + +encode_membersonly(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_membersonly">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room members-only">>)}. + +encode_moderatedroom(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_moderatedroom">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room moderated">>)}. + +encode_members_by_default(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"members_by_default">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Default users as participants">>)}. + +encode_passwordprotectedroom(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = + <<"muc#roomconfig_passwordprotectedroom">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room password protected">>)}. + +encode_persistentroom(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_persistentroom">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room persistent">>)}. + +encode_presencebroadcast(Value, Options, Translate) -> + Values = case Value of + [] -> []; + Value -> [enc_enum(V) || V <- Value] + end, + Opts = if Options == default -> + [#xdata_option{label = Translate(<<"Moderator">>), + value = <<"moderator">>}, + #xdata_option{label = Translate(<<"Participant">>), + value = <<"participant">>}, + #xdata_option{label = Translate(<<"Visitor">>), + value = <<"visitor">>}]; + true -> + [#xdata_option{label = Translate(L), + value = enc_enum(V)} + || {L, V} <- Options] + end, + #xdata_field{var = + <<"muc#roomconfig_presencebroadcast">>, + values = Values, required = false, type = 'list-multi', + options = Opts, desc = <<>>, + label = + Translate(<<"Roles for which Presence is Broadcasted">>)}. + +encode_publicroom(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_publicroom">>, + values = Values, required = false, type = boolean, + options = Opts, desc = <<>>, + label = Translate(<<"Make room public searchable">>)}. + +encode_public_list(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"public_list">>, values = Values, + required = false, type = boolean, options = Opts, + desc = <<>>, + label = Translate(<<"Make participants list public">>)}. + +encode_roomadmins(Value, Translate) -> + Values = case Value of + [] -> []; + Value -> [enc_jid(V) || V <- Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_roomadmins">>, + values = Values, required = false, type = 'jid-multi', + options = Opts, desc = <<>>, + label = Translate(<<"Full List of Room Admins">>)}. + +encode_roomdesc(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_roomdesc">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = Translate(<<"Room description">>)}. + +encode_roomname(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_roomname">>, + values = Values, required = false, type = 'text-single', + options = Opts, desc = <<>>, + label = Translate(<<"Room title">>)}. + +encode_roomowners(Value, Translate) -> + Values = case Value of + [] -> []; + Value -> [enc_jid(V) || V <- Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_roomowners">>, + values = Values, required = false, type = 'jid-multi', + options = Opts, desc = <<>>, + label = Translate(<<"Full List of Room Owners">>)}. + +encode_roomsecret(Value, Translate) -> + Values = case Value of + <<>> -> []; + Value -> [Value] + end, + Opts = [], + #xdata_field{var = <<"muc#roomconfig_roomsecret">>, + values = Values, required = false, + type = 'text-private', options = Opts, desc = <<>>, + label = Translate(<<"Password">>)}. + +encode_whois(Value, Options, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_enum(Value)] + end, + Opts = if Options == default -> + [#xdata_option{label = Translate(<<"moderators only">>), + value = <<"moderators">>}, + #xdata_option{label = Translate(<<"anyone">>), + value = <<"anyone">>}]; + true -> + [#xdata_option{label = Translate(L), + value = enc_enum(V)} + || {L, V} <- Options] + end, + #xdata_field{var = <<"muc#roomconfig_whois">>, + values = Values, required = false, type = 'list-single', + options = Opts, desc = <<>>, + label = Translate(<<"Present real Jabber IDs to">>)}. + +encode_mam(Value, Translate) -> + Values = case Value of + undefined -> []; + Value -> [enc_bool(Value)] + end, + Opts = [], + #xdata_field{var = <<"mam">>, values = Values, + required = false, type = boolean, options = Opts, + desc = <<>>, + label = Translate(<<"Enable message archiving">>)}. |