]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add a ModeParser::FindMode() overload that takes a mode name and a mode type
authorAttila Molnar <attilamolnar@hush.com>
Thu, 20 Feb 2014 12:34:27 +0000 (13:34 +0100)
committerAttila Molnar <attilamolnar@hush.com>
Thu, 20 Feb 2014 12:34:27 +0000 (13:34 +0100)
include/mode.h
src/mode.cpp
src/modules/m_autoop.cpp
src/modules/m_exemptchanops.cpp
src/modules/m_namedmodes.cpp

index 4b8aa09359fdb2403e5831c96e03acd3172055e3..d3fdabde11f975128f10c63eaf16885c35e69a4c 100644 (file)
@@ -649,6 +649,13 @@ class CoreExport ModeParser
         */
        void Process(const std::vector<std::string>& parameters, User* user, 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.
+        * @return A pointer to a ModeHandler class, or NULL of there isn't a handler for the given mode name.
+        */
+       ModeHandler* FindMode(const std::string& modename, ModeType mt);
+
        /** Find the mode handler for a given mode and type.
         * @param modeletter mode letter to search for
         * @param mt type of mode to search for, user or channel
index e70df5479f7320b85177cbddc6e9d4909e1a77d2..17379b620f78137d9ca812da8fb28c56dd140101 100644 (file)
@@ -708,6 +708,16 @@ bool ModeParser::DelMode(ModeHandler* mh)
        return true;
 }
 
+ModeHandler* ModeParser::FindMode(const std::string& modename, ModeType mt)
+{
+       ModeHandlerMap& mhmap = modehandlersbyname[mt];
+       ModeHandlerMap::const_iterator it = mhmap.find(modename);
+       if (it != mhmap.end())
+               return it->second;
+
+       return NULL;
+}
+
 ModeHandler* ModeParser::FindMode(unsigned const char modeletter, ModeType mt)
 {
        if ((modeletter < 'A') || (modeletter > 'z'))
index 889c3c801aca12e21ff4149043ac3e8c588e0798..828bef14c06bb60ee320cc1a964c91492af3d9dc 100644 (file)
@@ -37,14 +37,8 @@ class AutoOpList : public ListModeBase
                if (mid.length() == 1)
                        return ServerInstance->Modes->FindPrefixMode(mid[0]);
 
-               const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
-               for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
-               {
-                       PrefixMode* mh = *i;
-                       if (mh->name == mid)
-                               return mh;
-               }
-               return NULL;
+               ModeHandler* mh = ServerInstance->Modes->FindMode(mid, MODETYPE_CHANNEL);
+               return mh ? mh->IsPrefixMode() : NULL;
        }
 
        ModResult AccessCheck(User* source, Channel* channel, std::string &parameter, bool adding)
index 7eb13690a19ef46df0ae83d33bfe8148d7410db1..14050430fa3a32df4db026252ed5bcec4f30b382 100644 (file)
@@ -29,10 +29,9 @@ class ExemptChanOps : public ListModeBase
 
        bool ValidateParam(User* user, Channel* chan, std::string &word)
        {
-               // TODO actually make sure there's a prop for this
-               if ((word.length() > 35) || (word.empty()))
+               if (!ServerInstance->Modes->FindMode(word, MODETYPE_CHANNEL))
                {
-                       user->WriteNumeric(955, "%s %s :word is too %s for exemptchanops list", chan->name.c_str(), word.c_str(), (word.empty() ? "short" : "long"));
+                       user->WriteNumeric(955, "%s %s :Mode doesn't exist", chan->name.c_str(), word.c_str());
                        return false;
                }
 
@@ -66,14 +65,8 @@ class ExemptHandler : public HandlerBase3<ModResult, User*, Channel*, const std:
                if (mid.length() == 1)
                        return ServerInstance->Modes->FindPrefixMode(mid[0]);
 
-               const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
-               for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
-               {
-                       PrefixMode* mh = *i;
-                       if (mh->name == mid)
-                               return mh;
-               }
-               return NULL;
+               ModeHandler* mh = ServerInstance->Modes->FindMode(mid, MODETYPE_CHANNEL);
+               return mh ? mh->IsPrefixMode() : NULL;
        }
 
        ModResult Call(User* user, Channel* chan, const std::string& restriction)
index d3f9f94a47871a36ef4455151d664c62b83cf2a6..e8b90caa35176ad30e909e393ab3b6f89c4da794 100644 (file)
@@ -66,17 +66,15 @@ class CommandProp : public Command
                        if (prop[0] == '+' || prop[0] == '-')
                                prop.erase(prop.begin());
 
-                       for(char letter = 'A'; letter <= 'z'; letter++)
+                       ModeHandler* mh = ServerInstance->Modes->FindMode(prop, MODETYPE_CHANNEL);
+                       if (mh)
                        {
-                               ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL);
-                               if (mh && mh->name == prop)
+                               modes[1].push_back(plus ? '+' : '-');
+                               modes[1].push_back(mh->GetModeChar());
+                               if (mh->GetNumParams(plus))
                                {
-                                       modes[1].append((plus ? "+" : "-") + std::string(1, letter));
-                                       if (mh->GetNumParams(plus))
-                                       {
-                                               if (i != parameters.size())
-                                                       modes.push_back(parameters[i++]);
-                                       }
+                                       if (i != parameters.size())
+                                               modes.push_back(parameters[i++]);
                                }
                        }
                }
@@ -143,7 +141,6 @@ class ModuleNamedModes : public Module
                        ModeHandler *mh = ServerInstance->Modes->FindMode(modechar, MODETYPE_CHANNEL);
                        if (modechar == 'Z')
                        {
-                               modechar = 0;
                                std::string name, value;
                                if (param_at < parameters.size())
                                        name = parameters[param_at++];
@@ -153,31 +150,28 @@ class ModuleNamedModes : public Module
                                        value = name.substr(eq + 1);
                                        name = name.substr(0, eq);
                                }
-                               for(char letter = 'A'; modechar == 0 && letter <= 'z'; letter++)
+
+                               mh = ServerInstance->Modes->FindMode(name, MODETYPE_CHANNEL);
+                               if (!mh)
+                               {
+                                       // Mode handler not found
+                                       modelist.erase(i--, 1);
+                                       continue;
+                               }
+
+                               if (mh->GetNumParams(adding))
                                {
-                                       mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL);
-                                       if (mh && mh->name == name)
+                                       if (value.empty())
                                        {
-                                               if (mh->GetNumParams(adding))
-                                               {
-                                                       if (!value.empty())
-                                                       {
-                                                               newparms.push_back(value);
-                                                               modechar = letter;
-                                                               break;
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       modechar = letter;
-                                                       break;
-                                               }
+                                               // Mode needs a parameter but there wasn't one
+                                               modelist.erase(i--, 1);
+                                               continue;
                                        }
+
+                                       newparms.push_back(value);
                                }
-                               if (modechar)
-                                       modelist[i] = modechar;
-                               else
-                                       modelist.erase(i--, 1);
+
+                               modelist[i] = mh->GetModeChar();
                        }
                        else if (mh && mh->GetNumParams(adding) && param_at < parameters.size())
                        {