Fix channels with +D or +u set being picked for the /WHO response.

This commit is contained in:
Sadie Powell 2022-10-07 18:12:58 +01:00
parent 59ec1f6eb6
commit e37ee111a8
2 changed files with 20 additions and 0 deletions

View File

@ -64,6 +64,7 @@ class ModuleAuditorium
: public Module
, public Names::EventListener
, public Who::EventListener
, public Who::VisibleEventListener
{
CheckExemption::EventProvider exemptionprov;
AuditoriumMode aum;
@ -76,6 +77,7 @@ class ModuleAuditorium
ModuleAuditorium()
: Names::EventListener(this)
, Who::EventListener(this)
, Who::VisibleEventListener(this)
, exemptionprov(this)
, aum(this)
, joinhook(this)
@ -193,6 +195,12 @@ class ModuleAuditorium
return MOD_RES_PASSTHRU;
return MOD_RES_DENY;
}
ModResult OnWhoVisible(const Who::Request& request, LocalUser* source, Membership* memb) CXX11_OVERRIDE
{
// Never pick a channel as the first visible one if the channel is in auditorium mode.
return IsVisible(memb) || CanSee(source, memb) ? MOD_RES_PASSTHRU : MOD_RES_DENY;
}
};
JoinHook::JoinHook(ModuleAuditorium* mod)

View File

@ -88,6 +88,7 @@ class ModuleDelayJoin
, public CTCTags::EventListener
, public Names::EventListener
, public Who::EventListener
, public Who::VisibleEventListener
{
public:
LocalIntExt unjoined;
@ -98,6 +99,7 @@ class ModuleDelayJoin
: CTCTags::EventListener(this)
, Names::EventListener(this)
, Who::EventListener(this)
, Who::VisibleEventListener(this)
, unjoined("delayjoin", ExtensionItem::EXT_MEMBERSHIP, this)
, joinhook(this, unjoined)
, djm(this, unjoined)
@ -107,6 +109,7 @@ class ModuleDelayJoin
Version GetVersion() CXX11_OVERRIDE;
ModResult OnNamesListItem(LocalUser* issuer, Membership*, std::string& prefixes, std::string& nick) CXX11_OVERRIDE;
ModResult OnWhoLine(const Who::Request& request, LocalUser* source, User* user, Membership* memb, Numeric::Numeric& numeric) CXX11_OVERRIDE;
ModResult OnWhoVisible(const Who::Request& request, LocalUser* source, Membership* memb) CXX11_OVERRIDE;
void OnUserJoin(Membership*, bool, bool, CUList&) CXX11_OVERRIDE;
void CleanUser(User* user);
void OnUserPart(Membership*, std::string &partmessage, CUList&) CXX11_OVERRIDE;
@ -172,6 +175,15 @@ ModResult ModuleDelayJoin::OnWhoLine(const Who::Request& request, LocalUser* sou
return MOD_RES_PASSTHRU;
}
ModResult ModuleDelayJoin::OnWhoVisible(const Who::Request& request, LocalUser* source, Membership* memb)
{
// A WHO request is visible if:
// 1. The source is the user.
// 2. The user specified the delayjoin `d` flag.
// 3. The user is not delayjoined.
return source == memb->user || request.flags['d'] || !unjoined.get(memb) ? MOD_RES_PASSTHRU : MOD_RES_DENY;
}
static void populate(CUList& except, Membership* memb)
{
const Channel::MemberMap& users = memb->chan->GetUsers();