aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/muc
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/muc')
-rw-r--r--plugins/muc/mod_muc.lua3
-rw-r--r--plugins/muc/moderated.lib.lua55
-rw-r--r--plugins/muc/muc.lib.lua66
-rw-r--r--plugins/muc/request.lib.lua122
4 files changed, 129 insertions, 117 deletions
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;
+};