-
-
-
-void ModeParser::ServerMode(char **parameters, int pcnt, userrec *user)
-{
- chanrec* Ptr;
- userrec* dest = Find(parameters[0]);
- int can_change;
- int direction = 1;
- char outpars[MAXBUF];
- bool next_ok = true;
-
- 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,MAXBUF);
-
- 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))
- {
- next_ok = false;
- charlcat(outpars,'+',MAXBUF);
- }
- direction = 1;
- break;
-
- case '-':
- if ((direction != 0) && (next_ok))
- {
- next_ok = false;
- charlcat(outpars,'-',MAXBUF);
- }
- direction = 0;
- break;
-
- default:
- log(DEBUG,"begin mode processing entry");
- can_change = 1;
- if (can_change)
- {
- if (direction == 1)
- {
- log(DEBUG,"umode %c being added",*i);
- if ((!strchr(dmodes,*i)) && (ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,true,true)))
- {
- log(DEBUG,"umode %c is an allowed umode",*i);
- if ((*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o') || (ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)))
- {
- charlcat(dmodes,*i,MAXBUF);
- charlcat(outpars,*i,53);
- switch (*i)
- {
- case 'i':
- dest->modebits |= UM_INVISIBLE;
- break;
- case 's':
- dest->modebits |= UM_SERVERNOTICE;
- break;
- case 'w':
- dest->modebits |= UM_WALLOPS;
- break;
- default:
- break;
- }
- }
- }
- }
- else
- {
- // can only remove a mode they already have
- log(DEBUG,"umode %c being removed",*i);
- if ((ServerInstance->ModeGrok->AllowedUmode(*i,user->modes,false,true)) && (strchr(dmodes,*i)))
- {
- log(DEBUG,"umode %c is an allowed umode",*i);
- if ((*i == 'i') || (*i == 's') || (*i == 'w') || (*i == 'o') || (ServerInstance->ModeGrok->ProcessModuleUmode(*i, user, dest, direction)))
- {
- charlcat(outpars,*i,MAXBUF);
- charremove(dmodes,*i);
- switch (*i)
- {
- 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;
-
- for (char* i = outpars; *i;)
- {
- *z++ = *i++;
- if (((*i == '-') || (*i == '+')) && ((*(i+1) == '-') || (*(i+1) == '+')))
- {
- // someones playing silly buggers and trying
- // to put a +- or -+ into the line...
- i++;
- }
- if (!*(i+1))
- {
- // Someone's trying to make the last character in
- // the line be a + or - symbol.
- if ((*i == '-') || (*i == '+'))
- {
- i++;
- }
- }
- }
- *z = 0;
-
- if ((*b) && (!IS_SINGLE(b,'+')) && (!IS_SINGLE(b,'-')))
- {
- WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
- FOREACH_MOD(I_OnMode,OnMode(user, dest, TYPE_USER, b));
- }
-
- log(DEBUG,"Stripped mode line");
- log(DEBUG,"Line dest is now %s",dmodes);
- strlcpy(dest->modes,dmodes,MAXMODES-1);
-
- }
-
- return;
- }
-
- Ptr = FindChan(parameters[0]);
- if (Ptr)
- {
- ServerInstance->ModeGrok->ProcessModes(parameters,user,Ptr,STATUS_OP,pcnt,true,false,false);
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
-}