X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_joinflood.cpp;h=2520cbfcf880c6e8aa391c6d25fb2e1b6bc17b98;hb=6d03943426dcce76ba66567a9b18425a5ebb4c0c;hp=ac194decdd1d7c641ff199a27f4c992990dc1e1f;hpb=24731c63b6320be22f7b3220236271fa7476b975;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_joinflood.cpp b/src/modules/m_joinflood.cpp index ac194decd..2520cbfcf 100644 --- a/src/modules/m_joinflood.cpp +++ b/src/modules/m_joinflood.cpp @@ -19,8 +19,6 @@ */ class joinfloodsettings : public classbase { - private: - InspIRCd* ServerInstance; public: int secs; int joins; @@ -29,7 +27,7 @@ class joinfloodsettings : public classbase int counter; bool locked; - joinfloodsettings(InspIRCd *Instance, int b, int c) : ServerInstance(Instance), secs(b), joins(c) + joinfloodsettings(int b, int c) : secs(b), joins(c) { reset = ServerInstance->Time() + secs; counter = 0; @@ -86,21 +84,21 @@ class joinfloodsettings : public classbase class JoinFlood : public ModeHandler { public: - JoinFlood(InspIRCd* Instance, Module* Creator) : ModeHandler(Instance, Creator, 'j', 1, 0, false, MODETYPE_CHANNEL, false) { } + SimpleExtItem ext; + JoinFlood(Module* Creator) : ModeHandler(Creator, 'j', PARAM_SETONLY, MODETYPE_CHANNEL), + ext("joinflood", Creator) { } ModePair ModeSet(User* source, User* dest, Channel* channel, const std::string ¶meter) { - joinfloodsettings* x; - if (channel->GetExt("joinflood",x)) + joinfloodsettings* x = ext.get(channel); + if (x) return std::make_pair(true, ConvToStr(x->joins)+":"+ConvToStr(x->secs)); else return std::make_pair(false, parameter); } - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool) + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) { - joinfloodsettings* dummy; - if (adding) { char ndata[MAXBUF]; @@ -133,11 +131,12 @@ class JoinFlood : public ModeHandler } else { - if (!channel->GetExt("joinflood", dummy)) + joinfloodsettings* f = ext.get(channel); + if (!f) { parameter = ConvToStr(njoins) + ":" +ConvToStr(nsecs); - joinfloodsettings *f = new joinfloodsettings(ServerInstance, nsecs, njoins); - channel->Extend("joinflood", f); + f = new joinfloodsettings(nsecs, njoins); + ext.set(channel, f); channel->SetModeParam('j', parameter); return MODEACTION_ALLOW; } @@ -155,12 +154,8 @@ class JoinFlood : public ModeHandler // new mode param, replace old with new if ((nsecs > 0) && (njoins > 0)) { - joinfloodsettings* f; - channel->GetExt("joinflood", f); - delete f; - f = new joinfloodsettings(ServerInstance, nsecs, njoins); - channel->Shrink("joinflood"); - channel->Extend("joinflood", f); + f = new joinfloodsettings(nsecs, njoins); + ext.set(channel, f); channel->SetModeParam('j', parameter); return MODEACTION_ALLOW; } @@ -180,12 +175,10 @@ class JoinFlood : public ModeHandler } else { - if (channel->GetExt("joinflood", dummy)) + joinfloodsettings* f = ext.get(channel); + if (f) { - joinfloodsettings *f; - channel->GetExt("joinflood", f); - delete f; - channel->Shrink("joinflood"); + ext.unset(channel); channel->SetModeParam('j', ""); return MODEACTION_ALLOW; } @@ -201,73 +194,60 @@ class ModuleJoinFlood : public Module public: - ModuleJoinFlood(InspIRCd* Me) - : Module(Me), jf(Me, this) + ModuleJoinFlood() + : jf(this) { if (!ServerInstance->Modes->AddMode(&jf)) throw ModuleException("Could not add new modes!"); + Extensible::Register(&jf.ext); Implementation eventlist[] = { I_OnChannelDelete, I_OnUserPreJoin, I_OnUserJoin }; ServerInstance->Modules->Attach(eventlist, this, 3); } - virtual int OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven) + ModResult OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven) { if (chan) { - joinfloodsettings *f; - if (chan->GetExt("joinflood", f)) + joinfloodsettings *f = jf.ext.get(chan); + if (f && f->islocked()) { - if (f->islocked()) - { - user->WriteNumeric(609, "%s %s :This channel is temporarily unavailable (+j). Please try again later.",user->nick.c_str(),chan->name.c_str()); - return 1; - } + user->WriteNumeric(609, "%s %s :This channel is temporarily unavailable (+j). Please try again later.",user->nick.c_str(),chan->name.c_str()); + return MOD_RES_DENY; } } - return 0; + return MOD_RES_PASSTHRU; } - virtual void OnUserJoin(User* user, Channel* channel, bool sync, bool &silent, bool created) + void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) { - joinfloodsettings *f; - /* We arent interested in JOIN events caused by a network burst */ if (sync) return; + joinfloodsettings *f = jf.ext.get(memb->chan); + /* But all others are OK */ - if (channel->GetExt("joinflood",f)) + if (f) { f->addjoin(); if (f->shouldlock()) { f->clear(); f->lock(); - channel->WriteChannelWithServ((char*)ServerInstance->Config->ServerName, "NOTICE %s :This channel has been closed to new users for 60 seconds because there have been more than %d joins in %d seconds.", channel->name.c_str(), f->joins, f->secs); + memb->chan->WriteChannelWithServ((char*)ServerInstance->Config->ServerName, "NOTICE %s :This channel has been closed to new users for 60 seconds because there have been more than %d joins in %d seconds.", memb->chan->name.c_str(), f->joins, f->secs); } } } - void OnChannelDelete(Channel* chan) - { - joinfloodsettings *f; - if (chan->GetExt("joinflood",f)) - { - delete f; - chan->Shrink("joinflood"); - } - } - - - virtual ~ModuleJoinFlood() + ~ModuleJoinFlood() { ServerInstance->Modes->DelMode(&jf); } - virtual Version GetVersion() + Version GetVersion() { - return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION); + return Version("Provides channel mode +j (join flood protection)", VF_COMMON | VF_VENDOR, API_VERSION); } };