Mercurial > prosody-modules
view mod_muc_webchat_url/mod_muc_webchat_url.lua @ 4738:5aee8d86629a
mod_bookmarks2: Fix handling of nick and password elements
This form of child retrieval fails when the stanza elements internally
don't have an 'xmlns' attribute, which can happen sometimes for some
reason, including when they have been constructed via the stanza builder
API. When that is the case then the explicit namespace arguemnt does not
match the nil value of the internal attribute. Calling `:get_child()`
without the namespace argument does the right thing here, with both nil
and the parent namespace as valid values for the internal attribute.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 03 Nov 2021 21:11:55 +0100 |
parents | dcafddc31b1c |
children |
line wrap: on
line source
local jid_split = require "util.jid".split; module:depends"muc"; local webchat_baseurl = module:get_option_string("muc_webchat_baseurl", nil); local function get_default_url(room) if not webchat_baseurl then -- no template return nil; end if room:get_hidden() or room:get_members_only() or room:get_password() then -- not a public room return nil; end return (webchat_baseurl:gsub("{(%w+)}", { jid = room.jid, node = select(1, jid_split(room.jid)), host = select(2, jid_split(room.jid)), })); end local function get_webchat_url(room) local webchat_url = room._data.webchat_url; if webchat_url then -- explicitly configured return webchat_url; end return get_default_url(room); end module:hook("muc-config-form", function(event) local room, form = event.room, event.form; table.insert(form, { name = "muc#roomconfig_webchat_url", type = "text-single", label = "URL where this room can be joined", datatype = "xs:anyURI", value = get_webchat_url(room), }); end); module:hook("muc-config-submitted", function(event) local room, fields, changed = event.room, event.fields, event.changed; local new = fields["muc#roomconfig_webchat_url"]; if new ~= get_webchat_url(room) then if new == get_default_url(room) then room._data.webchat_url = nil; else room._data.webchat_url = new; end if type(changed) == "table" then changed["muc#roomconfig_webchat_url"] = true; else event.changed = true; end end end); module:hook("muc-disco#info", function (event) local room, form, formdata = event.room, event.form, event.formdata; local webchat_url = get_webchat_url(room); if not webchat_url or webchat_url == "" then return; end table.insert(form, { name = "muc#roominfo_webchat_url", }); formdata["muc#roominfo_webchat_url"] = webchat_url; end);