]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_namedmodes.cpp
Fix TBAN not working if the banner is owner/protected
[user/henk/code/inspircd.git] / src / modules / m_namedmodes.cpp
index c113b502ca5f5f5aa90b0f1bd4c98e8096e083ca..638d1d29c7cd8562b4a055e99ed890021549dd0c 100644 (file)
@@ -23,10 +23,9 @@ static void DisplayList(User* user, Channel* channel)
                        continue;
                if (!channel->IsModeSet(letter))
                        continue;
-               std::string item = mh->name;
+               items << " +" << mh->name;
                if (mh->GetNumParams(true))
-                       item += "=" + channel->GetModeParameter(letter);
-               items << item << " ";
+                       items << " " << channel->GetModeParameter(letter);
        }
        char pfx[MAXBUF];
        snprintf(pfx, MAXBUF, ":%s 961 %s %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), channel->name.c_str());
@@ -39,8 +38,7 @@ class CommandProp : public Command
  public:
        CommandProp(Module* parent) : Command(parent, "PROP", 1)
        {
-               syntax = "<user|channel> [{+|-}<mode>[=value]]";
-               TRANSLATE3(TR_TEXT, TR_TEXT, TR_END);
+               syntax = "<user|channel> {[+-]<mode> [<value>]}*";
        }
 
        CmdResult Handle(const std::vector<std::string> &parameters, User *src)
@@ -52,34 +50,33 @@ class CommandProp : public Command
                                DisplayList(src, chan);
                        return CMD_SUCCESS;
                }
-
-               std::string prop = parameters[1], value;
-               std::string::size_type eq = prop.find('=');
-               if (eq != std::string::npos)
+               unsigned int i = 1;
+               std::vector<std::string> modes;
+               modes.push_back(parameters[0]);
+               modes.push_back("");
+               while (i < parameters.size())
                {
-                       value = prop.substr(eq + 1);
-                       prop = prop.substr(0, eq);
-               }
-               bool plus = prop[0] != '-';
-               if (prop[0] == '+' || prop[0] == '-')
-                       prop.erase(prop.begin());
+                       std::string prop = parameters[i++];
+                       bool plus = prop[0] != '-';
+                       if (prop[0] == '+' || prop[0] == '-')
+                               prop.erase(prop.begin());
 
-               for(char letter = 'A'; letter <= 'z'; letter++)
-               {
-                       ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL);
-                       if (mh && mh->name == prop)
+                       for(char letter = 'A'; letter <= 'z'; letter++)
                        {
-                               if (mh->GetNumParams(plus) && value.empty())
-                                       return CMD_FAILURE;
-                               std::vector<std::string> modes;
-                               modes.push_back(parameters[0]);
-                               modes.push_back((plus ? "+" : "-") + std::string(1, letter));
-                               modes.push_back(value);
-                               ServerInstance->SendGlobalMode(modes, src);
-                               return CMD_SUCCESS;
+                               ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL);
+                               if (mh && mh->name == prop)
+                               {
+                                       modes[1].append((plus ? "+" : "-") + std::string(1, letter));
+                                       if (mh->GetNumParams(plus))
+                                       {
+                                               if (i != parameters.size())
+                                                       modes.push_back(parameters[i++]);
+                                       }
+                               }
                        }
                }
-               return CMD_FAILURE;
+               ServerInstance->SendGlobalMode(modes, src);
+               return CMD_SUCCESS;
        }
 };
 
@@ -94,6 +91,7 @@ class ModuleNamedModes : public Module
        void init()
        {
                ServerInstance->Modules->AddService(cmd);
+
                Implementation eventlist[] = { I_OnPreMode, I_On005Numeric };
                ServerInstance->Modules->Attach(eventlist, this, 2);
        }