Software /
code /
prosody
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 |