diff options
-rw-r--r-- | include/mode.h | 18 | ||||
-rw-r--r-- | src/mode.cpp | 51 |
2 files changed, 66 insertions, 3 deletions
diff --git a/include/mode.h b/include/mode.h index 1c60678c5..9801f503d 100644 --- a/include/mode.h +++ b/include/mode.h @@ -316,6 +316,24 @@ class ModeParser */ bool AddMode(ModeHandler* mh, unsigned const char modeletter); /** + * Add a mode watcher. + * A mode watcher is triggered before and after a mode handler is + * triggered. See the documentation of class ModeWatcher for more + * information. + * @param mw The ModeWatcher you want to add + * @return True if the ModeWatcher was added correctly + */ + bool AddModeWatcher(ModeWatcher* mw); + /** + * Delete a mode watcher. + * A mode watcher is triggered before and after a mode handler is + * triggered. See the documentation of class ModeWatcher for more + * information. + * @param mw The ModeWatcher you want to delete + * @return True if the ModeWatcher was deleted correctly + */ + bool DelModeWatcher(ModeWatcher* mw); + /** * Process a set of mode changes from a server or user. * @param parameters The parameters of the mode change, in the format * they would be from a MODE command. diff --git a/src/mode.cpp b/src/mode.cpp index d17b6f13f..c3153dfee 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -530,17 +530,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; } |