#pragma once
#include "ctables.h"
+#include "modechange.h"
/**
* Holds the values for different type of modes
Id modeid;
protected:
- /**
- * The mode parameter translation type
- */
- TranslateType m_paramtype;
-
/** What kind of parameters does the mode take?
*/
ParamSpec parameters_taken;
* Returns the mode's type
*/
inline ModeType GetModeType() const { return m_type; }
- /**
- * Returns the mode's parameter translation type
- */
- inline TranslateType GetTranslateType() const { return m_paramtype; }
/**
* Returns true if the mode can only be set/unset by an oper
*/
*/
std::multimap<std::string, ModeWatcher*> modewatchermap;
+ /** Last processed mode change
+ */
+ Modes::ChangeList LastChangeList;
+
/** Displays the current modes of a channel or user.
* Used by ModeParser::Process.
*/
/** Displays the value of a list mode
* Used by ModeParser::Process.
*/
- void DisplayListModes(User* user, Channel* chan, std::string &mode_sequence);
+ void DisplayListModes(User* user, Channel* chan, const std::string& mode_sequence);
/**
* Attempts to apply a mode change to a user or channel
*/
- ModeAction TryMode(User* user, User* targu, Channel* targc, bool adding, unsigned char mode, std::string ¶m, bool SkipACL);
+ ModeAction TryMode(User* user, User* targu, Channel* targc, Modes::Change& mcitem, bool SkipACL);
/** Returns a list of user or channel mode characters.
* Used for constructing the parts of the mode list in the 004 numeric.
* Use GetLastParse() to get this value, to be used for display purposes.
*/
std::string LastParse;
- std::vector<std::string> LastParseParams;
- std::vector<TranslateType> LastParseTranslate;
unsigned int sent[256];
*/
MODE_MERGE = 1,
- /** If this flag is set then the mode change won't be handed over to
- * the linking module to be sent to other servers, but will be processed
+ /** If this flag is set then the linking module will ignore the mode change
+ * and not send it to other servers. The mode change will be processed
* locally and sent to local user(s) as usual.
*/
- MODE_LOCALONLY = 2
+ MODE_LOCALONLY = 2,
+
+ /** If this flag is set then the mode change will be subject to access checks.
+ * For more information see the documentation of the PrefixMode class,
+ * ModeHandler::levelrequired and ModeHandler::AccessCheck().
+ * Modules may explicitly allow a mode change regardless of this flag by returning
+ * MOD_RES_ALLOW from the OnPreMode hook. Only affects channel mode changes.
+ */
+ MODE_CHECKACCESS = 4
};
ModeParser();
* @return Last parsed string, as seen by users.
*/
const std::string& GetLastParse() const { return LastParse; }
- const std::vector<std::string>& GetLastParseParams() { return LastParseParams; }
- const std::vector<TranslateType>& GetLastParseTranslate() { return LastParseTranslate; }
/** Add a mode to the mode parser.
* Throws a ModuleException if the mode cannot be added.
*/
void Process(const std::vector<std::string>& parameters, User* user, ModeProcessFlag flags = MODE_NONE);
+ /** Process a single MODE line's worth of mode changes, taking max modes and line length limits
+ * into consideration.
+ * @param user The source of the mode change, can be a server user.
+ * @param targetchannel Channel to apply the mode change on. NULL if changing modes on a channel.
+ * @param targetuser User to apply the mode change on. NULL if changing modes on a user.
+ * @param changelist Modes to change in form of a Modes::ChangeList. May not process
+ * the entire list due to MODE line length and max modes limitations.
+ * @param flags Optional flags controlling how the mode change is processed,
+ * defaults to MODE_NONE.
+ */
+ void ProcessSingle(User* user, Channel* targetchannel, User* targetuser, Modes::ChangeList& changelist, ModeProcessFlag flags = MODE_NONE);
+
/** 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.