diff options
author | Kim Alvefur <zash@zash.se> | 2017-10-20 05:19:25 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2017-10-20 05:19:25 +0200 |
commit | a0efb3692146c15913fb91d7e47fb742385956a4 (patch) | |
tree | 41cd42d634db1237e0207af6e449be8a20c77c48 /plugins/muc/muc.lib.lua | |
parent | 19f3e9adb9db9829046503e6594041e54159dbca (diff) | |
download | prosody-a0efb3692146c15913fb91d7e47fb742385956a4.tar.gz prosody-a0efb3692146c15913fb91d7e47fb742385956a4.zip |
MUC: Support MUC voice requests and approvals in moderated rooms (closes #655) (thanks to Lance Stout)
Diffstat (limited to 'plugins/muc/muc.lib.lua')
-rw-r--r-- | plugins/muc/muc.lib.lua | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua index 7c3d3af9..83cd9fb5 100644 --- a/plugins/muc/muc.lib.lua +++ b/plugins/muc/muc.lib.lua @@ -778,6 +778,34 @@ function room_mt:get_form_layout(actor) return module:fire_event("muc-config-form", { room = self, actor = actor, form = form }) or form; end +function room_mt:get_voice_form_layout() + local form = dataform.new({ + { + name = "FORM_TYPE"; + type = "hidden"; + value = "http://jabber.org/protocol/muc#request"; + }, + { + name = "muc#jid"; + type = "jid-single"; + }, + { + name = "muc#roomnick"; + type = "text-single"; + }, + { + name = "muc#role"; + type = "text-single"; + }, + { + name = "muc#request_allow"; + type = "boolean"; + } + }); + + return form; +end + function room_mt:process_form(origin, stanza) local form = stanza.tags[1]:get_child("x", "jabber:x:data"); if form.attr.type == "cancel" then @@ -1143,6 +1171,28 @@ function room_mt:handle_message_to_room(origin, stanza) origin.send(st.error_reply(stanza, "cancel", "bad-request")); return true; end + + local form = stanza:get_child("x", "jabber:x:data"); + if form and form.attr.type == "submit" then + local fields, errors, present = self:get_voice_form_layout():data(form); + + if fields.FORM_TYPE == "http://jabber.org/protocol/muc#request" then + local occupant = self:get_occupant_by_real_jid(stanza.attr.from); + local event = { + room = self; + origin = origin; + stanza = stanza; + fields = fields; + occupant = occupant; + }; + if occupant.role == "moderator" then + module:fire_event("muc-voice-response", event); + else + module:fire_event("muc-voice-request", event); + end + return true; + end + end end end |