X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=2833d75a2cd8504c19661ea8c5f02bb9f1e81f6f;hb=3d958279c6c4d352132ea50836a2b7b1d3be5434;hp=d71423ecff5e2e54cb7c35244d69df9a51afc831;hpb=1b6dda7ad54dd0242cd9eac30f167d76f061d2fa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index d71423ecf..2833d75a2 100644 --- a/include/mode.h +++ b/include/mode.h @@ -23,6 +23,7 @@ #pragma once #include "ctables.h" +#include "modechange.h" /** * Holds the values for different type of modes @@ -110,11 +111,6 @@ class CoreExport ModeHandler : public ServiceProvider Id modeid; protected: - /** - * The mode parameter translation type - */ - TranslateType m_paramtype; - /** What kind of parameters does the mode take? */ ParamSpec parameters_taken; @@ -199,10 +195,6 @@ class CoreExport ModeHandler : public ServiceProvider * 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 */ @@ -344,8 +336,10 @@ class CoreExport PrefixMode : public ModeHandler * @param Creator The module creating this mode * @param Name The user-friendly one word name of the prefix mode, e.g.: "op", "voice" * @param ModeLetter The mode letter of this mode + * @param Rank Rank given by this prefix mode, see explanation above + * @param PrefixChar Prefix character, or 0 if the mode has no prefix character */ - PrefixMode(Module* Creator, const std::string& Name, char ModeLetter); + PrefixMode(Module* Creator, const std::string& Name, char ModeLetter, unsigned int Rank = 0, char PrefixChar = 0); /** * Handles setting and unsetting the prefix mode. @@ -486,20 +480,20 @@ typedef std::multimap::iterator ModeWatchIter; * parses client to server MODE strings for user and channel modes, and performs * processing for the 004 mode list numeric, amongst other things. */ -class CoreExport ModeParser +class CoreExport ModeParser : public fakederef { public: static const ModeHandler::Id MODEID_MAX = 64; + /** Type of the container that maps mode names to ModeHandlers + */ + typedef TR1NS::unordered_map ModeHandlerMap; + private: /** Last item in the ModeType enum */ static const unsigned int MODETYPE_LAST = 2; - /** Type of the container that maps mode names to ModeHandlers - */ - typedef TR1NS::unordered_map ModeHandlerMap; - /** Mode handlers for each mode, to access a handler subtract * 65 from the ascii value of the mode letter. * The upper bit of the value indicates if its a usermode @@ -532,6 +526,10 @@ class CoreExport ModeParser */ std::multimap modewatchermap; + /** Last processed mode change + */ + Modes::ChangeList LastChangeList; + /** Displays the current modes of a channel or user. * Used by ModeParser::Process. */ @@ -539,12 +537,12 @@ class CoreExport ModeParser /** 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. @@ -570,8 +568,6 @@ class CoreExport ModeParser * Use GetLastParse() to get this value, to be used for display purposes. */ std::string LastParse; - std::vector LastParseParams; - std::vector LastParseTranslate; unsigned int sent[256]; @@ -601,11 +597,19 @@ class CoreExport ModeParser */ 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(); @@ -635,12 +639,12 @@ class CoreExport ModeParser * @return Last parsed string, as seen by users. */ const std::string& GetLastParse() const { return LastParse; } - const std::vector& GetLastParseParams() { return LastParseParams; } - const std::vector& GetLastParseTranslate() { return LastParseTranslate; } + /** Add a mode to the mode parser. - * @return True if the mode was successfully added. + * Throws a ModuleException if the mode cannot be added. */ - bool AddMode(ModeHandler* mh); + void AddMode(ModeHandler* mh); + /** Delete a mode from the mode parser. * When a mode is deleted, the mode handler will be called * for every user (if it is a user mode) or for every channel @@ -676,6 +680,18 @@ class CoreExport ModeParser */ void Process(const std::vector& 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. @@ -733,6 +749,12 @@ class CoreExport ModeParser * @return A list containing all prefix modes */ const PrefixModeList& GetPrefixModes() const { return mhlist.prefix; } + + /** Get a mode name -> ModeHandler* map containing all modes of the given type + * @param mt Type of modes to return, MODETYPE_USER or MODETYPE_CHANNEL + * @return A map of mode handlers of the given type + */ + const ModeHandlerMap& GetModes(ModeType mt) const { return modehandlersbyname[mt]; } }; inline const std::string& ModeParser::GetModeListFor004Numeric()