]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Made SANICK not collide the user (theres no need to in the new 1.1 now we have return...
[user/henk/code/inspircd.git] / src / mode.cpp
index 32ec4e64d38e37da5da34abe00f967789b24ab59..3bdcb1a300cd49448434a240531d8ee09061c883 100644 (file)
@@ -410,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
@@ -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 */