X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=3842b01e6ea02301b5d3b86e2221d89948dd1409;hb=84a19a9ab6129deb71cdc24b216b74dd8eb80978;hp=0d08283605b0364006b96a8ead876d603de029f1;hpb=26df84737842a540f9c435f30f714f51121b5b69;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 0d0828360..3842b01e6 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -475,7 +475,7 @@ char* ModeParser::TakeBan(userrec *user,char *dest,chanrec *chan,int status) return NULL; } -void ModeParser::Process(char **parameters, int pcnt, userrec *user) +void ModeParser::Process(char **parameters, int pcnt, userrec *user, bool servermode) { std::string target = parameters[0]; ModeType type = MODETYPE_USER; @@ -499,7 +499,7 @@ void ModeParser::Process(char **parameters, int pcnt, userrec *user) } std::string mode_sequence = parameters[1]; std::string parameter = ""; - std::istringstream parameter_list; + std::ostringstream parameter_list; std::string output_sequence = ""; bool adding = true, state_change = false; int handler_id = 0; @@ -532,16 +532,14 @@ void ModeParser::Process(char **parameters, int pcnt, userrec *user) continue; break; default: - if (state_change) - output_sequence.append(adding ? "+" : "-"); - handler_id = *modeletter-65; - state_change = false; + /* 65 is the ascii value of 'A' */ + handler_id = *modeletter - 65; if (modehandlers[handler_id]) { bool abort = false; - for (std::vector::iterator watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) + for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) { if ((*watchers)->BeforeMode(user, targetuser, targetchannel, parameter, adding, type) == MODEACTION_DENY) abort = true; @@ -562,23 +560,52 @@ void ModeParser::Process(char **parameters, int pcnt, userrec *user) ModeAction ma = modehandlers[handler_id]->OnModeChange(user, targetuser, targetchannel, parameter, adding); if (ma == MODEACTION_ALLOW) { + /* We're about to output a valid mode letter - was there previously a pending state-change? */ + if (state_change) + output_sequence.append(adding ? "+" : "-"); + + /* Add the mode letter */ output_sequence = output_sequence + *modeletter; + /* Is there a valid parameter for this mode? If so add it to the parameter list */ if ((modehandlers[handler_id]->GetNumParams(adding)) && (parameter != "")) { - parameter_list >> " " >> parameter; + parameter_list << " " << parameter; } - for (std::vector::iterator watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) + /* Call all the AfterMode events in the mode watchers for this mode */ + for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++) { (*watchers)->AfterMode(user, targetuser, targetchannel, parameter, adding, type); } + + /* Reset the state change flag */ + state_change = false; } } } break; } } + /* Was there at least one valid mode in the sequence? */ + if (output_sequence != "") + { + if (servermode) + { + if (type == MODETYPE_CHANNEL) + { + WriteChannelWithServ(Config->ServerName,targetchannel,"MODE %s %s%s",targetchannel->name,output_sequence.c_str(),parameter_list.str().c_str()); + } + } + else + { + if (type == MODETYPE_CHANNEL) + { + WriteChannel(targetchannel,user,"MODE %s %s%s",targetchannel->name,output_sequence.c_str(),parameter_list.str().c_str()); + FOREACH_MOD(I_OnMode,OnMode(user, targetchannel, TYPE_CHANNEL, output_sequence + parameter_list.str())); + } + } + } } }