|
|
|
|
@ -20,6 +20,30 @@ local function set_members_only(room, members_only) |
|
|
|
|
members_only = members_only and true or nil; |
|
|
|
|
if room._data.members_only == members_only then return false; end |
|
|
|
|
room._data.members_only = members_only; |
|
|
|
|
if members_only then |
|
|
|
|
--[[ |
|
|
|
|
If as a result of a change in the room configuration the room type is |
|
|
|
|
changed to members-only but there are non-members in the room, |
|
|
|
|
the service MUST remove any non-members from the room and include a |
|
|
|
|
status code of 322 in the presence unavailable stanzas sent to those users |
|
|
|
|
as well as any remaining occupants. |
|
|
|
|
]] |
|
|
|
|
local occupants_changed = {}; |
|
|
|
|
for nick, occupant in room:each_occupant() do |
|
|
|
|
local affiliation = room:get_affiliation(occupant.bare_jid); |
|
|
|
|
if valid_affiliations[affiliation or "none"] <= valid_affiliations.none then |
|
|
|
|
occupant.role = nil; |
|
|
|
|
room:save_occupant(occupant); |
|
|
|
|
occupants_changed[occupant] = true; |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}) |
|
|
|
|
:tag("status", {code="322"}):up(); |
|
|
|
|
for occupant in pairs(occupants_changed) do |
|
|
|
|
room:publicise_occupant_status(occupant, x); |
|
|
|
|
module:fire_event("muc-occupant-left", {room = room; nick = occupant.nick; occupant = occupant;}); |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
if room.save then room:save(true); end |
|
|
|
|
return true; |
|
|
|
|
end |
|
|
|
|
|