Comparison

plugins/muc/muc.lib.lua @ 8851:ab5f678f1376

MUC: Support MUC voice requests and approvals in moderated rooms (closes #655) (thanks to Lance Stout)
author Kim Alvefur <zash@zash.se>
date Fri, 20 Oct 2017 05:19:25 +0200
parent 8843:041ddc670934
child 8852:5e98d62f3f9b
comparison
equal deleted inserted replaced
8850:26f1a49fa9c0 8851:ab5f678f1376
776 } 776 }
777 }); 777 });
778 return module:fire_event("muc-config-form", { room = self, actor = actor, form = form }) or form; 778 return module:fire_event("muc-config-form", { room = self, actor = actor, form = form }) or form;
779 end 779 end
780 780
781 function room_mt:get_voice_form_layout()
782 local form = dataform.new({
783 {
784 name = "FORM_TYPE";
785 type = "hidden";
786 value = "http://jabber.org/protocol/muc#request";
787 },
788 {
789 name = "muc#jid";
790 type = "jid-single";
791 },
792 {
793 name = "muc#roomnick";
794 type = "text-single";
795 },
796 {
797 name = "muc#role";
798 type = "text-single";
799 },
800 {
801 name = "muc#request_allow";
802 type = "boolean";
803 }
804 });
805
806 return form;
807 end
808
781 function room_mt:process_form(origin, stanza) 809 function room_mt:process_form(origin, stanza)
782 local form = stanza.tags[1]:get_child("x", "jabber:x:data"); 810 local form = stanza.tags[1]:get_child("x", "jabber:x:data");
783 if form.attr.type == "cancel" then 811 if form.attr.type == "cancel" then
784 origin.send(st.reply(stanza)); 812 origin.send(st.reply(stanza));
785 elseif form.attr.type == "submit" then 813 elseif form.attr.type == "submit" then
1140 elseif payload.name == "decline" and payload.attr.to then 1168 elseif payload.name == "decline" and payload.attr.to then
1141 return self:handle_mediated_decline(origin, stanza) 1169 return self:handle_mediated_decline(origin, stanza)
1142 end 1170 end
1143 origin.send(st.error_reply(stanza, "cancel", "bad-request")); 1171 origin.send(st.error_reply(stanza, "cancel", "bad-request"));
1144 return true; 1172 return true;
1173 end
1174
1175 local form = stanza:get_child("x", "jabber:x:data");
1176 if form and form.attr.type == "submit" then
1177 local fields, errors, present = self:get_voice_form_layout():data(form);
1178
1179 if fields.FORM_TYPE == "http://jabber.org/protocol/muc#request" then
1180 local occupant = self:get_occupant_by_real_jid(stanza.attr.from);
1181 local event = {
1182 room = self;
1183 origin = origin;
1184 stanza = stanza;
1185 fields = fields;
1186 occupant = occupant;
1187 };
1188 if occupant.role == "moderator" then
1189 module:fire_event("muc-voice-response", event);
1190 else
1191 module:fire_event("muc-voice-request", event);
1192 end
1193 return true;
1194 end
1145 end 1195 end
1146 end 1196 end
1147 end 1197 end
1148 1198
1149 function room_mt:route_stanza(stanza) -- luacheck: ignore 212 1199 function room_mt:route_stanza(stanza) -- luacheck: ignore 212