- else if (atoi(parameter.c_str()) > 0)
- {
- if (!channel->IsModeSet('J'))
- {
- parameter = ConvToStr(atoi(parameter.c_str()));
- channel->SetModeParam('J', parameter);
- return MODEACTION_ALLOW;
- }
- else
- {
- 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()));
- if (parameter != "0")
- {
- channel->SetModeParam('J', parameter);
- return MODEACTION_ALLOW;
- }
- else
- {
- /* Fix to jamie's fix, dont allow +J 0 on the new value! */
- return MODEACTION_DENY;
- }
- }
- }
- }
- else
- {
+ return true;
+ }
+
+ void add(User* user)
+ {
+ // 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));
+ }
+};
+
+/** 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)
+ {
+ }
+
+ ModeAction OnSet(User* source, Channel* channel, std::string& parameter) CXX11_OVERRIDE
+ {
+ int v = ConvToInt(parameter);
+ if (v <= 0)