Comparison

plugins/muc/request.lib.lua @ 8865:2a8bbfcb6868

MUC: Move voice request into its own lib
author Kim Alvefur <zash@zash.se>
date Sat, 02 Jun 2018 20:15:32 +0200
parent 8860:plugins/muc/moderated.lib.lua@0bb46a1bb398
child 8871:b67a861e883e
comparison
equal deleted inserted replaced
8864:cf2f66b233d1 8865:2a8bbfcb6868
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- Copyright (C) 2014 Daurnimator
5 --
6 -- This project is MIT/X11 licensed. Please see the
7 -- COPYING file in the source package for more information.
8 --
9
10 local st = require "util.stanza";
11 local jid_resource = require "util.jid".resource;
12
13 local voice_request_form = require "util.dataforms".new({
14 title = "Voice Request";
15 {
16 name = "FORM_TYPE";
17 type = "hidden";
18 value = "http://jabber.org/protocol/muc#request";
19 },
20 {
21 name = "muc#jid";
22 type = "jid-single";
23 label = "User ID";
24 },
25 {
26 name = "muc#roomnick";
27 type = "text-single";
28 label = "Room Nickname";
29 },
30 {
31 name = "muc#role";
32 type = "list-single";
33 label = "Requested Role";
34 value = "participant";
35 options = {
36 "none",
37 "visitor",
38 "participant",
39 "moderator",
40 };
41 },
42 {
43 name = "muc#request_allow";
44 type = "boolean";
45 label = "Grant voice to this person?";
46 value = false;
47 }
48 });
49
50 local function handle_request(room, origin, stanza, form)
51 local occupant = room:get_occupant_by_real_jid(stanza.attr.from);
52 local fields = voice_request_form:data(form);
53 local event = {
54 room = room;
55 origin = origin;
56 stanza = stanza;
57 fields = fields;
58 occupant = occupant;
59 };
60 if occupant.role == "moderator" then
61 module:log("debug", "%s responded to a voice request in %s", jid_resource(occupant.nick), room.jid);
62 module:fire_event("muc-voice-response", event);
63 else
64 module:log("debug", "%s requested voice in %s", jid_resource(occupant.nick), room.jid);
65 module:fire_event("muc-voice-request", event);
66 end
67 end
68
69 module:hook("muc-voice-request", function(event)
70 if event.occupant.role == "visitor" then
71 local nick = jid_resource(event.occupant.nick);
72 local formdata = {
73 ["muc#jid"] = event.stanza.attr.from;
74 ["muc#roomnick"] = nick;
75 };
76
77 local message = st.message({ type = "normal"; from = event.room.jid }):add_child(voice_request_form:form(formdata)):up();
78
79 event.room:broadcast(message, function (_, occupant)
80 return occupant.role == "moderator";
81 end);
82 end
83 end);
84
85 module:hook("muc-voice-response", function(event)
86 local actor = event.stanza.attr.from;
87 local affected_occupant = event.room:get_occupant_by_real_jid(event.fields["muc#jid"]);
88 local occupant = event.occupant;
89
90 if occupant.role ~= "moderator" then
91 module:log("debug", "%s tried to grant voice but wasn't a moderator", jid_resource(occupant.nick));
92 return;
93 end
94
95 if not event.fields["muc#request_allow"] then
96 module:log("debug", "%s did not grant voice", jid_resource(occupant.nick));
97 return;
98 end
99
100 if not affected_occupant then
101 module:log("debug", "%s tried to grant voice to unknown occupant %s", jid_resource(occupant.nick), event.fields["muc#jid"]);
102 return;
103 end
104
105 if affected_occupant.role ~= "visitor" then
106 module:log("debug", "%s tried to grant voice to %s but they already have it", jid_resource(occupant.nick), jid_resource(occupant.jid));
107 return;
108 end
109
110 module:log("debug", "%s granted voice to %s", jid_resource(event.occupant.nick), jid_resource(occupant.jid));
111 local ok, errtype, err = event.room:set_role(actor, affected_occupant.nick, "participant", "Voice granted");
112
113 if not ok then
114 module:log("debug", "Error granting voice: %s", err or errtype);
115 event.origin.send(st.error_reply(event.stanza, errtype, err));
116 end
117 end);
118
119
120 return {
121 handle_request = handle_request;
122 };