*/
ModeHandler* modehandlers[256];
+ /** Lists of mode handlers by type
+ */
+ struct
+ {
+ /** List of mode handlers that inherit from ListModeBase
+ */
+ std::vector<ListModeBase*> list;
+
+ /** List of mode handlers that inherit from PrefixMode
+ */
+ std::vector<PrefixMode*> prefix;
+ } mhlist;
+
/** Mode watcher classes
*/
std::multimap<std::string, ModeWatcher*> modewatchermap;
std::string Cached004ModeList;
public:
+ typedef std::vector<ListModeBase*> ListModeList;
+ typedef std::vector<PrefixMode*> PrefixModeList;
+
typedef unsigned int ModeProcessFlag;
enum ModeProcessFlags
{
* just the "@%+" part if the parameter false
*/
std::string BuildPrefixes(bool lettersAndModes = true);
+
+ /** Get a list of all mode handlers that inherit from ListModeBase
+ * @return A list containing ListModeBase modes
+ */
+ const ListModeList& GetListModes() const { return mhlist.list; }
+
+ /** Get a list of all prefix modes
+ * @return A list containing all prefix modes
+ */
+ const PrefixModeList& GetPrefixModes() const { return mhlist.prefix; }
};
inline const std::string& ModeParser::GetModeListFor004Numeric()
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;
}
}
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;
}
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;
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());
}
{
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;
{
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;