mirror of
https://github.com/bjc/prosody.git
synced 2025-04-03 05:07:42 +03:00
132 lines
3.6 KiB
Lua
132 lines
3.6 KiB
Lua
-- 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 "prosody.util.stanza";
|
|
local jid_resource = require "prosody.util.jid".resource;
|
|
|
|
module:hook("muc-disco#info", function(event)
|
|
event.reply:tag("feature", {var = "http://jabber.org/protocol/muc#request"}):up();
|
|
end);
|
|
|
|
local voice_request_form = require "prosody.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";
|
|
desc = "The user's JID (address)";
|
|
},
|
|
{
|
|
name = "muc#roomnick";
|
|
type = "text-single";
|
|
label = "Room nickname";
|
|
desc = "The user's nickname within the room";
|
|
},
|
|
{
|
|
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?";
|
|
desc = "Specify whether this person is able to speak in a moderated room";
|
|
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));
|
|
|
|
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;
|
|
};
|