- /*
- * XXX: If the user is an oper here, we can just extend their user->chans vector by one
- * and put the channel in here. Same for remote users which are not bound by
- * the channel limits. Otherwise, nope, youre boned.
- */
- if (!IS_LOCAL(user) || override == true) /* was a check on fd < 0 */
- {
- ucrec* a = new ucrec();
- chanrec* c = chanrec::ForceChan(Instance, Ptr, a, user, privs);
- user->chans.push_back(a);
- return c;
- }
- else if (*user->oper)
- {
- /* Oper allows extension up to the OPERMAXCHANS value */
- if (user->chans.size() < OPERMAXCHANS)
- {
- ucrec* a = new ucrec();
- chanrec* c = chanrec::ForceChan(Instance, Ptr, a, user, privs);
- user->chans.push_back(a);
- return c;
- }
- }
-
- user->WriteServ("405 %s %s :You are on too many channels",user->nick, cname);
-
- if (new_channel)
- {
- Instance->Log(DEBUG,"BLAMMO, Whacking 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);
- for (unsigned int index =0; index < user->chans.size(); index++)
- {
- if (user->chans[index]->channel == Ptr)
- {
- user->chans[index]->channel = NULL;
- user->chans[index]->uc_modes = 0;
- }
- }
- }
- }
- else
- {
- for (unsigned int index =0; index < user->chans.size(); index++)
- {
- if (user->chans[index]->channel == Ptr)
- {
- user->chans[index]->channel = NULL;
- user->chans[index]->uc_modes = 0;
- }
- }
- }
- return NULL;