Software /
code /
prosody
Comparison
plugins/muc/muc.lib.lua @ 6211:a4d26656df04
plugins/muc/muc.lib: Clean up whois handling
- adds functions `can_see_real_jids` and `get_base_presence`
- In `publicise_occupant_status`, we don't generate each type of presence until it's used
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Thu, 03 Apr 2014 12:25:03 -0400 |
parent | 6209:cc00e78e6a31 |
child | 6212:b82523f92b06 |
comparison
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 |