- else if ((dest) && (pcnt > 1))
- {
- std::string tidied = ServerInstance->ModeGrok->CompressModes(parameters[1],false);
- parameters[1] = (char*)tidied.c_str();
-
- char dmodes[MAXBUF];
- strlcpy(dmodes,dest->modes,MAXMODES);
- log(DEBUG,"pulled up dest user modes: %s",dmodes);
-
- can_change = 0;
- if (user != dest)
- {
- if ((*user->oper) || (is_uline(user->server)))
- {
- can_change = 1;
- }
- }
- else
- {
- can_change = 1;
- }
- if (!can_change)
- {
- WriteServ(user->fd,"482 %s :Can't change mode for other users",user->nick);
- return;
- }
-
- outpars[0] = *parameters[1];
- outpars[1] = 0;
- direction = (*parameters[1] == '+');
-
- if ((*parameters[1] != '+') && (*parameters[1] != '-'))
- return;
-
- for (char* i = parameters[1]; *i; i++)
- {
- if ((i != parameters[1]) && (*i != '+') && (*i != '-'))
- next_ok = true;
-
- switch (*i)
- {
- case ' ':
- continue;
-
- case '+':
- if ((direction != 1) && (next_ok))
- {
- charlcat(outpars,'+',MAXBUF);
- next_ok = false;
- }
- direction = 1;
- break;
-
- case '-':
- if ((direction != 0) && (next_ok))
- {
- charlcat(outpars,'-',MAXBUF);
- next_ok = false;
- }
- direction = 0;
- break;
-
- default:
- can_change = 0;
- if (*user->oper)
- {
- can_change = 1;
- }
- else
- {
- if ((*i == 'i') || (*i == 'w') || (*i == 's') || (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,direction,false)))
- {
- can_change = 1;
- }
- }
- if (can_change)
- {
- if (direction == 1)
- {
- if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,false)))
- {
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
- {
- charlcat(dmodes,*i,53);
- charlcat(outpars,*i,MAXMODES);
- switch (*i)
- {
- case 'o':
- FOREACH_MOD(I_OnGlobalOper,OnGlobalOper(dest));
- break;
- case 'i':
- dest->modebits |= UM_INVISIBLE;
- break;
- case 's':
- dest->modebits |= UM_SERVERNOTICE;
- break;
- case 'w':
- dest->modebits |= UM_WALLOPS;
- break;
- default:
- break;
- }
- }
- }
- }
- else
- {
- if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,false)) && (strchr(dmodes,*i)))
- {
- if ((ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)) || (*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o'))
- {
- charlcat(outpars,*i,MAXMODES);
- charremove(dmodes,*i);
- switch (*i)
- {
- case 'o':
- *dest->oper = 0;
- DeleteOper(dest);
- break;
- case 'i':
- dest->modebits &= ~UM_INVISIBLE;
- break;
- case 's':
- dest->modebits &= ~UM_SERVERNOTICE;
- break;
- case 'w':
- dest->modebits &= ~UM_WALLOPS;
- break;
- default:
- break;
- }
- }
- }
- }
- }
- break;
- }
- }
- if (*outpars)
- {
- char b[MAXBUF];
- char* z = b;