]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/mode.h
ProtocolInterface::SendEncapsulatedData() changes
[user/henk/code/inspircd.git] / include / mode.h
index 8c3e875f3a5281f6b10debd535224e1582422e40..9a5091e76a59f7bdbadc7f771e6652a10601e607 100644 (file)
@@ -84,6 +84,9 @@ enum ParamSpec
        PARAM_ALWAYS
 };
 
+class PrefixMode;
+class ListModeBase;
+
 /** 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
@@ -104,6 +107,7 @@ class CoreExport ModeHandler : public ServiceProvider
        enum Class
        {
                MC_PREFIX,
+               MC_LIST,
                MC_OTHER
        };
 
@@ -122,10 +126,6 @@ class CoreExport ModeHandler : public ServiceProvider
         */
        char mode;
 
-       /** Mode prefix, or 0
-        */
-       char prefix;
-
        /**
         * True if the mode requires oper status
         * to set.
@@ -159,11 +159,6 @@ class CoreExport ModeHandler : public ServiceProvider
         */
        int levelrequired;
 
-       /** The prefix rank of this mode, used to compare prefix
-        * modes
-        */
-       unsigned int prefixrank;
-
  public:
        /**
         * The constructor for ModeHandler initalizes the mode handler.
@@ -183,20 +178,19 @@ class CoreExport ModeHandler : public ServiceProvider
         * Returns true if the mode is a list mode
         */
        bool IsListMode() const { return list; }
+
        /**
-        * Mode prefix or 0. If this is defined, you should
-        * also implement GetPrefixRank() to return an integer
-        * value for this mode prefix.
+        * Check whether this mode is a prefix mode
+        * @return non-NULL if this mode is a prefix mode, NULL otherwise
         */
-       inline char GetPrefix() const { return prefix; }
+       PrefixMode* IsPrefixMode();
+
        /**
-        * Get the 'value' of this modes prefix.
-        * determines which to display when there are multiple.
-        * The mode with the highest value is ranked first. See the
-        * PrefixModeValue enum and Channel::GetPrefixValue() for
-        * more information.
+        * Check whether this mode handler inherits from ListModeBase
+        * @return non-NULL if this mode handler inherits from ListModeBase, NULL otherwise
         */
-       unsigned int GetPrefixRank() const { return prefixrank; }
+       ListModeBase* IsListModeBase();
+
        /**
         * Returns the mode's type
         */
@@ -320,8 +314,19 @@ class CoreExport ModeHandler : public ServiceProvider
  * for example changing the topic on a channel having +t set requires a rank that is >= than the rank of a halfop,
  * but there is no such restriction when +t isn't set.
  */
-class PrefixMode : public ModeHandler
+class CoreExport PrefixMode : public ModeHandler
 {
+ protected:
+       /** The prefix character granted by this mode. '@' for op, '+' for voice, etc.
+        * If 0, this mode does not have a visible prefix character.
+        */
+       char prefix;
+
+       /** The prefix rank of this mode, used to compare prefix
+        * modes
+        */
+       unsigned int prefixrank;
+
  public:
        /**
         * Constructor
@@ -352,6 +357,22 @@ class PrefixMode : public ModeHandler
         * @param stack The mode stack to add the mode change to
         */
        void RemoveMode(Channel* chan, irc::modestacker& stack);
+
+       /**
+        * Mode prefix or 0. If this is defined, you should
+        * also implement GetPrefixRank() to return an integer
+        * value for this mode prefix.
+        */
+       char GetPrefix() const { return prefix; }
+
+       /**
+        * Get the 'value' of this modes prefix.
+        * determines which to display when there are multiple.
+        * The mode with the highest value is ranked first. See the
+        * PrefixModeValue enum and Channel::GetPrefixValue() for
+        * more information.
+        */
+       unsigned int GetPrefixRank() const { return prefixrank; }
 };
 
 /** A prebuilt mode handler which handles a simple user mode, e.g. no parameters, usable by any user, with no extra
@@ -476,6 +497,19 @@ class CoreExport ModeParser
         */
        ModeHandler* modehandlers[256];
 
+       /** Lists of mode handlers by type
+        */
+       struct
+       {
+               /** List of mode handlers that inherit from ListModeBase
+                */
+               std::vector<ListModeBase*> list;
+
+               /** List of mode handlers that inherit from PrefixMode
+                */
+               std::vector<PrefixMode*> prefix;
+       } mhlist;
+
        /** Mode watcher classes
         */
        std::multimap<std::string, ModeWatcher*> modewatchermap;
@@ -524,6 +558,9 @@ class CoreExport ModeParser
        std::string Cached004ModeList;
 
  public:
+       typedef std::vector<ListModeBase*> ListModeList;
+       typedef std::vector<PrefixMode*> PrefixModeList;
+
        typedef unsigned int ModeProcessFlag;
        enum ModeProcessFlags
        {
@@ -622,12 +659,18 @@ class CoreExport ModeParser
         */
        ModeHandler* FindMode(unsigned const char modeletter, ModeType mt);
 
+       /** Find the mode handler for the given prefix mode
+        * @param modeletter The mode letter to search for
+        * @return A pointer to the PrefixMode or NULL if the mode wasn't found or it isn't a prefix mode
+        */
+       PrefixMode* FindPrefixMode(unsigned char modeletter);
+
        /** Find a mode handler by its prefix.
         * If there is no mode handler with the given prefix, NULL will be returned.
         * @param pfxletter The prefix to find, e.g. '@'
         * @return The mode handler which handles this prefix, or NULL if there is none.
         */
-       ModeHandler* FindPrefix(unsigned const char pfxletter);
+       PrefixMode* FindPrefix(unsigned const char pfxletter);
 
        /** Returns a list of modes, space seperated by type:
         * 1. User modes
@@ -649,9 +692,29 @@ class CoreExport ModeParser
         * just the "@%+" part if the parameter false
         */
        std::string BuildPrefixes(bool lettersAndModes = true);
+
+       /** Get a list of all mode handlers that inherit from ListModeBase
+        * @return A list containing ListModeBase modes
+        */
+       const ListModeList& GetListModes() const { return mhlist.list; }
+
+       /** Get a list of all prefix modes
+        * @return A list containing all prefix modes
+        */
+       const PrefixModeList& GetPrefixModes() const { return mhlist.prefix; }
 };
 
 inline const std::string& ModeParser::GetModeListFor004Numeric()
 {
        return Cached004ModeList;
 }
+
+inline PrefixMode* ModeHandler::IsPrefixMode()
+{
+       return (this->type_id == MC_PREFIX ? static_cast<PrefixMode*>(this) : NULL);
+}
+
+inline ListModeBase* ModeHandler::IsListModeBase()
+{
+       return (this->type_id == MC_LIST ? reinterpret_cast<ListModeBase*>(this) : NULL);
+}