]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Keep lists of mode handlers by type
authorattilamolnar <attilamolnar@hush.com>
Mon, 2 Sep 2013 10:33:28 +0000 (12:33 +0200)
committerattilamolnar <attilamolnar@hush.com>
Thu, 12 Sep 2013 12:44:17 +0000 (14:44 +0200)
include/mode.h
src/mode.cpp
src/modules/m_autoop.cpp
src/modules/m_exemptchanops.cpp

index bfe4041b98bf8e4da9fc1c4d4dac5656546c88c7..68f792f3ac3e6ca9e2f8195eeaadfdb16f8745fa 100644 (file)
@@ -497,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;
@@ -545,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
        {
@@ -676,6 +692,16 @@ 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()
index e89cd72ef35014426ae09de6ebcafee808e60421..4d7f0c655bd387c5d615708f8b73fbd783f39344 100644 (file)
@@ -618,7 +618,13 @@ bool ModeParser::AddMode(ModeHandler* mh)
        if (modehandlers[pos])
                return false;
 
+       // Everything is fine, add the mode
        modehandlers[pos] = mh;
+       if (pm)
+               mhlist.prefix.push_back(pm);
+       else if (mh->IsListModeBase())
+               mhlist.list.push_back(mh->IsListModeBase());
+
        RecreateModeListFor004Numeric();
        return true;
 }
@@ -672,8 +678,12 @@ bool ModeParser::DelMode(ModeHandler* mh)
        }
 
        modehandlers[pos] = NULL;
-       RecreateModeListFor004Numeric();
+       if (mh->IsPrefixMode())
+               mhlist.prefix.erase(std::find(mhlist.prefix.begin(), mhlist.prefix.end(), mh->IsPrefixMode()));
+       else if (mh->IsListModeBase())
+               mhlist.list.erase(std::find(mhlist.list.begin(), mhlist.list.end(), mh->IsListModeBase()));
 
+       RecreateModeListFor004Numeric();
        return true;
 }
 
@@ -722,10 +732,11 @@ void ModeParser::RecreateModeListFor004Numeric()
 
 PrefixMode* ModeParser::FindPrefix(unsigned const char pfxletter)
 {
-       for (unsigned char mode = 'A'; mode <= 'z'; mode++)
+       const PrefixModeList& list = GetPrefixModes();
+       for (PrefixModeList::const_iterator i = list.begin(); i != list.end(); ++i)
        {
-               PrefixMode* pm = FindPrefixMode(mode);
-               if ((pm) && (pm->GetPrefix() == pfxletter))
+               PrefixMode* pm = *i;
+               if (pm->GetPrefix() == pfxletter)
                        return pm;
        }
        return NULL;
@@ -785,10 +796,11 @@ std::string ModeParser::BuildPrefixes(bool lettersAndModes)
        std::string mprefixes;
        std::map<int,std::pair<char,char> > prefixes;
 
-       for (unsigned char mode = 'A'; mode <= 'z'; mode++)
+       const PrefixModeList& list = GetPrefixModes();
+       for (PrefixModeList::const_iterator i = list.begin(); i != list.end(); ++i)
        {
-               PrefixMode* pm = FindPrefixMode(mode);
-               if (pm && pm->GetPrefix())
+               PrefixMode* pm = *i;
+               if (pm->GetPrefix())
                        prefixes[pm->GetPrefixRank()] = std::make_pair(pm->GetPrefix(), pm->GetModeChar());
        }
 
index d195345cafdd8a54c23ea5abd1a8a256a18addc4..a1b72714beba1a23a6d096ee0ce1429dab7e43f8 100644 (file)
@@ -36,10 +36,12 @@ class AutoOpList : public ListModeBase
        {
                if (mid.length() == 1)
                        return ServerInstance->Modes->FindPrefixMode(mid[0]);
-               for(char c='A'; c < 'z'; c++)
+
+               const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
+               for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
                {
-                       PrefixMode* mh = ServerInstance->Modes->FindPrefixMode(c);
-                       if (mh && mh->name == mid)
+                       PrefixMode* mh = *i;
+                       if (mh->name == mid)
                                return mh;
                }
                return NULL;
index 5d89586656fa66e5fe525b005e565ebe2b3a1f2a..a733fa475887a54cd99cf1fe6dc4225efbee3137 100644 (file)
@@ -65,10 +65,12 @@ class ExemptHandler : public HandlerBase3<ModResult, User*, Channel*, const std:
        {
                if (mid.length() == 1)
                        return ServerInstance->Modes->FindPrefixMode(mid[0]);
-               for(char c='A'; c < 'z'; c++)
+
+               const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
+               for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
                {
-                       PrefixMode* mh = ServerInstance->Modes->FindPrefixMode(c);
-                       if (mh && mh->name == mid)
+                       PrefixMode* mh = *i;
+                       if (mh->name == mid)
                                return mh;
                }
                return NULL;