]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Dont check APrefix both times :p
[user/henk/code/inspircd.git] / src / mode.cpp
index db9641edbb77662b42c2479729d7926577152c9c..83aff70cf56400a4e64d29d89dc26cc196f65948 100644 (file)
@@ -776,6 +776,9 @@ bool ModeParser::DelMode(ModeHandler* mh)
        if (!modehandlers[pos])
                return false;
 
+       /* Note: We can't stack here, as we have modes potentially being removed across many different channels.
+        * To stack here we have to make the algorithm slower. Discuss.
+        */
        switch (mh->GetModeType())
        {
                case MODETYPE_USER:
@@ -879,7 +882,7 @@ ModeHandler* ModeParser::FindPrefix(unsigned const char pfxletter)
        return NULL;
 }
 
-std::string ModeParser::ModeString(User* user, Channel* channel)
+std::string ModeParser::ModeString(User* user, Channel* channel, bool nick_suffix)
 {
        std::string types;
        std::string pars;
@@ -897,14 +900,20 @@ std::string ModeParser::ModeString(User* user, Channel* channel)
                        ret = mh->ModeSet(NULL, user, channel, user->nick);
                        if ((ret.first) && (ret.second == user->nick))
                        {
-                               pars.append(" ");
-                               pars.append(user->nick);
+                               if (nick_suffix)
+                               {
+                                       pars.append(" ");
+                                       pars.append(user->nick);
+                               }
                                types.push_back(mh->GetModeChar());
                        }
                }
        }
 
-       return types+pars;
+       if (nick_suffix)
+               return types+pars;
+       else
+               return types;
 }
 
 std::string ModeParser::ChanModes()
@@ -1042,30 +1051,44 @@ bool ModeParser::DelModeWatcher(ModeWatcher* mw)
 
 /** This default implementation can remove simple user modes
  */
-void ModeHandler::RemoveMode(User* user)
+void ModeHandler::RemoveMode(User* user, irc::modestacker* stack)
 {
        char moderemove[MAXBUF];
        const char* parameters[] = { user->nick, moderemove };
 
        if (user->IsModeSet(this->GetModeChar()))
        {
-               sprintf(moderemove,"-%c",this->GetModeChar());
-               ServerInstance->Parser->CallHandler("MODE", parameters, 2, user);
+               if (stack)
+               {
+                       stack->Push(this->GetModeChar());
+               }
+               else
+               {
+                       sprintf(moderemove,"-%c",this->GetModeChar());
+                       ServerInstance->Parser->CallHandler("MODE", parameters, 2, user);
+               }
        }
 }
 
 /** This default implementation can remove simple channel modes
  * (no parameters)
  */
-void ModeHandler::RemoveMode(Channel* channel)
+void ModeHandler::RemoveMode(Channel* channel, irc::modestacker* stack)
 {
        char moderemove[MAXBUF];
        const char* parameters[] = { channel->name, moderemove };
 
        if (channel->IsModeSet(this->GetModeChar()))
        {
-               sprintf(moderemove,"-%c",this->GetModeChar());
-               ServerInstance->SendMode(parameters, 2, ServerInstance->FakeClient);
+               if (stack)
+               {
+                       stack->Push(this->GetModeChar());
+               }
+               else
+               {
+                       sprintf(moderemove,"-%c",this->GetModeChar());
+                       ServerInstance->SendMode(parameters, 2, ServerInstance->FakeClient);
+               }
        }
 }