Comparison

plugins/muc/muc.lib.lua @ 10684:de607875d4bd

MUC: Pass previous role to :publicise_occupant_status() whenever possible Currently there is what amounts to a hack in presence_broadcast.lib.lua to make it always broadcast presence with roles of "none". This is to ensure that if you previously saw available presence for someone, you will also see the unavailable presence (which always has role="none"). The correct approach is to take into account what the previous role was ( i.e. answer the question: "Was the available presence for this occupant a role for which presence broadcast is enabled?). The logic is already in place to do this correctly, but most call sites do not provide the previous role (prev_role argument) of the occupant, which causes it to not be used. In its place the hack to always broadcast presence of role="none" has allowed things to continue to work. The intention is that a subsequent commit will remove the unconditional broadcast of role="none".
author Matthew Wild <mwild1@gmail.com>
date Thu, 12 Mar 2020 14:10:12 +0000
parent 10662:46373b97e648
child 10686:ac3ec4f2b124
comparison
equal deleted inserted replaced
10683:2f0b7f1d5e75 10684:de607875d4bd
390 if text and self:get_whois() == "anyone" then 390 if text and self:get_whois() == "anyone" then
391 error_message = error_message..": "..text; 391 error_message = error_message..": "..text;
392 end 392 end
393 occupant:set_session(real_jid, st.presence({type="unavailable"}) 393 occupant:set_session(real_jid, st.presence({type="unavailable"})
394 :tag('status'):text(error_message)); 394 :tag('status'):text(error_message));
395 local orig_role = occupant.role;
395 local is_last_session = occupant.jid == real_jid; 396 local is_last_session = occupant.jid == real_jid;
396 if is_last_session then 397 if is_last_session then
397 occupant.role = nil; 398 occupant.role = nil;
398 end 399 end
399 local new_occupant = self:save_occupant(occupant); 400 local new_occupant = self:save_occupant(occupant);
400 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); 401 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
401 if is_last_session then 402 if is_last_session then
402 x:tag("status", {code = "333"}); 403 x:tag("status", {code = "333"});
403 end 404 end
404 self:publicise_occupant_status(new_occupant or occupant, x); 405 self:publicise_occupant_status(new_occupant or occupant, x, nil, nil, nil, orig_role);
405 if is_last_session then 406 if is_last_session then
406 module:fire_event("muc-occupant-left", { 407 module:fire_event("muc-occupant-left", {
407 room = self; 408 room = self;
408 nick = occupant.nick; 409 nick = occupant.nick;
409 occupant = occupant; 410 occupant = occupant;
603 end 604 end
604 605
605 -- Send presence stanza about original occupant 606 -- Send presence stanza about original occupant
606 if orig_occupant ~= nil and orig_occupant ~= dest_occupant then 607 if orig_occupant ~= nil and orig_occupant ~= dest_occupant then
607 local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";}); 608 local orig_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user";});
609 local orig_role = orig_occupant.role;
608 local dest_nick; 610 local dest_nick;
609 if dest_occupant == nil then -- Session is leaving 611 if dest_occupant == nil then -- Session is leaving
610 log("debug", "session %s is leaving occupant %s", real_jid, orig_occupant.nick); 612 log("debug", "session %s is leaving occupant %s", real_jid, orig_occupant.nick);
611 if is_last_orig_session then 613 if is_last_orig_session then
612 orig_occupant.role = nil; 614 orig_occupant.role = nil;
645 dest_nick = nil; -- set dest_nick to nil; so general populace doesn't see it for whole orig_occupant 647 dest_nick = nil; -- set dest_nick to nil; so general populace doesn't see it for whole orig_occupant
646 end 648 end
647 end 649 end
648 650
649 self:save_occupant(orig_occupant); 651 self:save_occupant(orig_occupant);
650 self:publicise_occupant_status(orig_occupant, orig_x, dest_nick); 652 self:publicise_occupant_status(orig_occupant, orig_x, dest_nick, nil, nil, orig_role);
651 653
652 if is_last_orig_session then 654 if is_last_orig_session then
653 module:fire_event("muc-occupant-left", { 655 module:fire_event("muc-occupant-left", {
654 room = self; 656 room = self;
655 nick = orig_occupant.nick; 657 nick = orig_occupant.nick;
677 self_x:tag("status", {code = "100"}):up(); 679 self_x:tag("status", {code = "100"}):up();
678 end 680 end
679 if nick_changed then 681 if nick_changed then
680 self_x:tag("status", {code="210"}):up(); 682 self_x:tag("status", {code="210"}):up();
681 end 683 end
682 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x}); 684 self:publicise_occupant_status(dest_occupant, {base=dest_x,self=self_x}, nil, nil, nil, orig_occupant and orig_occupant.role or nil);
683 685
684 if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then 686 if orig_occupant ~= nil and orig_occupant ~= dest_occupant and not is_last_orig_session then
685 -- If user is swapping and wasn't last original session 687 -- If user is swapping and wasn't last original session
686 log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick); 688 log("debug", "session %s split nicks; showing %s rejoining", real_jid, orig_occupant.nick);
687 -- Show the original nick joining again 689 -- Show the original nick joining again
1360 end 1362 end
1361 local is_semi_anonymous = self:get_whois() == "moderators"; 1363 local is_semi_anonymous = self:get_whois() == "moderators";
1362 1364
1363 if next(occupants_updated) ~= nil then 1365 if next(occupants_updated) ~= nil then
1364 for occupant, old_role in pairs(occupants_updated) do 1366 for occupant, old_role in pairs(occupants_updated) do
1365 self:publicise_occupant_status(occupant, x, nil, actor, reason); 1367 self:publicise_occupant_status(occupant, x, nil, actor, reason, old_role);
1366 if occupant.role == nil then 1368 if occupant.role == nil then
1367 module:fire_event("muc-occupant-left", { 1369 module:fire_event("muc-occupant-left", {
1368 room = self; 1370 room = self;
1369 nick = occupant.nick; 1371 nick = occupant.nick;
1370 occupant = occupant; 1372 occupant = occupant;