X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=3bdcb1a300cd49448434a240531d8ee09061c883;hb=dc7927e17cffb2ee3c50ef9f037ed873d378f679;hp=8351ab2e0bde21d22a941a54e8d10a2a12c5b62d;hpb=272349a3e921ac880ad94f09508160915f7ffe9c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 8351ab2e0..3bdcb1a30 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -16,17 +16,10 @@ using namespace std; -#include "inspircd_config.h" #include "inspircd.h" -#include "configreader.h" -#include -#include "hash_map.h" -#include "connection.h" #include "users.h" #include "modules.h" #include "inspstring.h" - -#include "commands.h" #include "mode.h" /* +s (secret) */ @@ -53,7 +46,6 @@ using namespace std; #include "modes/cmode_h.h" /* +v (channel voice) */ #include "modes/cmode_v.h" - /* +s (server notices) */ #include "modes/umode_s.h" /* +w (see wallops) */ @@ -259,7 +251,8 @@ void ModeParser::DisplayCurrentModes(userrec *user, userrec* targetuser, chanrec { /* Display user's current mode string */ user->WriteServ("221 %s :+%s",targetuser->nick,targetuser->FormatModes()); - user->WriteServ("008 %s :+%s", targetuser->nick, targetuser->FormatNoticeMasks()); + if (*targetuser->oper) + user->WriteServ("008 %s +%s :Server notice mask", targetuser->nick, targetuser->FormatNoticeMasks()); return; } @@ -417,7 +410,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool parameter = parameters[parameter_counter++]; /* Yerk, invalid! */ - if ((parameter.rfind(':') != std::string::npos) || (parameter.rfind(' ') != std::string::npos)) + if ((parameter.find(':') == 0) || (parameter.rfind(' ') != std::string::npos)) parameter = ""; } else @@ -431,7 +424,12 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool * eat any parameter that came with the mode, and continue to next */ if ((IS_LOCAL(user)) && (modehandlers[handler_id]->NeedsOper()) && (!*user->oper)) + { + user->WriteServ("481 %s :Permission Denied- Only IRC operators may %sset %s mode %c", user->nick, + adding ? "" : "un", type == MODETYPE_CHANNEL ? "channel" : "user", + modehandlers[handler_id]->GetModeChar()); continue; + } /* Call the handler for the mode */ ModeAction ma = modehandlers[handler_id]->OnModeChange(user, targetuser, targetchannel, parameter, adding); @@ -496,7 +494,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool } else { - targetuser->WriteServ("MODE %s %s",targetuser->nick,output_sequence.c_str()); + targetuser->WriteServ("MODE %s %s%s",targetuser->nick,output_sequence.c_str(), parameter_list.str().c_str()); } } else @@ -509,7 +507,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool } else { - user->WriteTo(targetuser,"MODE %s %s",targetuser->nick,output_sequence.c_str()); + user->WriteTo(targetuser,"MODE %s %s%s",targetuser->nick,output_sequence.c_str(), parameter_list.str().c_str()); FOREACH_MOD(I_OnMode,OnMode(user, targetuser, TYPE_USER, output_sequence)); } } @@ -517,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('!'); @@ -590,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; @@ -666,6 +688,31 @@ ModeHandler* ModeParser::FindPrefix(unsigned const char pfxletter) return NULL; } +std::string ModeParser::ModeString(userrec* user, chanrec* channel) +{ + std::string types; + std::string pars; + + for (unsigned char mode = 'A'; mode <= 'z'; mode++) + { + unsigned char pos = (mode-65) | MASK_CHANNEL; + ModeHandler* mh = modehandlers[pos]; + if ((mh) && (mh->GetNumParams(true)) && (mh->GetNumParams(false))) + { + ModePair ret; + ret = mh->ModeSet(NULL, user, channel, user->nick); + if (ret.first) + { + pars.append(" "); + pars.append(user->nick); + types.push_back(mh->GetModeChar()); + } + } + } + + return types+pars; +} + std::string ModeParser::ChanModes() { std::string type1; /* Listmodes EXCEPT those with a prefix */ @@ -793,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 */