* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
- * E-mail:
- * <brain@chatspike.net>
- * <Craig@chatspike.net>
- *
- * Written by Craig Edwards, Craig McLure, and others.
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
-using namespace std;
-
#include <stdio.h>
#include <map>
#include "users.h"
/* $ModDesc: Provides channel mode +j (join flood protection) */
-
-
+/** Holds settings and state associated with channel mode +j
+ */
class joinfloodsettings : public classbase
{
public:
time_t unlocktime;
int counter;
bool locked;
-
+ InspIRCd* ServerInstance;
+
joinfloodsettings() : secs(0), joins(0) {};
+
joinfloodsettings(int b, int c) : secs(b), joins(c)
{
reset = time(NULL) + secs;
};
+/** Handles channel mode +j
+ */
class JoinFlood : public ModeHandler
{
public:
if (adding)
{
- ServerInstance->Log(DEBUG,"Got parameter: '%s'",parameter.c_str());
char ndata[MAXBUF];
char* data = ndata;
strlcpy(ndata,parameter.c_str(),MAXBUF);
else data++;
}
if (secs)
+
{
/* Set up the flood parameters for this channel */
int njoins = atoi(joins);
channel->SetModeParam('j', parameter.c_str(), true);
return MODEACTION_ALLOW;
}
+ else
+ {
+ std::string cur_param = channel->GetModeParameter('j');
+ parameter = ConvToStr(njoins) + ":" +ConvToStr(nsecs);
+ if (cur_param == parameter)
+ {
+ // mode params match
+ return MODEACTION_DENY;
+ }
+ else
+ {
+ // new mode param, replace old with new
+ if ((nsecs > 0) && (njoins > 0))
+ {
+ joinfloodsettings* f;
+ channel->GetExt("joinflood", f);
+ delete f;
+ f = new joinfloodsettings(nsecs,njoins);
+ channel->Shrink("joinflood");
+ channel->Extend("joinflood", f);
+ channel->SetModeParam('j', cur_param.c_str(), false);
+ channel->SetModeParam('j', parameter.c_str(), true);
+ return MODEACTION_ALLOW;
+ }
+ else
+ {
+ return MODEACTION_DENY;
+ }
+ }
+ }
}
}
else
{
jf = new JoinFlood(ServerInstance);
- ServerInstance->AddMode(jf, 'j');
+ if (!ServerInstance->AddMode(jf, 'j'))
+ throw ModuleException("Could not add new modes!");
}
- virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
+ virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname, std::string &privs)
{
if (chan)
{
virtual Version GetVersion()
{
- return Version(1, 0, 0, 0, VF_COMMON | VF_VENDOR);
+ return Version(1, 1, 0, 0, VF_COMMON | VF_VENDOR, API_VERSION);
}
};