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 |