aboutsummaryrefslogtreecommitdiff
path: root/src/muc_roomconfig.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/muc_roomconfig.erl')
-rw-r--r--src/muc_roomconfig.erl1675
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">>)}.