- MOD_RESULT = 0;
- FOREACH_RESULT(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)
- {
- strlcat(outlist,"l",MAXBUF);
- strlcpy(outpars[pc++],parameters[param++],MAXBUF);
- l_set = true;
- }
- }
- break;
-
- case 'i':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'i', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_INVITEONLY)) strlcat(outlist,"i",MAXBUF);
- chan->binarymodes |= CM_INVITEONLY;
- }
- else
- {
- if (chan->binarymodes & CM_INVITEONLY) strlcat(outlist,"i",MAXBUF);
- chan->binarymodes &= ~CM_INVITEONLY;
- }
- }
- break;
-
- case 't':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 't', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_TOPICLOCK)) strlcat(outlist,"t",MAXBUF);
- chan->binarymodes |= CM_TOPICLOCK;
- }
- else
- {
- if (chan->binarymodes & CM_NOEXTERNAL) strlcat(outlist,"t",MAXBUF);
- chan->binarymodes &= ~CM_TOPICLOCK;
- }
- }
- break;
-
- case 'n':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'n', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_NOEXTERNAL)) strlcat(outlist,"n",MAXBUF);
- chan->binarymodes |= CM_NOEXTERNAL;
- }
- else
- {
- if (chan->binarymodes & CM_NOEXTERNAL) strlcat(outlist,"n",MAXBUF);
- chan->binarymodes &= ~CM_NOEXTERNAL;
- }
- }
- break;
-
- case 'm':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'm', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_MODERATED)) strlcat(outlist,"m",MAXBUF);
- chan->binarymodes |= CM_MODERATED;
- }
- else
- {
- if (chan->binarymodes & CM_MODERATED) strlcat(outlist,"m",MAXBUF);
- chan->binarymodes &= ~CM_MODERATED;
- }
- }
- break;
-
- case 's':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 's', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_SECRET)) strlcat(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) strlcat(outlist,"s",MAXBUF);
- chan->binarymodes &= ~CM_SECRET;
- }
- }
- break;
-
- case 'p':
- MOD_RESULT = 0;
- FOREACH_RESULT(OnRawMode(user, chan, 'p', "", mdir, 0));
- if (!MOD_RESULT)
- {
- if (mdir)
- {
- if (!(chan->binarymodes & CM_PRIVATE)) strlcat(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) strlcat(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(OnRawMode(user, chan, modechar, para, mdir, pcnt));
- if (!MOD_RESULT)
- {
- for (int i = 0; i <= MODCOUNT; i++)
- {
- if (!handled)