X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fmode.h;h=87d79c7d563902a4954a54690a3e0d58881d0348;hb=ab8305ad99d7bb7d2cfe4154b2deb007546d5b70;hp=c0cb5b0fc15308c21b3a137a48bc8ff878427ad7;hpb=6eae25cd36a95adff860ebc6b109676a7f3bcd5c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/mode.h b/include/mode.h index c0cb5b0fc..87d79c7d5 100644 --- a/include/mode.h +++ b/include/mode.h @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -14,11 +14,7 @@ #ifndef __MODE_H #define __MODE_H -/* Forward declarations. */ -class User; - #include "ctables.h" -#include "channels.h" /** * Holds the values for different type of modes @@ -80,13 +76,6 @@ enum ParamSpec PARAM_ALWAYS }; -/** - * 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; - /** Each mode is implemented by ONE ModeHandler class. * You must derive ModeHandler and add the child class to * the list of modes handled by the ircd, using @@ -101,17 +90,33 @@ typedef std::pair ModePair; * mode is expected to have a parameter, then this is * equivalent to returning MODEACTION_DENY. */ -class CoreExport ModeHandler : public classbase +class CoreExport ModeHandler : public ServiceProvider { protected: /** - * The mode letter you're implementing. + * The mode parameter translation type */ - char mode; + TranslateType m_paramtype; /** What kind of parameters does the mode take? */ ParamSpec parameters_taken; + + /** + * The mode letter you're implementing. + */ + char mode; + + /** Mode prefix, or 0 + */ + char prefix; + + /** + * True if the mode requires oper status + * to set. + */ + bool oper; + /** * Mode is a 'list' mode. The behaviour * of your mode is now set entirely within @@ -123,28 +128,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 - */ - unsigned int count; /** The prefix char needed on channel to use this mode, * only checked for channel modes @@ -152,30 +141,17 @@ class CoreExport ModeHandler : public classbase int levelrequired; public: - /** Module that created this mode. NULL for core modes */ - Module* creator; - /** * 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 - */ - ModeHandler(Module* me, char modeletter, ParamSpec params, ModeType type); - /** - * 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,12 +163,6 @@ class CoreExport ModeHandler : public classbase * value for this mode prefix. */ inline char GetPrefix() const { return prefix; } - /** Get number of items with this mode set on them - */ - virtual unsigned int GetCount(); - /** Adjust usage count returned by GetCount - */ - virtual void ChangeCount(int modifier); /** * Get the 'value' of this modes prefix. * determines which to display when there are multiple. @@ -224,7 +194,7 @@ class CoreExport ModeHandler : public classbase * Returns the mode character this handler handles. * @return The mode character */ - char GetModeChar(); + inline char GetModeChar() { return mode; } /** For user modes, return the current parameter, if any */ @@ -286,22 +256,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. @@ -334,8 +289,8 @@ class CoreExport ModeHandler : public classbase class CoreExport SimpleUserModeHandler : public ModeHandler { public: - SimpleUserModeHandler(Module* Creator, char modeletter) - : ModeHandler(Creator, modeletter, PARAM_NONE, MODETYPE_USER) {} + 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); }; @@ -348,12 +303,22 @@ class CoreExport SimpleUserModeHandler : public ModeHandler class CoreExport SimpleChannelModeHandler : public ModeHandler { public: - SimpleChannelModeHandler(InspIRCd* Instance, Module* Creator, char modeletter) - : ModeHandler(Creator, modeletter, PARAM_NONE, MODETYPE_CHANNEL) {} + 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); }; +class CoreExport ParamChannelModeHandler : public ModeHandler +{ + public: + ParamChannelModeHandler(Module* Creator, const std::string& Name, char modeletter) + : ModeHandler(Creator, Name, modeletter, PARAM_SETONLY, MODETYPE_CHANNEL) {} + virtual ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding); + /** Validate the parameter - you may change the value to normalize it. Return true if it is valid. */ + virtual bool ParamValidate(std::string& parameter); +}; + /** * The ModeWatcher class can be used to alter the behaviour of a mode implemented * by the core or by another module. To use ModeWatcher, derive a class from it, @@ -363,10 +328,6 @@ class CoreExport SimpleChannelModeHandler : public ModeHandler class CoreExport ModeWatcher : public classbase { protected: - /** - * Creator/owner pointer - */ - InspIRCd* ServerInstance; /** * The mode letter this class is watching */ @@ -377,10 +338,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. */ @@ -431,7 +393,7 @@ 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: /** Mode handlers for each mode, to access a handler subtract @@ -474,7 +436,7 @@ 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'. @@ -516,6 +478,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 @@ -580,21 +543,10 @@ class CoreExport ModeParser : public classbase static bool PrefixComparison(ModeHandler* one, ModeHandler* two); - /** This returns the PREFIX=(ohv)@%+ section of the 005 numeric. - */ - std::string BuildPrefixes(); - - /** 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