- char ndata[MAXBUF];
- char* data = ndata;
- strlcpy(ndata,parameter.c_str(),MAXBUF);
- char* lines = data;
- char* secs = NULL;
- bool ban = false;
- if (*data == '*')
- {
- ban = true;
- lines++;
- }
- else
- {
- ban = false;
- }
- while (*data)
- {
- if (*data == ':')
- {
- *data = 0;
- data++;
- secs = data;
- break;
- }
- else data++;
- }
- if (secs)
- {
- /* Set up the flood parameters for this channel */
- int nlines = atoi(lines);
- int nsecs = atoi(secs);
- if ((nlines<1) || (nsecs<1))
- {
- source->WriteServ("608 %s %s :Invalid flood parameter",source->nick,channel->name);
- parameter.clear();
- return MODEACTION_DENY;
- }
- else
- {
- if (!channel->GetExt("flood", f))
- {
- parameter = std::string(ban ? "*" : "") + ConvToStr(nlines) + ":" +ConvToStr(nsecs);
- floodsettings *fs = new floodsettings(ban,nsecs,nlines);
- channel->Extend("flood",fs);
- channel->SetMode('f', true);
- channel->SetModeParam('f', parameter.c_str(), true);
- return MODEACTION_ALLOW;
- }
- else
- {
- std::string cur_param = channel->GetModeParameter('f');
- parameter = std::string(ban ? "*" : "") + ConvToStr(nlines) + ":" +ConvToStr(nsecs);
- if (cur_param == parameter)
- {
- // mode params match
- return MODEACTION_DENY;
- }
- else
- {
- if (((nlines != f->lines) || (nsecs != f->secs)) && ((nsecs > 0) && (nlines > 0)) || (ban != f->ban))
- {
- delete f;
- floodsettings *fs = new floodsettings(ban,nsecs,nlines);
- channel->Shrink("flood");
- channel->Extend("flood",fs);
- channel->SetModeParam('f', cur_param.c_str(), false);
- channel->SetModeParam('f', parameter.c_str(), true);
- return MODEACTION_ALLOW;
- }
- else
- {
- return MODEACTION_DENY;
- }
- }
- }
- }
- }
- else
- {
- source->WriteServ("608 %s %s :Invalid flood parameter",source->nick,channel->name);
- parameter.clear();
- return MODEACTION_DENY;
- }