From 586e8747b9e30311a30e684f4d6e845af3886a4b Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sat, 2 Jun 2018 20:15:32 +0200 Subject: MUC: Move voice request into its own lib --- plugins/muc/mod_muc.lua | 3 ++ plugins/muc/moderated.lib.lua | 55 ------------------- plugins/muc/muc.lib.lua | 66 ++--------------------- plugins/muc/request.lib.lua | 122 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 117 deletions(-) create mode 100644 plugins/muc/request.lib.lua diff --git a/plugins/muc/mod_muc.lua b/plugins/muc/mod_muc.lua index fd240193..adbfb64c 100644 --- a/plugins/muc/mod_muc.lua +++ b/plugins/muc/mod_muc.lua @@ -59,6 +59,9 @@ local moderated = module:require "muc/moderated"; room_mt.get_moderated = moderated.get; room_mt.set_moderated = moderated.set; +local request = module:require "muc/request"; +room_mt.handle_role_request = request.handle_request; + local persistent = module:require "muc/persistent"; room_mt.get_persistent = persistent.get; room_mt.set_persistent = persistent.set; diff --git a/plugins/muc/moderated.lib.lua b/plugins/muc/moderated.lib.lua index 6e82c71f..8354c585 100644 --- a/plugins/muc/moderated.lib.lua +++ b/plugins/muc/moderated.lib.lua @@ -7,9 +7,6 @@ -- COPYING file in the source package for more information. -- -local st = require "util.stanza"; -local jid_resource = require "util.jid".resource; - local function get_moderated(room) return room._data.moderated; end @@ -48,58 +45,6 @@ module:hook("muc-get-default-role", function(event) end end, 1); -module:hook("muc-voice-request", function(event) - if event.occupant.role == "visitor" then - local form = event.room:get_voice_form_layout() - local nick = jid_resource(event.occupant.nick); - local formdata = { - ["muc#jid"] = event.stanza.attr.from; - ["muc#roomnick"] = nick; - }; - - local message = st.message({ type = "normal"; from = event.room.jid }):add_child(form:form(formdata)):up(); - - event.room:broadcast(message, function (_, occupant) - return occupant.role == "moderator"; - end); - end -end); - -module:hook("muc-voice-response", function(event) - local actor = event.stanza.attr.from; - local affected_occupant = event.room:get_occupant_by_real_jid(event.fields["muc#jid"]); - local occupant = event.occupant; - - if occupant.role ~= "moderator" then - module:log("debug", "%s tried to grant voice but wasn't a moderator", jid_resource(occupant.nick)); - return; - end - - if not event.fields["muc#request_allow"] then - module:log("debug", "%s did not grant voice", jid_resource(occupant.nick)); - return; - end - - if not affected_occupant then - module:log("debug", "%s tried to grant voice to unknown occupant %s", jid_resource(occupant.nick), event.fields["muc#jid"]); - return; - end - - if affected_occupant.role ~= "visitor" then - module:log("debug", "%s tried to grant voice to %s but they already have it", jid_resource(occupant.nick), jid_resource(occupant.jid)); - return; - end - - module:log("debug", "%s granted voice to %s", jid_resource(event.occupant.nick), jid_resource(occupant.jid)); - local ok, errtype, err = event.room:set_role(actor, affected_occupant.nick, "participant", "Voice granted"); - - if not ok then - module:log("debug", "Error granting voice: %s", err or errtype); - event.origin.send(st.error_reply(event.stanza, errtype, err)); - end -end); - - return { get = get_moderated; set = set_moderated; diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua index 23acfed1..3e811f6b 100644 --- a/plugins/muc/muc.lib.lua +++ b/plugins/muc/muc.lib.lua @@ -779,47 +779,6 @@ 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() -- luacheck: ignore 212/self - local form = dataform.new({ - title = "Voice Request"; - { - name = "FORM_TYPE"; - type = "hidden"; - value = "http://jabber.org/protocol/muc#request"; - }, - { - name = "muc#jid"; - type = "jid-single"; - label = "User ID"; - }, - { - name = "muc#roomnick"; - type = "text-single"; - label = "Room Nickname"; - }, - { - name = "muc#role"; - type = "list-single"; - label = "Requested Role"; - value = "participant"; - options = { - "none", - "visitor", - "participant", - "moderator", - }; - }, - { - name = "muc#request_allow"; - type = "boolean"; - label = "Grant voice to this person?"; - value = false; - } - }); - - 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 @@ -1187,27 +1146,10 @@ function room_mt:handle_message_to_room(origin, stanza) 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:log("debug", "%s responded to a voice request in %s", jid_resource(occupant.nick), self.jid); - module:fire_event("muc-voice-response", event); - else - module:log("debug", "%s requested voice in %s", jid_resource(occupant.nick), self.jid); - module:fire_event("muc-voice-request", event); - end - return true; - end + local form_type = dataform.get_type(form); + if form_type == "http://jabber.org/protocol/muc#request" then + self:handle_role_request(origin, stanza, form); + return true; end end end diff --git a/plugins/muc/request.lib.lua b/plugins/muc/request.lib.lua new file mode 100644 index 00000000..fdfb9be9 --- /dev/null +++ b/plugins/muc/request.lib.lua @@ -0,0 +1,122 @@ +-- Prosody IM +-- Copyright (C) 2008-2010 Matthew Wild +-- Copyright (C) 2008-2010 Waqas Hussain +-- Copyright (C) 2014 Daurnimator +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + +local st = require "util.stanza"; +local jid_resource = require "util.jid".resource; + +local voice_request_form = require "util.dataforms".new({ + title = "Voice Request"; + { + name = "FORM_TYPE"; + type = "hidden"; + value = "http://jabber.org/protocol/muc#request"; + }, + { + name = "muc#jid"; + type = "jid-single"; + label = "User ID"; + }, + { + name = "muc#roomnick"; + type = "text-single"; + label = "Room Nickname"; + }, + { + name = "muc#role"; + type = "list-single"; + label = "Requested Role"; + value = "participant"; + options = { + "none", + "visitor", + "participant", + "moderator", + }; + }, + { + name = "muc#request_allow"; + type = "boolean"; + label = "Grant voice to this person?"; + value = false; + } +}); + +local function handle_request(room, origin, stanza, form) + local occupant = room:get_occupant_by_real_jid(stanza.attr.from); + local fields = voice_request_form:data(form); + local event = { + room = room; + origin = origin; + stanza = stanza; + fields = fields; + occupant = occupant; + }; + if occupant.role == "moderator" then + module:log("debug", "%s responded to a voice request in %s", jid_resource(occupant.nick), room.jid); + module:fire_event("muc-voice-response", event); + else + module:log("debug", "%s requested voice in %s", jid_resource(occupant.nick), room.jid); + module:fire_event("muc-voice-request", event); + end +end + +module:hook("muc-voice-request", function(event) + if event.occupant.role == "visitor" then + local nick = jid_resource(event.occupant.nick); + local formdata = { + ["muc#jid"] = event.stanza.attr.from; + ["muc#roomnick"] = nick; + }; + + local message = st.message({ type = "normal"; from = event.room.jid }):add_child(voice_request_form:form(formdata)):up(); + + event.room:broadcast(message, function (_, occupant) + return occupant.role == "moderator"; + end); + end +end); + +module:hook("muc-voice-response", function(event) + local actor = event.stanza.attr.from; + local affected_occupant = event.room:get_occupant_by_real_jid(event.fields["muc#jid"]); + local occupant = event.occupant; + + if occupant.role ~= "moderator" then + module:log("debug", "%s tried to grant voice but wasn't a moderator", jid_resource(occupant.nick)); + return; + end + + if not event.fields["muc#request_allow"] then + module:log("debug", "%s did not grant voice", jid_resource(occupant.nick)); + return; + end + + if not affected_occupant then + module:log("debug", "%s tried to grant voice to unknown occupant %s", jid_resource(occupant.nick), event.fields["muc#jid"]); + return; + end + + if affected_occupant.role ~= "visitor" then + module:log("debug", "%s tried to grant voice to %s but they already have it", jid_resource(occupant.nick), jid_resource(occupant.jid)); + return; + end + + module:log("debug", "%s granted voice to %s", jid_resource(event.occupant.nick), jid_resource(occupant.jid)); + local ok, errtype, err = event.room:set_role(actor, affected_occupant.nick, "participant", "Voice granted"); + + if not ok then + module:log("debug", "Error granting voice: %s", err or errtype); + event.origin.send(st.error_reply(event.stanza, errtype, err)); + end +end); + + +return { + handle_request = handle_request; +}; -- cgit v1.2.3