if (!user || !cn)
return NULL;
- bool new_channel = false;
char cname[MAXBUF];
int MOD_RESULT = 0;
- strlcpy(cname,cn,CHANMAX);
-
std::string privs;
+ chanrec *Ptr;
+
+ /*
+ * We don't restrict the number of channels that remote users or users that are override-joining may be in.
+ * We restrict local users to MaxChans channels.
+ * We restrict local operators to OperMaxChans channels.
+ * This is a lot more logical than how it was formerly. -- w00t
+ */
+ if (IS_LOCAL(user) && !override)
+ {
+ if (user->GetMaxChans())
+ {
+ if (user->chans.size() >= user->GetMaxChans())
+ {
+ user->WriteServ("405 %s %s :You are on too many channels",user->nick, cn);
+ return NULL;
+ }
+ }
+ else
+ {
+ if (IS_OPER(user))
+ {
+ if (user->chans.size() >= Instance->Config->OperMaxChans)
+ {
+ user->WriteServ("405 %s %s :You are on too many channels",user->nick, cn);
+ return NULL;
+ }
+ }
+ else
+ {
+ if (user->chans.size() >= Instance->Config->MaxChans)
+ {
+ user->WriteServ("405 %s %s :You are on too many channels",user->nick, cn);
+ return NULL;
+ }
+ }
+ }
+ }
- chanrec* Ptr = Instance->FindChan(cname);
+ strlcpy(cname, cn, CHANMAX);
+ Ptr = Instance->FindChan(cname);
if (!Ptr)
{
*Ptr->topic = 0;
*Ptr->setby = 0;
Ptr->topicset = 0;
- new_channel = true;
}
else
{
}
}
}
- if (Ptr->modes[CM_INVITEONLY])
+ if (Ptr->IsModeSet('i'))
{
MOD_RESULT = 0;
FOREACH_RESULT_I(Instance,I_OnCheckInvite,OnCheckInvite(user, Ptr));
}
}
- /* NOTE: If the user is an oper here, we can extend their user->chans by up to
- * OperMaxchans. For remote users which are not bound by the channel limits,
- * we can extend infinitely. Otherwise, nope, youre restricted to MaxChans.
- */
-
-
-
- /*
- * We place no restrictions on remote users, users that are override-joining, or users that are
- * currently in under MaxChans channels. For all others, they won't get in here. -- w00t
- */
- if (!IS_LOCAL(user) || override == true || user->chans.size() < Instance->Config->MaxChans)
- {
- return chanrec::ForceChan(Instance, Ptr, user, privs);
- }
-
- /*
- * If the above fails, and the user is an oper -- we let them in if they are under OperMaxChans.
- * Otherwise, they're stuck, and need to override to get in, etc. -- w00t
- */
- if (IS_OPER(user))
- {
- if (user->chans.size() < Instance->Config->OperMaxChans)
- {
- return chanrec::ForceChan(Instance, Ptr, user, privs);
- }
- }
-
- user->WriteServ("405 %s %s :You are on too many channels",user->nick, cname);
-
- if (new_channel)
- {
- /* Things went seriously pear shaped, so take this away. bwahaha. */
- chan_hash::iterator n = Instance->chanlist->find(cname);
- if (n != Instance->chanlist->end())
- {
- Ptr->DelUser(user);
- DELETE(Ptr);
- Instance->chanlist->erase(n);
- }
- }
-
- return NULL;
+ return chanrec::ForceChan(Instance, Ptr, user, privs);
}
chanrec* chanrec::ForceChan(InspIRCd* Instance, chanrec* Ptr, userrec* user, const std::string &privs)
for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
{
- if ((!has_user) && (i->first->modes[UM_INVISIBLE]))
+ if ((!has_user) && (i->first->IsModeSet('i')))
{
/*
* user is +i, and source not on the channel, does not show