X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=3bdcb1a300cd49448434a240531d8ee09061c883;hb=dc7927e17cffb2ee3c50ef9f037ed873d378f679;hp=6183adfd375ddb69c63c2e01fa1e59c009563c4f;hpb=f01ac8b8963f8676334c6ce39b8e0715d7f84682;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 6183adfd3..3bdcb1a30 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -410,7 +410,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool parameter = parameters[parameter_counter++]; /* Yerk, invalid! */ - if ((parameter.rfind(':') == parameter.begin()) || (parameter.rfind(' ') != std::string::npos)) + if ((parameter.find(':') == 0) || (parameter.rfind(' ') != std::string::npos)) parameter = ""; } else @@ -515,17 +515,6 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool } } - -void cmd_mode::Handle (const char** parameters, int pcnt, userrec *user) -{ - if (!user) - return; - - ServerInstance->Modes->Process(parameters, pcnt, user, false); - - return; -} - void ModeParser::CleanMask(std::string &mask) { std::string::size_type pos_of_pling = mask.find_first_of('!'); @@ -588,6 +577,41 @@ bool ModeParser::AddMode(ModeHandler* mh, unsigned const char modeletter) return true; } +bool ModeParser::DelMode(ModeHandler* mh) +{ + unsigned char mask = 0; + unsigned char pos = 0; + + if ((mh->GetModeChar() < 'A') || (mh->GetModeChar() > 'z')) + return false; + + mh->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL; + pos = (mh->GetModeChar()-65) | mask; + + if (!modehandlers[pos]) + return false; + + switch (mh->GetModeType()) + { + case MODETYPE_USER: + for (user_hash::iterator i = ServerInstance->clientlist.begin(); i != ServerInstance->clientlist.end(); i++) + { + mh->RemoveMode(i->second); + } + break; + case MODETYPE_CHANNEL: + for (chan_hash::iterator i = ServerInstance->chanlist.begin(); i != ServerInstance->chanlist.end(); i++) + { + mh->RemoveMode(i->second); + } + break; + } + + modehandlers[pos] = NULL; + + return true; +} + ModeHandler* ModeParser::FindMode(unsigned const char modeletter, ModeType mt) { unsigned char mask = 0; @@ -816,6 +840,47 @@ bool ModeParser::DelModeWatcher(ModeWatcher* mw) return true; } +/** This default implementation can remove simple user modes + */ +void ModeHandler::RemoveMode(userrec* user) +{ + char moderemove[MAXBUF]; + const char* parameters[] = { user->nick, moderemove }; + + if (user->IsModeSet(this->GetModeChar())) + { + userrec* n = new userrec(ServerInstance); + + sprintf(moderemove,"-%c",this->GetModeChar()); + n->SetFd(FD_MAGIC_NUMBER); + + ServerInstance->SendMode(parameters, 2, n); + + delete n; + } +} + +/** This default implementation can remove simple channel modes + * (no parameters) + */ +void ModeHandler::RemoveMode(chanrec* channel) +{ + char moderemove[MAXBUF]; + const char* parameters[] = { channel->name, moderemove }; + + if (channel->IsModeSet(this->GetModeChar())) + { + userrec* n = new userrec(ServerInstance); + + sprintf(moderemove,"-%c",this->GetModeChar()); + n->SetFd(FD_MAGIC_NUMBER); + + ServerInstance->SendMode(parameters, 2, n); + + delete n; + } +} + ModeParser::ModeParser(InspIRCd* Instance) : ServerInstance(Instance) { /* Clear mode list */