- char ndata[MAXBUF];
- char* data = ndata;
- strlcpy(ndata,parameter.c_str(),MAXBUF);
- char* nicks = data;
- char* secs = NULL;
- while (*data)
- {
- if (*data == ':')
- {
- *data = 0;
- data++;
- secs = data;
- break;
- }
- else data++;
- }
- if (secs)
-
- {
- /* Set up the flood parameters for this channel */
- int nnicks = atoi(nicks);
- int nsecs = atoi(secs);
- if ((nnicks<1) || (nsecs<1))
- {
- source->WriteNumeric(608, "%s %s :Invalid flood parameter",source->nick.c_str(),channel->name.c_str());
- parameter.clear();
- return MODEACTION_DENY;
- }
- else
- {
- if (!channel->GetExt("nickflood", dummy))
- {
- parameter = ConvToStr(nnicks) + ":" +ConvToStr(nsecs);
- nickfloodsettings *f = new nickfloodsettings(ServerInstance, nsecs, nnicks);
- channel->Extend("nickflood", f);
- channel->SetMode('F', parameter);
- return MODEACTION_ALLOW;
- }
- else
- {
- std::string cur_param = channel->GetModeParameter('F');
- parameter = ConvToStr(nnicks) + ":" +ConvToStr(nsecs);
- if (cur_param == parameter)
- {
- // mode params match
- return MODEACTION_DENY;
- }
- else
- {
- // new mode param, replace old with new
- if ((nsecs > 0) && (nnicks > 0))
- {
- nickfloodsettings* f;
- channel->GetExt("nickflood", f);
- delete f;
- f = new nickfloodsettings(ServerInstance, nsecs, nnicks);
- channel->Shrink("nickflood");
- channel->Extend("nickflood", f);
- channel->SetMode('F', parameter);
- return MODEACTION_ALLOW;
- }
- else
- {
- return MODEACTION_DENY;
- }
- }
- }
- }
- }
- else
- {
- source->WriteNumeric(608, "%s %s :Invalid flood parameter",source->nick.c_str(),channel->name.c_str());
- return MODEACTION_DENY;
- }