plugins/muc/muc.lib.lua
changeset 6211 a4d26656df04
parent 6209 cc00e78e6a31
child 6212 b82523f92b06
equal deleted inserted replaced
6210:e9d62fff82a8 6211:a4d26656df04
   215 			self:route_to_occupant(occupant, stanza)
   215 			self:route_to_occupant(occupant, stanza)
   216 		end
   216 		end
   217 	end
   217 	end
   218 end
   218 end
   219 
   219 
   220 -- Broadcasts an occupant's presence to the whole room
   220 local function can_see_real_jids(whois, occupant)
   221 -- Takes (and modifies) the x element that goes into the stanzas
   221 	if whois == "anyone" then
   222 function room_mt:publicise_occupant_status(occupant, full_x, actor, reason)
   222 		return true;
   223 	local anon_x;
   223 	elseif whois == "moderators" then
   224 	local has_anonymous = self:get_whois() ~= "anyone";
   224 		return valid_roles[occupant.role or "none"] >= valid_roles.moderator;
   225 	if has_anonymous then
   225 	end
   226 		anon_x = st.clone(full_x);
   226 end
   227 		self:build_item_list(occupant, anon_x, true, nil, actor, reason);
   227 
   228 	end
   228 local function get_base_presence(occupant)
   229 	self:build_item_list(occupant,full_x, false, nil, actor, reason);
       
   230 
       
   231 	-- General populance
       
   232 	local full_p
       
   233 	if occupant.role ~= nil then
   229 	if occupant.role ~= nil then
   234 		-- Try to use main jid's presence
   230 		-- Try to use main jid's presence
   235 		local pr = occupant:get_presence();
   231 		local pr = occupant:get_presence();
   236 		if pr ~= nil then
   232 		if pr ~= nil then
   237 			full_p = st.clone(pr);
   233 			return st.clone(pr);
   238 		end
   234 		end
   239 	end
   235 	end
   240 	if full_p == nil then
   236 	return st.presence {from = occupant.nick; type = "unavailable";};
   241 		full_p = st.presence{from=occupant.nick; type="unavailable"};
   237 end
   242 	end
   238 
   243 	local anon_p;
   239 -- Broadcasts an occupant's presence to the whole room
   244 	if has_anonymous then
   240 -- Takes the x element that goes into the stanzas
   245 		anon_p = st.clone(full_p);
   241 function room_mt:publicise_occupant_status(occupant, base_x, actor, reason)
   246 		anon_p:add_child(anon_x);
   242 	-- Build real jid and (optionally) occupant jid template presences
   247 	end
   243 	local function get_presence(is_anonymous)
   248 	full_p:add_child(full_x);
   244 		local x = st.clone(base_x);
   249 
   245 		self:build_item_list(occupant, x, is_anonymous, actor, reason);
       
   246 		return get_base_presence(occupant):add_child(x), x;
       
   247 	end
       
   248 	local full_p, full_x = get_presence(false);
       
   249 	local anon_p, anon_x;
       
   250 	local function get_anon_p()
       
   251 		if anon_p == nil then
       
   252 			anon_p, anon_x = get_presence(true);
       
   253 		end
       
   254 		return anon_p, anon_x;
       
   255 	end
       
   256 
       
   257 	local whois = self:get_whois();
       
   258 
       
   259 	-- General populance
   250 	for nick, n_occupant in self:each_occupant() do
   260 	for nick, n_occupant in self:each_occupant() do
   251 		if nick ~= occupant.nick or n_occupant.role == nil then
   261 		if nick ~= occupant.nick then
   252 			local pr = full_p;
   262 			local pr;
   253 			if has_anonymous and n_occupant.role ~= "moderator" and occupant.bare_jid ~= n_occupant.bare_jid then
   263 			if can_see_real_jids(whois, occupant) or occupant.bare_jid == n_occupant.bare_jid then
   254 				pr = anon_p;
   264 				pr = full_p;
       
   265 			else
       
   266 				pr = get_anon_p();
   255 			end
   267 			end
   256 			self:route_to_occupant(n_occupant, pr);
   268 			self:route_to_occupant(n_occupant, pr);
   257 		end
   269 		end
   258 	end
   270 	end
   259 
   271 
   277 end
   289 end
   278 
   290 
   279 function room_mt:send_occupant_list(to, filter)
   291 function room_mt:send_occupant_list(to, filter)
   280 	local to_bare = jid_bare(to);
   292 	local to_bare = jid_bare(to);
   281 	local is_anonymous = true;
   293 	local is_anonymous = true;
   282 	if self:get_whois() ~= "anyone" then
   294 	local whois = self:get_whois();
       
   295 	if whois ~= "anyone" then
   283 		local affiliation = self:get_affiliation(to);
   296 		local affiliation = self:get_affiliation(to);
   284 		if affiliation ~= "admin" and affiliation ~= "owner" then
   297 		if affiliation ~= "admin" and affiliation ~= "owner" then
   285 			local occupant = self:get_occupant_by_real_jid(to);
   298 			local occupant = self:get_occupant_by_real_jid(to);
   286 			if not occupant or occupant.role ~= "moderator" then
   299 			if not occupant or can_see_real_jids(whois, occupant) then
   287 				is_anonymous = false;
   300 				is_anonymous = false;
   288 			end
   301 			end
   289 		end
   302 		end
   290 	end
   303 	end
   291 	for occupant_jid, occupant in self:each_occupant() do
   304 	for occupant_jid, occupant in self:each_occupant() do