summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mode.cpp26
-rw-r--r--src/modules/m_autoop.cpp8
-rw-r--r--src/modules/m_exemptchanops.cpp8
3 files changed, 29 insertions, 13 deletions
diff --git a/src/mode.cpp b/src/mode.cpp
index e89cd72ef..4d7f0c655 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -618,7 +618,13 @@ bool ModeParser::AddMode(ModeHandler* mh)
if (modehandlers[pos])
return false;
+ // Everything is fine, add the mode
modehandlers[pos] = mh;
+ if (pm)
+ mhlist.prefix.push_back(pm);
+ else if (mh->IsListModeBase())
+ mhlist.list.push_back(mh->IsListModeBase());
+
RecreateModeListFor004Numeric();
return true;
}
@@ -672,8 +678,12 @@ bool ModeParser::DelMode(ModeHandler* mh)
}
modehandlers[pos] = NULL;
- RecreateModeListFor004Numeric();
+ if (mh->IsPrefixMode())
+ mhlist.prefix.erase(std::find(mhlist.prefix.begin(), mhlist.prefix.end(), mh->IsPrefixMode()));
+ else if (mh->IsListModeBase())
+ mhlist.list.erase(std::find(mhlist.list.begin(), mhlist.list.end(), mh->IsListModeBase()));
+ RecreateModeListFor004Numeric();
return true;
}
@@ -722,10 +732,11 @@ void ModeParser::RecreateModeListFor004Numeric()
PrefixMode* ModeParser::FindPrefix(unsigned const char pfxletter)
{
- for (unsigned char mode = 'A'; mode <= 'z'; mode++)
+ const PrefixModeList& list = GetPrefixModes();
+ for (PrefixModeList::const_iterator i = list.begin(); i != list.end(); ++i)
{
- PrefixMode* pm = FindPrefixMode(mode);
- if ((pm) && (pm->GetPrefix() == pfxletter))
+ PrefixMode* pm = *i;
+ if (pm->GetPrefix() == pfxletter)
return pm;
}
return NULL;
@@ -785,10 +796,11 @@ std::string ModeParser::BuildPrefixes(bool lettersAndModes)
std::string mprefixes;
std::map<int,std::pair<char,char> > prefixes;
- for (unsigned char mode = 'A'; mode <= 'z'; mode++)
+ const PrefixModeList& list = GetPrefixModes();
+ for (PrefixModeList::const_iterator i = list.begin(); i != list.end(); ++i)
{
- PrefixMode* pm = FindPrefixMode(mode);
- if (pm && pm->GetPrefix())
+ PrefixMode* pm = *i;
+ if (pm->GetPrefix())
prefixes[pm->GetPrefixRank()] = std::make_pair(pm->GetPrefix(), pm->GetModeChar());
}
diff --git a/src/modules/m_autoop.cpp b/src/modules/m_autoop.cpp
index d195345ca..a1b72714b 100644
--- a/src/modules/m_autoop.cpp
+++ b/src/modules/m_autoop.cpp
@@ -36,10 +36,12 @@ class AutoOpList : public ListModeBase
{
if (mid.length() == 1)
return ServerInstance->Modes->FindPrefixMode(mid[0]);
- for(char c='A'; c < 'z'; c++)
+
+ const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
+ for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
{
- PrefixMode* mh = ServerInstance->Modes->FindPrefixMode(c);
- if (mh && mh->name == mid)
+ PrefixMode* mh = *i;
+ if (mh->name == mid)
return mh;
}
return NULL;
diff --git a/src/modules/m_exemptchanops.cpp b/src/modules/m_exemptchanops.cpp
index 5d8958665..a733fa475 100644
--- a/src/modules/m_exemptchanops.cpp
+++ b/src/modules/m_exemptchanops.cpp
@@ -65,10 +65,12 @@ class ExemptHandler : public HandlerBase3<ModResult, User*, Channel*, const std:
{
if (mid.length() == 1)
return ServerInstance->Modes->FindPrefixMode(mid[0]);
- for(char c='A'; c < 'z'; c++)
+
+ const ModeParser::PrefixModeList& pmlist = ServerInstance->Modes->GetPrefixModes();
+ for (ModeParser::PrefixModeList::const_iterator i = pmlist.begin(); i != pmlist.end(); ++i)
{
- PrefixMode* mh = ServerInstance->Modes->FindPrefixMode(c);
- if (mh && mh->name == mid)
+ PrefixMode* mh = *i;
+ if (mh->name == mid)
return mh;
}
return NULL;