X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=16751e7121d0ca3b7cf1fc6f5cd364d085c03b4a;hb=6f971a57e52e8f389e47ca5d626da1290a3d3b27;hp=083445cefba7b00694a3d74ff09e4d6b76430adb;hpb=2ab2de1dda8f2043898b9df8004ba5b6c4df7349;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 083445cef..16751e712 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -24,22 +24,18 @@ #include "inspircd.h" -#include "inspstring.h" /* +s (secret) */ -#include "modes/cmode_s.h" /* +p (private) */ -#include "modes/cmode_p.h" -/* +b (bans) */ -#include "modes/cmode_b.h" /* +m (moderated) */ -#include "modes/cmode_m.h" /* +t (only (half) ops can change topic) */ -#include "modes/cmode_t.h" /* +n (no external messages) */ -#include "modes/cmode_n.h" /* +i (invite only) */ -#include "modes/cmode_i.h" +/* +w (see wallops) */ +/* +i (invisible) */ +#include "modes/simplemodes.h" +/* +b (bans) */ +#include "modes/cmode_b.h" /* +k (keyed channel) */ #include "modes/cmode_k.h" /* +l (channel user limit) */ @@ -48,10 +44,6 @@ #include "modes/cmode_o.h" /* +v (channel voice) */ #include "modes/cmode_v.h" -/* +w (see wallops) */ -#include "modes/umode_w.h" -/* +i (invisible) */ -#include "modes/umode_i.h" /* +o (operator) */ #include "modes/umode_o.h" /* +s (server notice masks) */ @@ -395,7 +387,7 @@ void ModeParser::Process(const std::vector& parameters, User *user, LastParseParams.clear(); LastParseTranslate.clear(); - if (!targetchannel && !targetuser) + if ((!targetchannel) && ((!targetuser) || (IS_SERVER(targetuser)))) { user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(),target.c_str()); return; @@ -450,7 +442,7 @@ void ModeParser::Process(const std::vector& parameters, User *user, continue; } - std::string parameter = ""; + std::string parameter; int pcnt = mh->GetNumParams(adding); if (pcnt && param_at == parameters.size()) { @@ -683,15 +675,20 @@ bool ModeParser::DelMode(ModeHandler* mh) switch (mh->GetModeType()) { case MODETYPE_USER: - for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); i++) + for (user_hash::iterator i = ServerInstance->Users->clientlist->begin(); i != ServerInstance->Users->clientlist->end(); ) { - mh->RemoveMode(i->second); + User* user = i->second; + ++i; + mh->RemoveMode(user); } break; case MODETYPE_CHANNEL: - for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); i++) + for (chan_hash::iterator i = ServerInstance->chanlist->begin(); i != ServerInstance->chanlist->end(); ) { - mh->RemoveMode(i->second); + // The channel may not be in the hash after RemoveMode(), see m_permchannels + Channel* chan = i->second; + ++i; + mh->RemoveMode(chan); } break; } @@ -883,7 +880,7 @@ bool ModeParser::DelModeWatcher(ModeWatcher* mw) mw->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL; pos = (mw->GetModeChar()-65) | mask; - ModeWatchIter a = find(modewatchers[pos].begin(),modewatchers[pos].end(),mw); + ModeWatchIter a = std::find(modewatchers[pos].begin(),modewatchers[pos].end(),mw); if (a == modewatchers[pos].end()) { @@ -899,9 +896,6 @@ bool ModeParser::DelModeWatcher(ModeWatcher* mw) */ void ModeHandler::RemoveMode(User* user, irc::modestacker* stack) { - char moderemove[MAXBUF]; - std::vector parameters; - if (user->IsModeSet(this->GetModeChar())) { if (stack) @@ -910,9 +904,10 @@ void ModeHandler::RemoveMode(User* user, irc::modestacker* stack) } else { - sprintf(moderemove,"-%c",this->GetModeChar()); + std::vector parameters; parameters.push_back(user->nick); - parameters.push_back(moderemove); + parameters.push_back("-"); + parameters[1].push_back(this->GetModeChar()); ServerInstance->Modes->Process(parameters, ServerInstance->FakeClient); } } @@ -923,9 +918,6 @@ void ModeHandler::RemoveMode(User* user, irc::modestacker* stack) */ void ModeHandler::RemoveMode(Channel* channel, irc::modestacker* stack) { - char moderemove[MAXBUF]; - std::vector parameters; - if (channel->IsModeSet(this->GetModeChar())) { if (stack) @@ -934,9 +926,10 @@ void ModeHandler::RemoveMode(Channel* channel, irc::modestacker* stack) } else { - sprintf(moderemove,"-%c",this->GetModeChar()); + std::vector parameters; parameters.push_back(channel->name); - parameters.push_back(moderemove); + parameters.push_back("-"); + parameters[1].push_back(this->GetModeChar()); ServerInstance->SendMode(parameters, ServerInstance->FakeClient); } }