diff options
-rw-r--r-- | include/mode.h | 13 | ||||
-rw-r--r-- | src/mode.cpp | 24 |
2 files changed, 27 insertions, 10 deletions
diff --git a/include/mode.h b/include/mode.h index 2833d75a2..66f003b99 100644 --- a/include/mode.h +++ b/include/mode.h @@ -692,6 +692,19 @@ class CoreExport ModeParser : public fakederef<ModeParser> */ void ProcessSingle(User* user, Channel* targetchannel, User* targetuser, Modes::ChangeList& changelist, ModeProcessFlag flags = MODE_NONE); + /** Turn a list of parameters compatible with the format of the MODE command into + * Modes::ChangeList form. All modes are processed, regardless of max modes. Unknown modes + * are skipped. + * @param user The source of the mode change, can be a server user. Error numerics are sent to + * this user. + * @param type MODETYPE_USER if this is a user mode change or MODETYPE_CHANNEL if this + * is a channel mode change. + * @param parameters List of strings describing the mode change to convert to a ChangeList. + * Must be using the same format as the parameters of a MODE command. + * @param changelist ChangeList object to populate. + */ + void ModeParamsToChangeList(User* user, ModeType type, const std::vector<std::string>& parameters, Modes::ChangeList& changelist); + /** Find the mode handler for a given mode name and type. * @param modename The mode name to search for. * @param mt Type of mode to search for, user or channel. diff --git a/src/mode.cpp b/src/mode.cpp index ac7ee97d6..9b27a3d13 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -390,6 +390,7 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User* user, // Populate a temporary Modes::ChangeList with the parameters Modes::ChangeList changelist; + ModeParamsToChangeList(user, type, parameters, changelist); ModResult MOD_RESULT; FIRST_MOD_RESULT(OnPreMode, MOD_RESULT, (user, targetuser, targetchannel, parameters)); @@ -413,6 +414,19 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User* user, return; // Entire mode change denied by a module } + ProcessSingle(user, targetchannel, targetuser, changelist, flags); + + if ((LastParse.empty()) && (targetchannel) && (parameters.size() == 2)) + { + /* Special case for displaying the list for listmodes, + * e.g. MODE #chan b, or MODE #chan +b without a parameter + */ + this->DisplayListModes(user, targetchannel, parameters[1]); + } +} + +void ModeParser::ModeParamsToChangeList(User* user, ModeType type, const std::vector<std::string>& parameters, Modes::ChangeList& changelist) +{ const std::string& mode_sequence = parameters[1]; bool adding = true; @@ -441,16 +455,6 @@ void ModeParser::Process(const std::vector<std::string>& parameters, User* user, changelist.push(mh, adding, parameter); } - - ProcessSingle(user, targetchannel, targetuser, changelist, flags); - - if ((LastParse.empty()) && (targetchannel) && (parameters.size() == 2)) - { - /* Special case for displaying the list for listmodes, - * e.g. MODE #chan b, or MODE #chan +b without a parameter - */ - this->DisplayListModes(user, targetchannel, mode_sequence); - } } static bool IsModeParamValid(User* user, Channel* targetchannel, User* targetuser, const Modes::Change& item) |