X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=f4e5e8a60bdd95a2936d6393d23b82a3c84d60a8;hb=19487dbebc520450e457472b97d9e7bcd5160c00;hp=a6b10475deed9747ab848a0ef91f8c105e913a13;hpb=3d8ec5dbd9cfde34fcbc63ad7b9b1369866f0a33;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index a6b10475d..f4e5e8a60 100644 --- a/include/mode.h +++ b/include/mode.h @@ -70,12 +70,15 @@ enum PrefixModeValue OP_VALUE = 30000 }; -/** - * Used by ModeHandler::ModeSet() to return the state of a mode upon a channel or user. - * The pair contains an activity flag, true if the mode is set with the given parameter, - * and the parameter of the mode (or the parameter provided) in the std::string. - */ -typedef std::pair ModePair; +enum ParamSpec +{ + /** No parameters */ + PARAM_NONE, + /** Parameter required on mode setting only */ + PARAM_SETONLY, + /** Parameter always required */ + PARAM_ALWAYS +}; /** Each mode is implemented by ONE ModeHandler class. * You must derive ModeHandler and add the child class to @@ -95,21 +98,29 @@ class CoreExport ModeHandler : public classbase { protected: /** - * Creator/owner pointer + * The mode parameter translation type + */ + TranslateType m_paramtype; + + /** What kind of parameters does the mode take? */ - InspIRCd* ServerInstance; + ParamSpec parameters_taken; + /** * The mode letter you're implementing. */ - char mode; - /** - * Number of parameters when being set + const char mode; + + /** Mode prefix, or 0 */ - int n_params_on; + char prefix; + /** - * Number of parameters when being unset + * True if the mode requires oper status + * to set. */ - int n_params_off; + bool oper; + /** * Mode is a 'list' mode. The behaviour * of your mode is now set entirely within @@ -121,24 +132,12 @@ class CoreExport ModeHandler : public classbase * (e.g. banlists, etc) */ bool list; + /** * The mode type, either MODETYPE_USER or * MODETYPE_CHANNEL. */ ModeType m_type; - /** - * The mode parameter translation type - */ - TranslateType m_paramtype; - /** - * True if the mode requires oper status - * to set. - */ - bool oper; - - /** Mode prefix, or 0 - */ - char prefix; /** Number of items with this mode set on them */ @@ -147,36 +146,26 @@ class CoreExport ModeHandler : public classbase /** The prefix char needed on channel to use this mode, * only checked for channel modes */ - char prefixneeded; + int levelrequired; public: /** Module that created this mode. NULL for core modes */ - Module* creator; + ModuleRef creator; + /** Long-form name + */ + const std::string name; /** * The constructor for ModeHandler initalizes the mode handler. * The constructor of any class you derive from ModeHandler should * probably call this constructor with the parameters set correctly. + * @param name A one-word name for the mode * @param modeletter The mode letter you wish to handle - * @param parameters_on The number of parameters your mode takes when being set. Note that any nonzero value is treated as 1. - * @param parameters_off The number of parameters your mode takes when being unset. Note that any nonzero value is treated as 1. - * @param listmode Set to true if your mode is a listmode, e.g. it will respond to MODE #channel +modechar with a list of items - * @param ModeType Set this to MODETYPE_USER for a usermode, or MODETYPE_CHANNEL for a channelmode. - * @param operonly Set this to true if only opers should be allowed to set or unset the mode. - * @param mprefix For listmodes where parameters are NICKNAMES which are on the channel (for example, +ohv), you may define a prefix. - * When you define a prefix, it can be returned in NAMES, WHO etc if it has the highest value (as returned by GetPrefixRank()) - * In the core, the only modes to implement prefixes are +ovh (ops, voice, halfop) which define the prefix characters @, % and + - * and the rank values OP_VALUE, HALFOP_VALUE and VOICE_VALUE respectively. Any prefixes you define should have unique values proportional - * to these three defaults or proportional to another mode in a module you depend on. See src/cmode_o.cpp as an example. - * @param prefixrequired The prefix required to change this mode - * @param translate The translation type for the argument(s) of this mode - */ - ModeHandler(InspIRCd* Instance, Module* me, char modeletter, int parameters_on, int parameters_off, - bool listmode, ModeType type, bool operonly, char mprefix = 0, - char prefixrequired = '%', TranslateType translate = TR_TEXT); - /** - * The default destructor does nothing + * @param params Parameters taken by the mode + * @param type Type of the mode (MODETYPE_USER or MODETYPE_CHANNEL) */ + ModeHandler(Module* me, const std::string& name, char modeletter, ParamSpec params, ModeType type); + virtual CullResult cull(); virtual ~ModeHandler(); /** * Returns true if the mode is a list mode @@ -187,7 +176,7 @@ class CoreExport ModeHandler : public classbase * also implement GetPrefixRank() to return an integer * value for this mode prefix. */ - char GetPrefix(); + inline char GetPrefix() const { return prefix; } /** Get number of items with this mode set on them */ virtual unsigned int GetCount(); @@ -205,15 +194,15 @@ class CoreExport ModeHandler : public classbase /** * Returns the mode's type */ - ModeType GetModeType(); + inline ModeType GetModeType() const { return m_type; } /** * Returns the mode's parameter translation type */ - TranslateType GetTranslateType(); + inline TranslateType GetTranslateType() const { return m_paramtype; } /** * Returns true if the mode can only be set/unset by an oper */ - bool NeedsOper(); + inline bool NeedsOper() const { return oper; } /** * Returns the number of parameters for the mode. Any non-zero * value should be considered to be equivalent to one. @@ -231,6 +220,16 @@ class CoreExport ModeHandler : public classbase */ virtual std::string GetUserParameter(User* useor); + /** + * Called when a channel mode change access check for your mode occurs. + * @param source Contains the user setting the mode. + * @param channel contains the destination channel the modes are being set on. + * @param parameter The parameter for your mode. This is modifiable. + * @param adding This value is true when the mode is being set, or false when it is being unset. + * @return allow, deny, or passthru to check against the required level + */ + virtual ModResult AccessCheck(User* source, Channel* channel, std::string ¶meter, bool adding); + /** * Called when a mode change for your mode occurs. * @param source Contains the user setting the mode. @@ -277,22 +276,7 @@ class CoreExport ModeHandler : public classbase * @param channel The channel we are checking against * @return True if the other side wins the merge, false if we win the merge for this mode. */ - virtual bool CheckTimeStamp(std::string &their_param, const std::string &our_param, Channel* channel); - - /** - * When a remote server needs to bounce a set of modes, it will call this method for every mode - * in the mode string to determine if the mode is set or not. - * @param source of the mode change, this will be NULL for a server mode - * @param dest Target user of the mode change, if this is a user mode - * @param channel Target channel of the mode change, if this is a channel mode - * @param parameter The parameter given for the mode change, or an empty string - * @returns The first value of the pair should be true if the mode is set with the given parameter. - * In the case of permissions modes such as channelmode +o, this should return true if the user given - * as the parameter has the given privilage on the given channel. The string value of the pair will hold - * the current setting for this mode set locally, when the bool is true, or, the parameter given. - * This allows the local server to enforce our locally set parameters back to a remote server. - */ - virtual ModePair ModeSet(User* source, User* dest, Channel* channel, const std::string ¶meter); + virtual bool ResolveModeConflict(std::string &their_param, const std::string &our_param, Channel* channel); /** * When a MODETYPE_USER mode handler is being removed, the server will call this method for every user on the server. @@ -314,9 +298,7 @@ class CoreExport ModeHandler : public classbase */ virtual void RemoveMode(Channel* channel, irc::modestacker* stack = NULL); - char GetNeededPrefix(); - - void SetNeededPrefix(char needsprefix); + inline unsigned int GetLevelRequired() const { return levelrequired; } }; /** A prebuilt mode handler which handles a simple user mode, e.g. no parameters, usable by any user, with no extra @@ -327,8 +309,8 @@ class CoreExport ModeHandler : public classbase class CoreExport SimpleUserModeHandler : public ModeHandler { public: - SimpleUserModeHandler(InspIRCd* Instance, Module* Creator, char modeletter) - : ModeHandler(Instance, Creator, modeletter, 0, 0, false, MODETYPE_USER, false) {} + SimpleUserModeHandler(Module* Creator, const std::string& Name, char modeletter) + : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_USER) {} virtual ~SimpleUserModeHandler() {} virtual ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); }; @@ -341,8 +323,8 @@ class CoreExport SimpleUserModeHandler : public ModeHandler class CoreExport SimpleChannelModeHandler : public ModeHandler { public: - SimpleChannelModeHandler(InspIRCd* Instance, Module* Creator, char modeletter) - : ModeHandler(Instance, Creator, modeletter, 0, 0, false, MODETYPE_CHANNEL, false) {} + SimpleChannelModeHandler(Module* Creator, const std::string& Name, char modeletter) + : ModeHandler(Creator, Name, modeletter, PARAM_NONE, MODETYPE_CHANNEL) {} virtual ~SimpleChannelModeHandler() {} virtual ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); }; @@ -356,10 +338,6 @@ class CoreExport SimpleChannelModeHandler : public ModeHandler class CoreExport ModeWatcher : public classbase { protected: - /** - * Creator/owner pointer - */ - InspIRCd* ServerInstance; /** * The mode letter this class is watching */ @@ -370,10 +348,11 @@ class CoreExport ModeWatcher : public classbase ModeType m_type; public: + ModuleRef creator; /** * The constructor initializes the mode and the mode type */ - ModeWatcher(InspIRCd* Instance, char modeletter, ModeType type); + ModeWatcher(Module* creator, char modeletter, ModeType type); /** * The default destructor does nothing. */ @@ -424,13 +403,9 @@ typedef std::vector::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 : public classbase +class CoreExport ModeParser { private: - /** - * Creator/owner pointer - */ - InspIRCd* ServerInstance; /** 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 @@ -471,19 +446,13 @@ class CoreExport ModeParser : public classbase /** The constructor initializes all the RFC basic modes by using ModeParserAddMode(). */ - ModeParser(InspIRCd* Instance); + ModeParser(); ~ModeParser(); /** Used to check if user 'd' should be allowed to do operation 'MASK' on channel 'chan'. * for example, should 'user A' be able to 'op' on 'channel B'. */ User* SanityChecks(User *user,const char *dest,Channel *chan,int status); - /** Grant a built in privilage (e.g. ops, halfops, voice) to a user on a channel - */ - const char* Grant(User *d,Channel *chan,int MASK); - /** Revoke a built in privilage (e.g. ops, halfops, voice) to a user on a channel - */ - const char* Revoke(User *d,Channel *chan,int MASK); /** Tidy a banmask. This makes a banmask 'acceptable' if fields are left out. * E.g. * @@ -519,6 +488,7 @@ class CoreExport ModeParser : public classbase * @return True if the mode was successfully removed. */ bool DelMode(ModeHandler* mh); + /** Add a mode watcher. * A mode watcher is triggered before and after a mode handler is * triggered. See the documentation of class ModeWatcher for more @@ -581,25 +551,12 @@ class CoreExport ModeParser : public classbase */ std::string GiveModeList(ModeMasks m); - /** Used by this class internally during std::sort and 005 generation - */ - static bool PrefixComparison(prefixtype one, prefixtype two); - - /** This returns the PREFIX=(ohv)@%+ section of the 005 numeric. - */ - std::string BuildPrefixes(); + static bool PrefixComparison(ModeHandler* one, ModeHandler* two); - /** This returns the privilages of a user upon a channel, in the format of a mode change. - * For example, if a user has privilages +avh, this will return the string "avh nick nick nick". - * This is used by the core when cycling a user to refresh their hostname. You may use it for - * similar purposes. - * @param user The username to look up - * @param channel The channel name to look up the privilages of the user for - * @param nick_suffix true (the default) if you want nicknames in the mode string, for easy - * use with the mode stacker, false if you just want the "avh" part of "avh nick nick nick". - * @return The mode string. + /** This returns the PREFIX=(ohv)@%+ section of the 005 numeric, or + * just the "@%+" part if the parameter false */ - std::string ModeString(User* user, Channel* channel, bool nick_suffix = true); + std::string BuildPrefixes(bool lettersAndModes = true); }; #endif