- if ((!user) || (!dest) || (!chan) || (!*dest)) {
- log(DEFAULT,"*** BUG *** TakeBan was given an invalid parameter");
- return 0;
- }
-
- log(DEBUG,"del_ban: %s %s",chan->name,user->nick);
- for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
- {
- if (!strcasecmp(i->data,dest))
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnDelBan,OnDelBan(user,chan,dest));
- if (MOD_RESULT)
- return NULL;
- chan->bans.erase(i);
- return dest;
- }
- }
- return NULL;
-}
-
-// tidies up redundant modes, e.g. +nt-nt+i becomes +-+i,
-// a section further down the chain tidies up the +-+- crap.
-std::string ModeParser::CompressModes(std::string modes,bool channelmodes)
-{
- int counts[127];
- bool active[127];
- memset(counts,0,sizeof(counts));
- memset(active,0,sizeof(active));
- for (unsigned int i = 0; i < modes.length(); i++)
- {
- if ((modes[i] == '+') || (modes[i] == '-'))
- continue;
- if (channelmodes)
- {
- if ((strchr("itnmsp",modes[i])) || ((ModeDefined(modes[i],MT_CHANNEL)) && (ModeDefinedOn(modes[i],MT_CHANNEL)==0) && (ModeDefinedOff(modes[i],MT_CHANNEL)==0)))
- {
- log(DEBUG,"Tidy mode %c",modes[i]);
- counts[(unsigned int)modes[i]]++;
- active[(unsigned int)modes[i]] = true;
- }
- }
- else
- {
- log(DEBUG,"Tidy mode %c",modes[i]);
- counts[(unsigned int)modes[i]]++;
- active[(unsigned int)modes[i]] = true;
- }
- }
- for (int j = 65; j < 127; j++)
- {
- if ((counts[j] > 1) && (active[j] == true))
- {
- static char v[2];
- v[0] = (unsigned char)j;
- v[1] = '\0';
- std::string mode_str = v;
- std::string::size_type pos = modes.find(mode_str);
- if (pos != std::string::npos)
- {
- log(DEBUG,"all occurances of mode %c to be deleted...",(unsigned char)j);
- while (modes.find(mode_str) != std::string::npos)
- modes.erase(modes.find(mode_str),1);
- log(DEBUG,"New mode line: %s",modes.c_str());
- }
- }
- }
- return modes;
-}
-
-void ModeParser::ProcessModes(char **parameters,userrec* user,chanrec *chan,int status, int pcnt, bool servermode, bool silent, bool local)
-{
- if (!parameters) {
- log(DEFAULT,"*** BUG *** process_modes was given an invalid parameter");
- return;
- }
-
- char modelist[MAXBUF];
- char outlist[MAXBUF];
- char outstr[MAXBUF];
- char outpars[32][MAXBUF];
- int param = 2;
- int pc = 0;
- int ptr = 0;
- int mdir = 1;
- char* r = NULL;
- bool k_set = false, l_set = false, previously_set_l = false, previously_unset_l = false, previously_set_k = false, previously_unset_k = false;
-
- if (pcnt < 2)
- {
- return;
- }
-
- int MOD_RESULT = 0;
-
- if (IS_LOCAL(user))
- {
- FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,NULL,chan,AC_GENERAL_MODE));
- if (MOD_RESULT == ACR_DENY)
- return;
- }
-
- log(DEBUG,"process_modes: start: parameters=%d",pcnt);
-
- strlcpy(modelist,parameters[1],MAXBUF); /* mode list, e.g. +oo-o *
- * parameters[2] onwards are parameters for
- * modes that require them :) */
- *outlist = *modelist;
- char* outl = outlist+1;
-
- mdir = (*modelist == '+');
-
- log(DEBUG,"process_modes: modelist: %s",modelist);
-
- std::string tidied = this->CompressModes(modelist,true);
- strlcpy(modelist,tidied.c_str(),MAXBUF);
-
- int len = tidied.length();
- while (modelist[len-1] == ' ')
- modelist[--len] = '\0';
-
- bool next_cant_be_modifier = false;
- char* modechar;
-
- for (modechar = (modelist + 1); *modechar; ptr++, modechar++)
- {
- r = NULL;
-
- /* If we have more than MAXMODES changes in one line,
- * drop all after the MAXMODES
- */
- if (pc > MAXMODES-1)
- break;
-
- log(DEBUG,"Mode %c",*modechar);
-
- {
- switch (*modechar)
- {
- case '-':
- *outl++ = '-';
- mdir = 0;
- next_cant_be_modifier = true;
-
- break;
-
- case '+':
- *outl++ = '+';
- mdir = 1;
- next_cant_be_modifier = true;
- break;
-
- case 'o':
- log(DEBUG,"Ops");
- if ((param >= pcnt)) break;
- log(DEBUG,"Enough parameters left");
- r = NULL;
- if (mdir == 1)
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], true, 1));
- if (!MOD_RESULT)
- {
- log(DEBUG,"calling GiveOps");
- r = GiveOps(user,parameters[param++],chan,status);
- }
- else param++;
- }
- else
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'o', parameters[param], false, 1));
- if (!MOD_RESULT)
- {
- log(DEBUG,"calling TakeOps");
- r = TakeOps(user,parameters[param++],chan,status);
- }
- else param++;
- }
- if (r)
- {
- *outl++ = 'o';
- strlcpy(outpars[pc++],r,MAXBUF);
- }
- break;
-
- case 'h':
- if (((param >= pcnt)) || (!Config->AllowHalfop)) break;
- r = NULL;
- if (mdir == 1)
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'h', parameters[param], true, 1));
- if (!MOD_RESULT)
- {
- r = GiveHops(user,parameters[param++],chan,status);
- }
- else param++;
- }
- else
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'h', parameters[param], false, 1));
- if (!MOD_RESULT)
- {
- r = TakeHops(user,parameters[param++],chan,status);
- }
- else param++;
- }
- if (r)
- {
- *outl++ = 'h';
- strlcpy(outpars[pc++],r,MAXBUF);
- }
- break;
-
-
- case 'v':
- if ((param >= pcnt)) break;
- r = NULL;
- if (mdir == 1)
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'v', parameters[param], true, 1));
- if (!MOD_RESULT)
- {
- r = GiveVoice(user,parameters[param++],chan,status);
- }
- else param++;
- }
- else
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'v', parameters[param], false, 1));
- if (!MOD_RESULT)
- {
- r = TakeVoice(user,parameters[param++],chan,status);
- }
- else param++;
- }
- if (r)
- {
- *outl++ = 'v';
- strlcpy(outpars[pc++],r,MAXBUF);
- }
- break;
-
- case 'b':
- if ((param >= pcnt)) break;
- r = NULL;
- if (mdir == 1)
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'b', parameters[param], true, 1));
- if (!MOD_RESULT)
- {
- r = AddBan(user,parameters[param++],chan,status);
- }
- else param++;
- }
- else
- {
- MOD_RESULT = 0;
- FOREACH_RESULT(I_OnRawMode,OnRawMode(user, chan, 'b', parameters[param], false, 1));
- if (!MOD_RESULT)
- {
- r = TakeBan(user,parameters[param++],chan,status);
- }
- else param++;
- }
- if (r)
- {
- *outl++ = 'b';
- strlcpy(outpars[pc++],parameters[param-1],MAXBUF);
- }
- break;