X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_kicknorejoin.cpp;h=2c485fe34bc37ab4276893e60990b7034615ff93;hb=6f4bf8ffd367f35b96265fea1ad01fb1acf2adcd;hp=d64c60d5608d182c48a216f8af5d9ff76907880a;hpb=1afe959c7574b479e4a49a62885d2ac2757025ab;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_kicknorejoin.cpp b/src/modules/m_kicknorejoin.cpp index d64c60d56..2c485fe34 100644 --- a/src/modules/m_kicknorejoin.cpp +++ b/src/modules/m_kicknorejoin.cpp @@ -21,6 +21,8 @@ inline int strtoint(const std::string &str) typedef std::map delaylist; +/** Handles channel mode +J + */ class KickRejoin : public ModeHandler { public: @@ -55,10 +57,47 @@ class KickRejoin : public ModeHandler } if ((!adding) || (atoi(parameter.c_str()) > 0)) { - parameter = ConvToStr(atoi(parameter.c_str())); - channel->SetModeParam('J', parameter.c_str(), adding); - channel->SetMode('J', adding); - return MODEACTION_ALLOW; + ServerInstance->Log(DEBUG,"Got parameter: '%s'",parameter.c_str()); + + if (!channel->IsModeSet('J')) + { + parameter = ConvToStr(atoi(parameter.c_str())); + channel->SetModeParam('J', parameter.c_str(), adding); + channel->SetMode('J', adding); + return MODEACTION_ALLOW; + } + else + { + if (!adding) + { + channel->SetModeParam('J', parameter.c_str(), adding); + return MODEACTION_ALLOW; + } + + std::string cur_param = channel->GetModeParameter('J'); + if (cur_param == parameter) + { + // mode params match, don't change mode + return MODEACTION_DENY; + } + else + { + // new mode param, replace old with new + parameter = ConvToStr(atoi(parameter.c_str())); + cur_param = ConvToStr(atoi(cur_param.c_str())); + if (parameter != "0") + { + channel->SetModeParam('J', cur_param.c_str(), false); + channel->SetModeParam('J', parameter.c_str(), adding); + return MODEACTION_ALLOW; + } + else + { + /* Fix to jamie's fix, dont allow +J 0 on the new value! */ + return MODEACTION_DENY; + } + } + } } else { @@ -82,7 +121,7 @@ public: ServerInstance->AddMode(kr, 'J'); } - 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) { @@ -119,8 +158,8 @@ public: if (!dl->size()) { // Now it's empty.. - DELETE(dl); - chan->Shrink("norejoinusers"); + DELETE(dl); + chan->Shrink("norejoinusers"); } } } @@ -167,12 +206,13 @@ public: virtual ~ModuleKickNoRejoin() { + ServerInstance->Modes->DelMode(kr); DELETE(kr); } virtual Version GetVersion() { - return Version(1, 0, 0, 0, VF_STATIC | VF_VENDOR); + return Version(1, 1, 0, 0, VF_COMMON | VF_VENDOR, API_VERSION); } };