]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
Aaaand, fix the typo
[user/henk/code/inspircd.git] / src / mode.cpp
index d17b6f13f8f27766d38fc0ecd7255d6a3c232bbf..791d0f897023d7c23b731628e1ad8734ccb59140 100644 (file)
@@ -63,6 +63,8 @@ using namespace std;
 #include "modes/umode_i.h"
 /* +o (operator) */
 #include "modes/umode_o.h"
+/* +n (notice mask - our implementation of snomasks) */
+#include "modes/umode_n.h"
 
 extern int MODCOUNT;
 extern std::vector<Module*> modules;
@@ -244,8 +246,10 @@ void ModeParser::DisplayCurrentModes(userrec *user, userrec* targetuser, chanrec
        {
                /* Display user's current mode string */
                WriteServ(user->fd,"221 %s :+%s",targetuser->nick,targetuser->FormatModes());
+               WriteServ(user->fd, "008 %s :+%s", targetuser->nick, targetuser->FormatNoticeMasks());
                return;
        }
+
        /* No such nick/channel */
        WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, text);
        return;
@@ -530,17 +534,62 @@ bool ModeParser::AddMode(ModeHandler* mh, unsigned const char modeletter)
         * If they do that, thats their problem, and if i ever EVER see an
         * official InspIRCd developer do that, i'll beat them with a paddle!
         */
-       if ((modeletter < 'A') || (modeletter > 'z'))
+       if ((mh->GetModeChar() < 'A') || (mh->GetModeChar() > 'z'))
                return false;
 
        mh->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL;
-       pos = (modeletter-65) | mask;
+       pos = (mh->GetModeChar()-65) | mask;
 
        if (modehandlers[pos])
                return false;
 
        modehandlers[pos] = mh;
-       log(DEBUG,"ModeParser::AddMode: added mode %c",modeletter);
+       log(DEBUG,"ModeParser::AddMode: added mode %c",mh->GetModeChar());
+       return true;
+}
+
+bool ModeParser::AddModeWatcher(ModeWatcher* mw)
+{
+       unsigned char mask = 0;
+       unsigned char pos = 0;
+
+       if (!mw)
+               return false;
+
+       if ((mw->GetModeChar() < 'A') || (mw->GetModeChar() > 'z'))
+               return false;
+
+       mw->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL;
+       pos = (mw->GetModeChar()-65) | mask;
+
+       modewatchers[pos].push_back(mw);
+       log(DEBUG,"ModeParser::AddModeWatcher: watching mode %c",mw->GetModeChar());
+
+       return true;
+}
+
+bool ModeParser::DelModeWatcher(ModeWatcher* mw)
+{
+       unsigned char mask = 0;
+       unsigned char pos = 0;
+
+       if (!mw)
+               return false;
+
+       if ((mw->GetModeType() < 'A') || (mw->GetModeType() > 'z'))
+               return false;
+
+       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);
+
+       if (a == modewatchers[pos].end())
+               return false;
+
+       modewatchers[pos].erase(a);
+       log(DEBUG,"ModeParser::DelModeWatcher: stopped watching mode %c",mw->GetModeChar());
+
        return true;
 }
 
@@ -575,7 +624,6 @@ ModeParser::ModeParser()
        this->AddMode(new ModeUserWallops, 'w');
        this->AddMode(new ModeUserInvisible, 'i');
        this->AddMode(new ModeUserOperator, 'o');
-
-       /* TODO: User modes +swio */
+       this->AddMode(new ModeUserServerNoticeMask, 'n');
 }