mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Fix channels with +D or +u set being picked for the /WHO response.
This commit is contained in:
parent
59ec1f6eb6
commit
e37ee111a8
@ -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)
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user