|
1 local dataforms = require "prosody.util.dataforms"; |
|
2 |
|
3 local server_info_config = module:get_option("server_info", {}); |
|
4 local server_info_custom_fields = module:get_option_array("server_info_extensions"); |
|
5 |
|
6 -- Source: http://xmpp.org/registrar/formtypes.html#http:--jabber.org-network-serverinfo |
|
7 local form_layout = dataforms.new({ |
|
8 { var = "FORM_TYPE"; type = "hidden"; value = "http://jabber.org/network/serverinfo" }; |
|
9 }); |
|
10 |
|
11 if server_info_custom_fields then |
|
12 for _, field in ipairs(server_info_custom_fields) do |
|
13 table.insert(form_layout, field); |
|
14 end |
|
15 end |
|
16 |
|
17 local generated_form; |
|
18 |
|
19 function update_form() |
|
20 local new_form = form_layout:form(server_info_config, "result"); |
|
21 if generated_form then |
|
22 module:remove_item("extension", generated_form); |
|
23 end |
|
24 generated_form = new_form; |
|
25 module:add_item("extension", generated_form); |
|
26 end |
|
27 |
|
28 function add_fields(event) |
|
29 local fields = event.item; |
|
30 for _, field in ipairs(fields) do |
|
31 table.insert(form_layout, field); |
|
32 end |
|
33 update_form(); |
|
34 end |
|
35 |
|
36 function remove_fields(event) |
|
37 local removed_fields = event.item; |
|
38 for _, removed_field in ipairs(removed_fields) do |
|
39 local removed_var = removed_field.var or removed_field.name; |
|
40 for i, field in ipairs(form_layout) do |
|
41 local var = field.var or field.name |
|
42 if var == removed_var then |
|
43 table.remove(form_layout, i); |
|
44 break; |
|
45 end |
|
46 end |
|
47 end |
|
48 update_form(); |
|
49 end |
|
50 |
|
51 module:handle_items("server-info-fields", add_fields, remove_fields); |
|
52 |
|
53 function module.load() |
|
54 update_form(); |
|
55 end |