diff options
| author | 2014-02-15 14:38:24 +0100 | |
|---|---|---|
| committer | 2014-02-15 14:38:24 +0100 | |
| commit | 0556720b559d7ec5d8badacf0ac9b11e9c864847 (patch) | |
| tree | 0435a0e5b8e722fe35afb3f820f804bec8c0c7b2 /src/modules/m_joinflood.cpp | |
| parent | Add 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.cpp | 64 |
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 ¶meter, 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)); } }; |
