MUC: Move voice request into its own lib
authorKim Alvefur <zash@zash.se>
Sat, 02 Jun 2018 20:15:32 +0200
changeset 8868 2a8bbfcb6868
parent 8867 cf2f66b233d1
child 8869 2c60ae791bdc
MUC: Move voice request into its own lib
plugins/muc/mod_muc.lua
plugins/muc/moderated.lib.lua
plugins/muc/muc.lib.lua
plugins/muc/request.lib.lua
--- a/plugins/muc/mod_muc.lua	Sat Jun 02 19:57:46 2018 +0200
+++ b/plugins/muc/mod_muc.lua	Sat Jun 02 20:15:32 2018 +0200
@@ -59,6 +59,9 @@
 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;
--- a/plugins/muc/moderated.lib.lua	Sat Jun 02 19:57:46 2018 +0200
+++ b/plugins/muc/moderated.lib.lua	Sat Jun 02 20:15:32 2018 +0200
@@ -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 @@
 	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;
--- a/plugins/muc/muc.lib.lua	Sat Jun 02 19:57:46 2018 +0200
+++ b/plugins/muc/muc.lib.lua	Sat Jun 02 20:15:32 2018 +0200
@@ -779,47 +779,6 @@
 	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 @@
 		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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/muc/request.lib.lua	Sat Jun 02 20:15:32 2018 +0200
@@ -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;
+};