Software / code / prosody
Comparison
plugins/muc/whois.lib.lua @ 6214:9813c74ce006
plugins/muc: Move `whois` code to seperate file
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Thu, 03 Apr 2014 14:24:27 -0400 |
| child | 6991:84e01dbb739e |
comparison
equal
deleted
inserted
replaced
| 6213:95bddf0142f4 | 6214:9813c74ce006 |
|---|---|
| 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 valid_whois = { | |
| 11 moderators = true; | |
| 12 anyone = true; | |
| 13 }; | |
| 14 | |
| 15 local function get_whois(room) | |
| 16 return room._data.whois or "moderators"; | |
| 17 end | |
| 18 | |
| 19 local function set_whois(room, whois) | |
| 20 assert(valid_whois[whois], "Invalid whois value") | |
| 21 if get_whois(room) == whois then return false; end | |
| 22 room._data.whois = whois; | |
| 23 if room.save then room:save(true); end | |
| 24 return true; | |
| 25 end | |
| 26 | |
| 27 module:hook("muc-disco#info", function(event) | |
| 28 event.reply:tag("feature", {var = get_whois(event.room) ~= "anyone" and "muc_semianonymous" or "muc_nonanonymous"}):up(); | |
| 29 end); | |
| 30 | |
| 31 module:hook("muc-config-form", function(event) | |
| 32 local whois = get_whois(event.room); | |
| 33 table.insert(event.form, { | |
| 34 name = 'muc#roomconfig_whois', | |
| 35 type = 'list-single', | |
| 36 label = 'Who May Discover Real JIDs?', | |
| 37 value = { | |
| 38 { value = 'moderators', label = 'Moderators Only', default = whois == 'moderators' }, | |
| 39 { value = 'anyone', label = 'Anyone', default = whois == 'anyone' } | |
| 40 } | |
| 41 }); | |
| 42 end); | |
| 43 | |
| 44 module:hook("muc-config-submitted", function(event) | |
| 45 local new = event.fields["muc#roomconfig_whois"]; | |
| 46 if new ~= nil and set_whois(event.room, new) then | |
| 47 local code = (new == 'moderators') and "173" or "172"; | |
| 48 event.status_codes[code] = true; | |
| 49 end | |
| 50 end); | |
| 51 | |
| 52 -- Mask 'from' jid as occupant jid if room is anonymous | |
| 53 module:hook("muc-invite", function(event) | |
| 54 local room, stanza = event.room, event.stanza; | |
| 55 if get_whois(room) == "moderators" and room:get_default_role(room:get_affiliation(stanza.attr.to)) ~= "moderator" then | |
| 56 local invite = stanza:get_child("x", "http://jabber.org/protocol/muc#user"):get_child("invite"); | |
| 57 local occupant_jid = room:get_occupant_jid(invite.attr.from); | |
| 58 if occupant_jid ~= nil then -- FIXME: This will expose real jid if inviter is not in room | |
| 59 invite.attr.from = occupant_jid; | |
| 60 end | |
| 61 end | |
| 62 end, 50); | |
| 63 | |
| 64 return { | |
| 65 get = get_whois; | |
| 66 set = set_whois; | |
| 67 }; |