]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Whoops, allow numeric 353 (names list) to be overridden by OnNumeric if we want to
[user/henk/code/inspircd.git] / src / mode.cpp
index 9b90599ceeb587203b8288b4a836df90a07eb79b..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:
@@ -1048,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);
+               }
        }
 }