aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/m_joinflood.cpp
diff options
context:
space:
mode:
authorGravatar Attila Molnar2014-02-15 14:38:24 +0100
committerGravatar Attila Molnar2014-02-15 14:38:24 +0100
commit0556720b559d7ec5d8badacf0ac9b11e9c864847 (patch)
tree0435a0e5b8e722fe35afb3f820f804bec8c0c7b2 /src/modules/m_joinflood.cpp
parentAdd ModeHandler::IsParameterMode() and MC_PARAM (diff)
Add ParamModeBase and ParamMode, change all parameter modes to inherit from ParamMode
- Type of the extension used to store data is a template parameter - The extension is automatically unset when the mode is unset - Handlers inheriting from ParamMode have to provide OnSet() and SerializeParam(); may optionally provide OnUnset() - Transparently handle the case when OnSet() modifies the mode parameter - Remove Channel::custom_mode_params map; ask the mode handlers to serialize their parameters instead
Diffstat (limited to 'src/modules/m_joinflood.cpp')
-rw-r--r--src/modules/m_joinflood.cpp64
1 files changed, 26 insertions, 38 deletions
diff --git a/src/modules/m_joinflood.cpp b/src/modules/m_joinflood.cpp
index edce2b22c..52802f168 100644
--- a/src/modules/m_joinflood.cpp
+++ b/src/modules/m_joinflood.cpp
@@ -82,52 +82,40 @@ class joinfloodsettings
/** Handles channel mode +j
*/
-class JoinFlood : public ModeHandler
+class JoinFlood : public ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >
{
public:
- SimpleExtItem<joinfloodsettings> ext;
- JoinFlood(Module* Creator) : ModeHandler(Creator, "joinflood", 'j', PARAM_SETONLY, MODETYPE_CHANNEL),
- ext("joinflood", Creator) { }
+ JoinFlood(Module* Creator)
+ : ParamMode<JoinFlood, SimpleExtItem<joinfloodsettings> >(Creator, "joinflood", 'j')
+ {
+ }
- ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
+ ModeAction OnSet(User* source, Channel* channel, std::string& parameter)
{
- if (adding)
+ std::string::size_type colon = parameter.find(':');
+ if ((colon == std::string::npos) || (parameter.find('-') != std::string::npos))
{
- std::string::size_type colon = parameter.find(':');
- if ((colon == std::string::npos) || (parameter.find('-') != std::string::npos))
- {
- source->WriteNumeric(608, "%s :Invalid flood parameter",channel->name.c_str());
- return MODEACTION_DENY;
- }
-
- /* Set up the flood parameters for this channel */
- unsigned int njoins = ConvToInt(parameter.substr(0, colon));
- unsigned int nsecs = ConvToInt(parameter.substr(colon+1));
- if ((njoins<1) || (nsecs<1))
- {
- source->WriteNumeric(608, "%s :Invalid flood parameter",channel->name.c_str());
- return MODEACTION_DENY;
- }
-
- joinfloodsettings jfs(nsecs, njoins);
- joinfloodsettings* f = ext.get(channel);
- if ((f) && (*f == jfs))
- // mode params match
- return MODEACTION_DENY;
-
- ext.set(channel, jfs);
- parameter = ConvToStr(njoins) + ":" + ConvToStr(nsecs);
- return MODEACTION_ALLOW;
+ source->WriteNumeric(608, "%s :Invalid flood parameter",channel->name.c_str());
+ return MODEACTION_DENY;
}
- else
- {
- if (!channel->IsModeSet(this))
- return MODEACTION_DENY;
- ext.unset(channel);
- return MODEACTION_ALLOW;
+ /* Set up the flood parameters for this channel */
+ unsigned int njoins = ConvToInt(parameter.substr(0, colon));
+ unsigned int nsecs = ConvToInt(parameter.substr(colon+1));
+ if ((njoins<1) || (nsecs<1))
+ {
+ source->WriteNumeric(608, "%s :Invalid flood parameter",channel->name.c_str());
+ return MODEACTION_DENY;
}
- return MODEACTION_DENY;
+
+ ext.set(channel, new joinfloodsettings(nsecs, njoins));
+ return MODEACTION_ALLOW;
+ }
+
+ void SerializeParam(Channel* chan, const joinfloodsettings* jfs, std::string& out)
+ {
+ out.append(ConvToStr(jfs->joins)).push_back(':');
+ out.append(ConvToStr(jfs->secs));
}
};