- if (invalid)
- break;
-
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'l', parameters[param], true, 1));
- if (!MOD_RESULT)
- {
-
- chan->limit = atoi(parameters[param]);
-
- // reported by mech: large values cause underflow
- if (chan->limit < 0)
- chan->limit = 0x7FFF;
- }
-
- if (chan->limit)
- {
- charlcat(outlist,'l',MAXBUF);
- strlcpy(outpars[pc++],parameters[param++],MAXBUF);
- l_set = true;
- }
- }
- break;
-
- case 'i':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'i', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_INVITEONLY)) charlcat(outlist,'i',MAXBUF);
- chan->binarymodes |= CM_INVITEONLY;
- }
- else
- {
- if (chan->binarymodes & CM_INVITEONLY) charlcat(outlist,'i',MAXBUF);
- chan->binarymodes &= ~CM_INVITEONLY;
- }
- }
- break;
-
- case 't':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 't', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_TOPICLOCK)) charlcat(outlist,'t',MAXBUF);
- chan->binarymodes |= CM_TOPICLOCK;
- }
- else
- {
- if (chan->binarymodes & CM_TOPICLOCK) charlcat(outlist,'t',MAXBUF);
- chan->binarymodes &= ~CM_TOPICLOCK;
- }
- }
- break;
-
- case 'n':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'n', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_NOEXTERNAL)) charlcat(outlist,'n',MAXBUF);
- chan->binarymodes |= CM_NOEXTERNAL;
- }
- else
- {
- if (chan->binarymodes & CM_NOEXTERNAL) charlcat(outlist,'n',MAXBUF);
- chan->binarymodes &= ~CM_NOEXTERNAL;
- }
- }
- break;
-
- case 'm':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'm', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_MODERATED)) charlcat(outlist,'m',MAXBUF);
- chan->binarymodes |= CM_MODERATED;
- }
- else
- {
- if (chan->binarymodes & CM_MODERATED) charlcat(outlist,'m',MAXBUF);
- chan->binarymodes &= ~CM_MODERATED;
- }
- }
- break;
-
- case 's':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 's', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_SECRET)) charlcat(outlist,'s',MAXBUF);
- chan->binarymodes |= CM_SECRET;
- if (chan->binarymodes & CM_PRIVATE)
- {
- chan->binarymodes &= ~CM_PRIVATE;
- if (mdir)
- {
- strlcat(outlist,"-p+",MAXBUF);
- }
- }
- }
- else
- {
- if (chan->binarymodes & CM_SECRET) charlcat(outlist,'s',MAXBUF);
- chan->binarymodes &= ~CM_SECRET;
- }
- }
- break;
-
- case 'p':
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'p', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_PRIVATE)) charlcat(outlist,'p',MAXBUF);
- chan->binarymodes |= CM_PRIVATE;
- if (chan->binarymodes & CM_SECRET)
- {
- chan->binarymodes &= ~CM_SECRET;
- if (mdir)
- {
- strlcat(outlist,"-s+",MAXBUF);
- }
- }
- }
- else
- {
- if (chan->binarymodes & CM_PRIVATE) charlcat(outlist,'p',MAXBUF);
- chan->binarymodes &= ~CM_PRIVATE;
- }
- }
- break;
-
- default:
- log(DEBUG,"Preprocessing custom mode %c: modelist: %s",*modechar,chan->custom_modes);
- string_list p;
- p.clear();
- if (((!strchr(chan->custom_modes,*modechar)) && (!mdir)) || ((strchr(chan->custom_modes,*modechar)) && (mdir)))
- {
- if (!ModeIsListMode(*modechar,MT_CHANNEL))
- {
- log(DEBUG,"Mode %c isnt set on %s but trying to remove!",*modechar,chan->name);
- break;
- }
- }
- if (ModeDefined(*modechar,MT_CHANNEL))
- {
- log(DEBUG,"A module has claimed this mode");
- if (param<pcnt)
- {
- if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
- {
- p.push_back(parameters[param]);
- }
- if ((ModeDefinedOff(*modechar,MT_CHANNEL)>0) && (!mdir))
- {
- p.push_back(parameters[param]);
- }
- }
- bool handled = false;
- if (param>=pcnt)
- {
- // we're supposed to have a parameter, but none was given... so dont handle the mode.
- if (((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir)) || ((ModeDefinedOff(*modechar,MT_CHANNEL)>0) && (!mdir)))
- {
- log(DEBUG,"Not enough parameters for module-mode %c",*modechar);
- handled = true;
- param++;
- }
- }
-
- // BIG ASS IDIOTIC CODER WARNING!
- // Using OnRawMode on another modules mode's behavour
- // will confuse the crap out of admins! just because you CAN
- // do it, doesnt mean you SHOULD!
- MOD_RESULT = 0;
- std::string para = "";
- if (p.size())
- para = p[0];
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, *modechar, para, mdir, pcnt));
- if (!MOD_RESULT)
- {
- for (int i = 0; i <= MODCOUNT; i++)
- {
- if (!handled)
- {
- int t = modules[i]->OnExtendedMode(user,chan,*modechar,MT_CHANNEL,mdir,p);
- if (t != 0)
- {
- log(DEBUG,"OnExtendedMode returned nonzero for a module");
- if (ModeIsListMode(*modechar,MT_CHANNEL))
- {
- if (t == -1)
- {
- //pc++;
- param++;
- }
- else
- {
- if (ptr>0)
- {
- charlcat(outlist,*modechar,MAXBUF);
- }
- strlcpy(outpars[pc++],parameters[param++],MAXBUF);
- }
- }
- else
- {
- if (ptr>0)
- {
- if ((modelist[ptr-1] == '+') || (modelist[ptr-1] == '-'))
- {
- charlcat(outlist,*modechar,MAXBUF);
- }
- else if (!strchr(outlist,*modechar))
- {
- charlcat(outlist,*modechar,MAXBUF);
- }
- }
- chan->SetCustomMode(*modechar,mdir);
- // include parameters in output if mode has them
- if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))
- {
- chan->SetCustomModeParam(modelist[ptr],parameters[param],mdir);
- strlcpy(outpars[pc++],parameters[param++],MAXBUF);
- }
- }
- // break, because only one module can handle the mode.
- handled = true;
- }
- }
- }
- }
- }
- else
- {
- WriteServ(user->fd,"472 %s %c :is unknown mode char to me",user->nick,*modechar);
- }
- break;
-
- }
- }
- }