- virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname, std::string &privs)
- {
- if (chan)
- {
- delaylist* dl;
- if (chan->GetExt("norejoinusers", dl))
- {
- std::vector<userrec*> itemstoremove;
-
- for (delaylist::iterator iter = dl->begin(); iter != dl->end(); iter++)
- {
- if (iter->second > time(NULL))
- {
- if (iter->first == user)
- {
- user->WriteServ( "495 %s %s :You cannot rejoin this channel yet after being kicked (+J)", user->nick, chan->name);
- return 1;
- }
- }
- else
- {
- // Expired record, remove.
- itemstoremove.push_back(iter->first);
- }
- }
-
- for (unsigned int i = 0; i < itemstoremove.size(); i++)
- dl->erase(itemstoremove[i]);
-
- if (!dl->size())
- {
- // Now it's empty..
- DELETE(dl);
- chan->Shrink("norejoinusers");
- }
- }
- }
- return 0;
- }
-
- virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent)
- {
- if (chan->IsModeSet('J') && (source != user))
- {
- delaylist* dl;
- if (!chan->GetExt("norejoinusers", dl))
- {
- dl = new delaylist;
- chan->Extend("norejoinusers", dl);
- }
- (*dl)[user] = time(NULL) + strtoint(chan->GetModeParameter('J'));
- }
- }
-
- virtual void OnChannelDelete(chanrec* chan)
- {
- delaylist* dl;
-
- if (chan->GetExt("norejoinusers", dl))
- {
- DELETE(dl);
- chan->Shrink("norejoinusers");
- }
- }
-
- virtual void OnCleanup(int target_type, void* item)
+/** Handles channel mode +J
+ */
+class KickRejoin : public ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> >
+{
+ const unsigned int max;
+ public:
+ KickRejoin(Module* Creator)
+ : ParamMode<KickRejoin, SimpleExtItem<KickRejoinData> >(Creator, "kicknorejoin", 'J')
+ , max(60)