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 |