- 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)
- {
- *outl++ = 'l';
- outpars[pc++] = parameters[param++];
- 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)) *outl++ = 'i';
- chan->binarymodes |= CM_INVITEONLY;
- }
- else
- {
- if (chan->binarymodes & CM_INVITEONLY) *outl++ = 'i';
- 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)) *outl++ = 't';
- chan->binarymodes |= CM_TOPICLOCK;
- }
- else
- {
- if (chan->binarymodes & CM_TOPICLOCK) *outl++ = 't';
- 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)) *outl++ = 'n';
- chan->binarymodes |= CM_NOEXTERNAL;
- }
- else
- {
- if (chan->binarymodes & CM_NOEXTERNAL) *outl++ = 'n';
- 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)) *outl++ = 'm';
- chan->binarymodes |= CM_MODERATED;
- }
- else
- {
- if (chan->binarymodes & CM_MODERATED) *outl++ = 'm';
- 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)) *outl++ = 's';
- chan->binarymodes |= CM_SECRET;
- if (chan->binarymodes & CM_PRIVATE)
- {
- chan->binarymodes &= ~CM_PRIVATE;
- if (mdir)
- {
- *outl++ = '-'; *outl++ = 'p'; *outl++ = '+';
- }
- }
- }
- else
- {
- if (chan->binarymodes & CM_SECRET) *outl++ = 's';
- 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)) *outl++ = 'p';
- chan->binarymodes |= CM_PRIVATE;
- if (chan->binarymodes & CM_SECRET)
- {
- chan->binarymodes &= ~CM_SECRET;
- if (mdir)
- {
- *outl++ = '-'; *outl++ = 's'; *outl++ = '+';
- }
- }
- }
- else
- {
- if (chan->binarymodes & CM_PRIVATE) *outl++ = 'p';
- chan->binarymodes &= ~CM_PRIVATE;
- }
- }
- break;
-
- default:
- string_list p;
- p.clear();
- bool x = chan->custom_modes[*modechar-65];
- if ((!x && !mdir) || (x && 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))
- {
- /* A module has claimed this mode */
- if (param<pcnt)
- {
- if ((ModeDefinedOn(*modechar,MT_CHANNEL)>0) && (mdir))