Mercurial > prosody-hg
comparison plugins/muc/moderated.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 |
| parents | e16b3fd0bd80 |
| children | 5e98d62f3f9b |
comparison
equal
deleted
inserted
replaced
| 8850:26f1a49fa9c0 | 8851:ab5f678f1376 |
|---|---|
| 4 -- Copyright (C) 2014 Daurnimator | 4 -- Copyright (C) 2014 Daurnimator |
| 5 -- | 5 -- |
| 6 -- This project is MIT/X11 licensed. Please see the | 6 -- This project is MIT/X11 licensed. Please see the |
| 7 -- COPYING file in the source package for more information. | 7 -- COPYING file in the source package for more information. |
| 8 -- | 8 -- |
| 9 | |
| 10 local st = require "util.stanza"; | |
| 11 local dataform = require "util.dataforms"; | |
| 12 | |
| 9 | 13 |
| 10 local function get_moderated(room) | 14 local function get_moderated(room) |
| 11 return room._data.moderated; | 15 return room._data.moderated; |
| 12 end | 16 end |
| 13 | 17 |
| 43 return "visitor" | 47 return "visitor" |
| 44 end | 48 end |
| 45 end | 49 end |
| 46 end, 1); | 50 end, 1); |
| 47 | 51 |
| 52 module:hook("muc-voice-request", function(event) | |
| 53 if event.occupant.role == "visitor" then | |
| 54 local form = dataform.new({ | |
| 55 title = "Voice Request"; | |
| 56 { | |
| 57 name = "FORM_TYPE"; | |
| 58 type = "hidden"; | |
| 59 value = "http://jabber.org/protocol/muc#request"; | |
| 60 }, | |
| 61 { | |
| 62 name = "muc#role"; | |
| 63 type = "text-single"; | |
| 64 label = "Requested Role"; | |
| 65 value = "participant"; | |
| 66 }, | |
| 67 { | |
| 68 name = "muc#jid"; | |
| 69 type = "jid-single"; | |
| 70 label = "User ID"; | |
| 71 value = event.stanza.attr.from; | |
| 72 }, | |
| 73 { | |
| 74 name = "muc#roomnick"; | |
| 75 type = "text-single"; | |
| 76 label = "Room Nickname"; | |
| 77 value = event.occupant.nick; | |
| 78 }, | |
| 79 { | |
| 80 name = "muc#request_allow"; | |
| 81 type = "boolean"; | |
| 82 label = "Grant voice to this person?"; | |
| 83 value = false; | |
| 84 } | |
| 85 }); | |
| 86 | |
| 87 local message = st.message({ type = "normal"; from = event.room.jid }):add_child(form:form()):up(); | |
| 88 | |
| 89 event.room:broadcast(message, function (nick, occupant) | |
| 90 return occupant.role == "moderator"; | |
| 91 end); | |
| 92 end | |
| 93 end); | |
| 94 | |
| 95 module:hook("muc-voice-response", function(event) | |
| 96 local actor = event.stanza.attr.from; | |
| 97 local affected_occupant = event.room:get_occupant_by_real_jid(event.fields["muc#jid"]); | |
| 98 | |
| 99 if event.occupant.role ~= "moderator" then | |
| 100 return; | |
| 101 end | |
| 102 | |
| 103 if not event.fields["muc#request_allow"] then | |
| 104 return; | |
| 105 end | |
| 106 | |
| 107 if not affected_occupant then | |
| 108 return; | |
| 109 end | |
| 110 | |
| 111 if affected_occupant.role == "visitor" then | |
| 112 event.room:set_role(actor, affected_occupant.nick, "participant", "Voice granted"); | |
| 113 end | |
| 114 end); | |
| 115 | |
| 116 | |
| 48 return { | 117 return { |
| 49 get = get_moderated; | 118 get = get_moderated; |
| 50 set = set_moderated; | 119 set = set_moderated; |
| 51 }; | 120 }; |
