X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=83aff70cf56400a4e64d29d89dc26cc196f65948;hb=f2078a777e1032d7bd237b165bc93404fe6c7734;hp=9b90599ceeb587203b8288b4a836df90a07eb79b;hpb=5b4e92cc2ca9a08a1a9740daa25c64578325ed78;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 9b90599ce..83aff70cf 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -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); + } } }