+ 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 = strchr(chan->custom_modes,*modechar);
+ if ((!x && !mdir) || (x && mdir))
+ {
+ if (!ModeIsListMode(*modechar,MT_CHANNEL))