]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
m_showwhois Require 2 parameters for WHOISNOTICE
[user/henk/code/inspircd.git] / src / mode.cpp
index 083445cefba7b00694a3d74ff09e4d6b76430adb..16751e7121d0ca3b7cf1fc6f5cd364d085c03b4a 100644 (file)
 
 
 #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) */
 #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<std::string>& 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<std::string>& 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<std::string> 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<std::string> 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<std::string> 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<std::string> parameters;
                        parameters.push_back(channel->name);
-                       parameters.push_back(moderemove);
+                       parameters.push_back("-");
+                       parameters[1].push_back(this->GetModeChar());
                        ServerInstance->SendMode(parameters, ServerInstance->FakeClient);
                }
        }