X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_kicknorejoin.cpp;h=9ad952f11ff30db1e968c2520d4a51d4918683a3;hb=fd6ee21f2f55875984884a8413d61012e066029f;hp=e96e421850f44e9de9257afeafe0b8bcbdc5957b;hpb=034368624cbe5923a1df069825fe1e65fbf00895;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_kicknorejoin.cpp b/src/modules/m_kicknorejoin.cpp index e96e42185..9ad952f11 100644 --- a/src/modules/m_kicknorejoin.cpp +++ b/src/modules/m_kicknorejoin.cpp @@ -10,6 +10,8 @@ /* $ModDesc: Provides channel mode +J (delay rejoin after kick) */ + + inline int strtoint(const std::string &str) { std::istringstream ss(str); @@ -23,16 +25,30 @@ typedef std::map delaylist; class KickRejoin : public ModeHandler { public: - KickRejoin() : ModeHandler('J', 1, 0, false, MODETYPE_CHANNEL, false) { } + KickRejoin(InspIRCd* Instance) : ModeHandler(Instance, 'J', 1, 0, false, MODETYPE_CHANNEL, false) { } + ModePair ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter) + { + if (channel->IsModeSet('J')) + return std::make_pair(true, channel->GetModeParameter('J')); + else + return std::make_pair(false, parameter); + } + + bool CheckTimeStamp(time_t theirs, time_t ours, const std::string &their_param, const std::string &our_param, chanrec* channel) + { + /* When TS is equal, the alphabetically later one wins */ + return (their_param < our_param); + } + ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) { if (!adding) { // Taking the mode off, we need to clean up. - delaylist* dl = (delaylist*)channel->GetExt("norejoinusers"); + delaylist* dl; - if (dl) + if (channel->GetExt("norejoinusers", dl)) { DELETE(dl); channel->Shrink("norejoinusers"); @@ -54,27 +70,25 @@ class KickRejoin : public ModeHandler class ModuleKickNoRejoin : public Module { - Server *Srv; + KickRejoin* kr; public: - ModuleKickNoRejoin(Server* Me) + ModuleKickNoRejoin(InspIRCd* Me) : Module::Module(Me) { - Srv = Me; - kr = new KickRejoin(); - Srv->AddMode(kr, 'J'); + + kr = new KickRejoin(ServerInstance); + ServerInstance->AddMode(kr, 'J'); } virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) { if (chan) { - delaylist* dl = (delaylist*)chan->GetExt("norejoinusers"); - log(DEBUG, "m_kicknorejoin.so: tried to grab delay list"); - - if (dl) + delaylist* dl; + if (chan->GetExt("norejoinusers", dl)) { log(DEBUG, "m_kicknorejoin.so: got delay list, iterating over it"); std::vector itemstoremove; @@ -88,7 +102,7 @@ public: if (iter->first == user) { log(DEBUG, "m_kicknorejoin.so: and we have the right user"); - WriteServ(user->fd, "495 %s %s :You cannot rejoin this channel yet after being kicked (+J)", user->nick, chan->name); + user->WriteServ( "495 %s %s :You cannot rejoin this channel yet after being kicked (+J)", user->nick, chan->name); return 1; } } @@ -108,36 +122,35 @@ public: // Now it's empty.. DELETE(dl); chan->Shrink("norejoinusers"); - } } } - return 0; } + return 0; + } - virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason) + virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason) + { + if (chan->IsModeSet('J') && (source != user)) { - if (chan->IsModeSet('J') && (source != user)) + delaylist* dl; + if (!chan->GetExt("norejoinusers", dl)) { - delaylist* dl = (delaylist*)chan->GetExt("norejoinusers"); - - if (!dl) - { - dl = new delaylist; - chan->Extend("norejoinusers", (char*)dl); - } - - log(DEBUG, "m_kicknorejoin.so: setting record for %s, %d second delay", user->nick, strtoint(chan->GetModeParameter('J'))); - (*dl)[user] = time(NULL) + strtoint(chan->GetModeParameter('J')); + dl = new delaylist; + chan->Extend("norejoinusers", dl); } + + log(DEBUG, "m_kicknorejoin.so: setting record for %s, %d second delay", user->nick, strtoint(chan->GetModeParameter('J'))); + (*dl)[user] = time(NULL) + strtoint(chan->GetModeParameter('J')); } - - virtual void OnChannelDelete(chanrec* chan) - { - delaylist* dl = (delaylist*)chan->GetExt("norejoinusers"); + } + + virtual void OnChannelDelete(chanrec* chan) + { + delaylist* dl; - if (dl) - { - DELETE(dl); + if (chan->GetExt("norejoinusers", dl)) + { + DELETE(dl); chan->Shrink("norejoinusers"); } } @@ -155,7 +168,7 @@ public: virtual void On005Numeric(std::string &output) { - InsertMode(output, "J", 3); + ServerInstance->ModeGrok->InsertMode(output, "J", 3); } virtual ~ModuleKickNoRejoin() @@ -181,7 +194,7 @@ class ModuleKickNoRejoinFactory : public ModuleFactory { } - virtual Module * CreateModule(Server* Me) + virtual Module * CreateModule(InspIRCd* Me) { return new ModuleKickNoRejoin(Me); }