Comparison

plugins/mod_server_info.lua @ 13436:1ce18cb3e6cc

mod_server_info: New module to manage the serverinfo disco extension form This allows multiple modules to populate the form dynamically. Currently the form is "owned" by mod_server_contact_info, which prevents other modules from contributing to it. A further commit will port mod_server_contact_info to use this module.
author Matthew Wild <mwild1@gmail.com>
date Fri, 23 Feb 2024 21:13:10 +0000
comparison
equal deleted inserted replaced
13435:b64064e4400b 13436:1ce18cb3e6cc
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