X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_kicknorejoin.cpp;h=b8a7766675e8e191ea0cb45331ba495058f695d9;hb=bbbd6c9ac46c040b9769c227f0f3ffbfcd43b0e7;hp=5d9b7f8b95c140f2435b0c23954ef48a4d81b0c9;hpb=c5b8e72f5cc510f88b9169445c56847bd01f51bb;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_kicknorejoin.cpp b/src/modules/m_kicknorejoin.cpp index 5d9b7f8b9..b8a776667 100644 --- a/src/modules/m_kicknorejoin.cpp +++ b/src/modules/m_kicknorejoin.cpp @@ -25,11 +25,23 @@ #include "inspircd.h" -typedef std::map delaylist; - class KickRejoinData { - mutable delaylist kicked; + struct KickedUser + { + std::string uuid; + time_t expire; + + KickedUser(User* user, unsigned int Delay) + : uuid(user->uuid) + , expire(ServerInstance->Time() + Delay) + { + } + }; + + typedef std::vector KickedList; + + mutable KickedList kicked; public: const unsigned int delay; @@ -38,18 +50,21 @@ class KickRejoinData bool canjoin(LocalUser* user) const { - for (delaylist::iterator i = kicked.begin(); i != kicked.end(); ) + for (KickedList::iterator i = kicked.begin(); i != kicked.end(); ) { - if (i->second > ServerInstance->Time()) + KickedUser& rec = *i; + if (rec.expire > ServerInstance->Time()) { - if (i->first == user->uuid) + if (rec.uuid == user->uuid) return false; ++i; } else { // Expired record, remove. - kicked.erase(i++); + stdalgo::vector::swaperase(kicked, i); + if (kicked.empty()) + break; } } return true; @@ -57,7 +72,10 @@ class KickRejoinData void add(User* user) { - kicked[user->uuid] = ServerInstance->Time() + delay; + // One user can be in the list multiple times if the user gets kicked, force joins + // (skipping OnUserPreJoin) and gets kicked again, but that's okay because canjoin() + // works correctly in this case as well + kicked.push_back(KickedUser(user, delay)); } }; @@ -65,10 +83,11 @@ class KickRejoinData */ class KickRejoin : public ParamMode > { - static const unsigned int max = 60; + const unsigned int max; public: KickRejoin(Module* Creator) : ParamMode >(Creator, "kicknorejoin", 'J') + , max(60) { } @@ -89,6 +108,11 @@ class KickRejoin : public ParamMode > { out.append(ConvToStr(krd->delay)); } + + std::string GetModuleSettings() const + { + return ConvToStr(max); + } }; class ModuleKickNoRejoin : public Module @@ -129,7 +153,7 @@ public: Version GetVersion() CXX11_OVERRIDE { - return Version("Channel mode to delay rejoin after kick", VF_VENDOR); + return Version("Channel mode to delay rejoin after kick", VF_VENDOR | VF_COMMON, kr.GetModuleSettings()); } };