Mercurial > prosody-hg
comparison plugins/muc/muc.lib.lua @ 10687:8c2c5b4fde32
MUC: Support for broadcasting unavailable presence for affiliated offline users
Activated when muc#roomconfig_presencebroadcast includes the "none" role.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 12 Mar 2020 16:01:31 +0000 |
| parents | ac3ec4f2b124 |
| children | 83668e16b9a3 |
comparison
equal
deleted
inserted
replaced
| 10686:ac3ec4f2b124 | 10687:8c2c5b4fde32 |
|---|---|
| 331 if not (occupant and can_see_real_jids(whois, occupant)) then | 331 if not (occupant and can_see_real_jids(whois, occupant)) then |
| 332 is_anonymous = true; | 332 is_anonymous = true; |
| 333 end | 333 end |
| 334 end | 334 end |
| 335 end | 335 end |
| 336 local broadcast_bare_jids = {}; -- Track which bare JIDs we have sent presence for | |
| 336 for occupant_jid, occupant in self:each_occupant() do | 337 for occupant_jid, occupant in self:each_occupant() do |
| 338 broadcast_bare_jids[occupant.bare_jid] = true; | |
| 337 if filter == nil or filter(occupant_jid, occupant) then | 339 if filter == nil or filter(occupant_jid, occupant) then |
| 338 local x = st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); | 340 local x = st.stanza("x", {xmlns='http://jabber.org/protocol/muc#user'}); |
| 339 self:build_item_list(occupant, x, is_anonymous and to_bare ~= occupant.bare_jid); -- can always see your own jids | 341 self:build_item_list(occupant, x, is_anonymous and to_bare ~= occupant.bare_jid); -- can always see your own jids |
| 340 local pres = st.clone(occupant:get_presence()); | 342 local pres = st.clone(occupant:get_presence()); |
| 341 pres.attr.to = to; | 343 pres.attr.to = to; |
| 342 pres:add_child(x); | 344 pres:add_child(x); |
| 343 if to_bare == occupant.bare_jid or broadcast_roles[occupant.role or "none"] then | 345 if to_bare == occupant.bare_jid or broadcast_roles[occupant.role or "none"] then |
| 346 self:route_stanza(pres); | |
| 347 end | |
| 348 end | |
| 349 end | |
| 350 if broadcast_roles.none then | |
| 351 -- Broadcast stanzas for affiliated users not currently in the MUC | |
| 352 for affiliated_jid, affiliation, affiliation_data in self:each_affiliation() do | |
| 353 local nick = affiliation_data and affiliation_data.reserved_nickname; | |
| 354 if (nick or not is_anonymous) and not broadcast_bare_jids[affiliated_jid] | |
| 355 and (filter == nil or filter(affiliated_jid, nil)) then | |
| 356 local from = nick and (self.jid.."/"..nick) or self.jid; | |
| 357 local pres = st.presence({ to = to, from = from, type = "unavailable" }) | |
| 358 :tag("x", { xmlns = 'http://jabber.org/protocol/muc#user' }) | |
| 359 :tag("item", { | |
| 360 affiliation = affiliation; | |
| 361 role = "none"; | |
| 362 nick = nick; | |
| 363 jid = not is_anonymous and affiliated_jid or nil }):up() | |
| 364 :up(); | |
| 344 self:route_stanza(pres); | 365 self:route_stanza(pres); |
| 345 end | 366 end |
| 346 end | 367 end |
| 347 end | 368 end |
| 348 end | 369 end |
| 668 | 689 |
| 669 if orig_occupant == nil or muc_x then | 690 if orig_occupant == nil or muc_x then |
| 670 -- Send occupant list to newly joined or desynced user | 691 -- Send occupant list to newly joined or desynced user |
| 671 self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212 | 692 self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212 |
| 672 -- Don't include self | 693 -- Don't include self |
| 673 return occupant:get_presence(real_jid) == nil; | 694 return (not occupant) or occupant:get_presence(real_jid) == nil; |
| 674 end) | 695 end) |
| 675 end | 696 end |
| 676 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); | 697 local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); |
| 677 local self_x = st.clone(dest_x); | 698 local self_x = st.clone(dest_x); |
| 678 if orig_occupant == nil and self:get_whois() == "anyone" then | 699 if orig_occupant == nil and self:get_whois() == "anyone" then |
| 1376 (old_role == "moderator" and occupant.role ~= "moderator") or | 1397 (old_role == "moderator" and occupant.role ~= "moderator") or |
| 1377 (old_role ~= "moderator" and occupant.role == "moderator") then -- Has gained or lost moderator status | 1398 (old_role ~= "moderator" and occupant.role == "moderator") then -- Has gained or lost moderator status |
| 1378 -- Send everyone else's presences (as jid visibility has changed) | 1399 -- Send everyone else's presences (as jid visibility has changed) |
| 1379 for real_jid in occupant:each_session() do | 1400 for real_jid in occupant:each_session() do |
| 1380 self:send_occupant_list(real_jid, function(occupant_jid, occupant) --luacheck: ignore 212 433 | 1401 self:send_occupant_list(real_jid, function(occupant_jid, occupant) --luacheck: ignore 212 433 |
| 1381 return occupant.bare_jid ~= jid; | 1402 return (not occupant) or occupant.bare_jid ~= jid; |
| 1382 end); | 1403 end); |
| 1383 end | 1404 end |
| 1384 end | 1405 end |
| 1385 end | 1406 end |
| 1386 else | 1407 else |
